git rebase 妙用

Published on:

平时,我们通过 git 协作,在 push 到远程分支之前,一般会在本地实作多个功能,其中,可能会有多个 commit,有时候,我们 实作完才发现这些 commit 有必要好好整理一下再 push。

这时候,git rebase 几乎可以满足我们所有的需要,无论是修改,分拆或者是增加 commit。

选择 commit 进行 rebase

首先,我们需要根据情况选择适当的节点,假如我们需要对前三个 commit 进行整理,可以执行:
$ git rebase -i HEAD~3

也可以找到某个特定的 commit_id,执行:
$ git rebase commit_id -i

关于commit_id,执行 $ gitk,如下图,可以查看每个 commit 的 commit_id,其实就是 commit 的digest(消息摘要),commit 只要稍有改变,commit_id 都会不同。

然后,就会进入一个vi编辑界面:

根据需要选择指令

其中,下方注释有一下描述:

# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
# Note that empty commits are commented out

说的很清楚:(以下指令可以使用缩写,首字母

  • pick 就是保留这个 commit,如果不需要这个 commit,删掉那一整行就好了
  • reword 可以修改 commit message
  • edit 会停下来,修改特定 commit 的内容,可以分拆也可以添加或者修改内容
  • squash 会把特定的某条 commit 合并进上一条 commit
  • fixup 跟 squash 类似,但会丢弃 log message
  • exec 使用 shell 执行指令

假如目前我们要整理前三个 commit:

pick add A
pick add B
pick add C

修改 commit 的顺序

每一行 commit 是从上到下按顺序执行的,最下面的 commit 是最近的一次 commit,如果想修改两个 commit 的顺序,只需要互换两行的位置就行。

互换位置后,是这样:

pick add A
pick add C
pick add B

确定了之后,执行:wq保存后退出,如果没有异常,就成功修改了 commit 的顺序,不过要小心使用,如果两个 commit 里的够远,由于 commit 之间有依赖关系,调换顺序可能会造成混乱,甚至💥爆炸。

修改 commit message

pick add A
pick add B
reword add C

保存后,会跳转到 add C这个 commit 下,修改 message 保存之后就行。

分拆 commit

pick add A
edit add B
pick add C

保存后,会停在add B 那个 message 下

执行 $ git reset HEAD^,会取消这个 commit,然后留下修改的文件。

接着做修改,add 部分 file,commit 一次,再 add file,做另一次 commit,可以多次,修改完毕

执行$ git rebase --continue,如果有提示有冲突,需要解决冲突,然后再 continue,最后如果没有问题,就 ok 了。

修改 commit 内容

跟上面分拆 commit一样,只是修改 file 不同,不过大同小异。

合并两个 commit

pick add A
pick add B
squash add C

保存后,会跳转到合并两次commit 的新页面,如果需要修改 commit message 就修改,如果不需要就执行保存,就完美合并了两次 commit。


For more info, pl refer to the link below:

Git rebase 和 merge 合併操作示範 - YouTube

Comments

comments powered by Disqus