一篇极好的Git 总结

简单的,常用的命令也就几个。但是想非常熟练使用,怕是要记住几十个。

img

Workspace:工作区(clone或者原始内容)

Index/Stage:暂存区(有增删改查后add到临时区)

Repository:本地仓库(保存了本地的增删改查记录)

Remote:远程仓库(git.code.oa.com,本地的记录提交到远端,供团队所有人查看使用)

有意思的事 代码更新之Fetch vs Pull

二者都是从远程拉取代码到本地

fetch:只是拉取到本地

pull:不仅拉取到本地,还merge到本地分支中

代码合流之Merge vs Rebase

rebase:用于把一个分支的修改合并到当前分支

img

假设远程分支上有2个提交,然后基于远程develop,再创建一个分支feature。

然后分别在两个分支上做两次提交。

img

git merge

这时候,你可以用pull命令把develop分支上的修改拉下来并且和你的修改合并;结果看起来就像一个新的和并提交

img

git rebase

$ git checkout feature $ git rebase develop

这些命令会把你的feature分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch)(这些补丁放到".git/rebase"目录中)

然后把feature分支更新为最新的develop分支

最后把保存的这些补丁应用到feature分支上

当feature分支更新后,会指向最新的commit,临时存放的就会被删除掉

img

代码回滚之Reset、Revert、 Checkout

img

Reset

将一个分支的末端指向另一个提交,可以用来移除当前分支的一些提交。

文件层面上,将缓存区的文件同步到指定的那个提交。

$ git checkout develop $ git reset HEAD~2 # 将当前的README.md从缓存区中移除出去 $ git reset HEAD README.md

img

develop分支末端的两个提交就变成了悬挂提交

如果提交还没有push,git reset 是撤销commit的简单方法

除了在当前分支上操作,还可以通过其他参数来修改stage或者workspace

--soft:stage和workspace都不会被改变

--mixed(默认):stage和你指定的提交同步,但workspace不受影响

--hard:stage和workspace都同步到你指定的提交

# 将当前的改动从stage中移除,但这些改动还保留在workspace中 $ git reset --mixed HEAD # 完全舍弃没有提交的改动 $ git reset --hard HEAD

Checkout

提交层面上的checkout,可以切换分支,同一分支,可以切换当前HEAD。

文件层面上,不会移动HEAD指针,也不会切换到其他分支上,只是更改workspace,而不是stage。

# 将HEAD移到新的分支,然后更新工作目录 $ git checkout develop # 将HEAD移动到当前commit的前两个commit上,同时更新workspace $ git checkout HEAD~2 # 将workspace中的README.md同步到最新的提交 $ git checkout HEAD README.md

Revert

撤销一个提交的同时会创建一个新的提交。

# 产生一个新的commit用于撤销倒数第二个commit $ git checkout develop $ git revert HEAD~2

不会改变提交历史

revert可以用在公共分支,reset应该用在私有分支上

如果提交已经push,想到达到撤销的目的,应该使用revert

命令 作用域 常用情景
git reset   提交层面   在私有分支上舍弃一些没有提交的更改  
git reset   文件层面   将文件从缓存区中移除  
git checkout   提交层面   切换分支或查看旧版本  
git checkout   文件层面   舍弃工作目录中的更改  
git revert   提交层面   在公共分支上回滚更改  
git revert   文件层面   (然而并没有)  
代码暂存之Stash

git stash会把所有未提交的修改(包括暂存和未暂存的)都保存起来,用于日后恢复当前工作目录

保存一个不必要但日后又想查看的提交

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgdyd.html