Git - 高级篇 (1)

     rebase 并没有你想象的那么难用; --amend 也是一种黑科技操作.

不喜欢 merge 的分叉?用 rebase 吧

     有些人不喜欢 merge,因为在 merge 之后,commit 历史就会出现分叉,这种分叉再汇合的结构会让有些人觉得混乱而难以管理。如果你不希望 commit 历史出现分叉,可以用 rebase 来代替 merge

rebase——在新位置重新提交

     rebase ,又是一个中国人看不懂的词。这个词的意思,你如果查一下的话:



哈?玩个 Git 就弯了?

     其实这个翻译还是比较准确的。rebase 的意思是,给你的 commit 序列重新设置基础点(也就是父 commit)。展开来说就是,把你指定的 commit 以及它所在的 commit 串,以指定的目标 commit 为基础,依次重新提交一次。例如下面这个 merge

1
git merge branch1


     如果把 merge 换成 rebase,可以这样操作:

1
2
git checkout branch1
git rebase master


     可以看出,通过 rebase56 两条 commits 把基础点从 2 换成了 4 。通过这样的方式,就让本来分叉了的提交历史重新回到了一条线。这种「重新设置基础点」的操作,就是 rebase 的含义。
     另外,在 rebase 之后,记得切回 mastermerge 一下,把 master 移到最新的 commit

1
2
git checkout master
git merge branch1


     为什么要从 branch1rebase,然后再切回 mastermerge 一下这么麻烦,而不是直接在 master 上执行 rebase

     从图中可以看出,rebase 后的 commit 虽然内容和 rebase 之前相同,但它们已经是不同的 commits 了。如果直接从 master 执行 rebase 的话,就会是下面这样:



     这就导致 master 上之前的两个最新 commit 被剔除了。如果这两个 commit 之前已经在中央仓库存在,这就会导致没法 push 了:

     所以,为了避免和远端仓库发生冲突,一般不要从 master 向其他 branch 执行 rebase 操作。而如果是 master 以外的 branch 之间的 rebase(比如 branch1branch2 之间),就不必这么多费一步,直接 rebase 就好。

小结

     本节介绍的是 rebase 指令,它可以改变 commit 序列的基础点。它的使用方式很简单:

1
git rebase 目标基础点

     需要说明的是,rebase 是站在需要被 rebasecommit 上进行操作,这点和 merge 是不同的。

刚刚提交的代码,发现写错了怎么办?

     刚提交了一个代码,发现有几个字写错了:



     怎么修复?

     当场再写一个修复这几个错别字的 commit?可以是可以,不过还有一个更加优雅和简单的解决方法:commit -—amend

     “amend” 是「修正」的意思。在提交时,如果加上 --amend 参数,Git 不会在当前 commit 上增加 commit,而是会把当前 commit 里的内容和暂存区(stageing area)里的内容合并起来后创建一个新的 commit,用这个新的 commit 把当前 commit 替换掉。所以 commit --amend 做的事就是它的字面意思:对最新一条 commit 进行修正。

     具体地,对于上面这个错误,你就可以把文件中的错别字修改好之后,输入:

1
2
git add 笑声.txt
git commit --amend


     Git 会把你带到提交信息编辑界面。可以看到,提交信息默认是当前提交的提交信息。你可以修改或者保留它,然后保存退出。然后,你的最新 commit 就被更新了。



小结

     这一节的内容只有一点:用 commit --amend 可以修复当前提交的错误。使用方式:

1
git commit --amend

     需要注意的有一点:commit --amend 并不是直接修改原 commit 的内容,而是生成一条新的 commit

~感谢捧场,您的支持将鼓励我继续创作~