Git Rebase 进阶使用指南:修改本地提交的技巧

这个命令大体作用就是对本地的commit进行修改,适用于以下情况:

  1. 本地历史排查修改
  2. code review后,打回修改

详解

  • pick,只是意味着包括提交。重新进行命令时,重新安排pick命令的顺序会更改提交的顺序。如果选择不包括提交,则应删除整行。
  • reword,该命令与相似pick,但是使用后,重新设置过程将暂停并为您提供更改提交消息的机会。提交所做的任何更改均不受影响。
  • edit,如果您选择edit提交,则将有机会修改提交,这意味着您可以完全添加或更改提交。您还可以进行更多提交,然后再继续进行变基。这使您可以将大型提交拆分为较小的提交,或者删除在提交中所做的错误更改。
  • squash,该命令使您可以将两个或多个提交合并为一个提交。提交被压缩到其上方的提交中。Git使您有机会编写描述这两个更改的新提交消息。
  • fixup,这类似于squash,但是要合并的提交已丢弃其消息。提交仅合并到其上方的提交中,并且较早提交的消息用于描述这两个更改。
  • exec,这使您可以对提交运行任意的Shell命令。

测试

git init

touch base.txt
git add .
git commit -m "add base"

touch 1.txt
git add .
git commit -m "add 1"

touch 2.txt
git add .
git commit -m "add 2"

touch 3.txt
git add .
git commit -m "add 3"

touch 4.txt
git add .
git commit -m "add 4"

touch 5.txt
git add .
git commit -m "add 5"

git log

commit a75ed742838ebc1ef1073502623478f73e1ec21f
Author: 
Date:   Wed Mar 4 10:02:51 2020 +0800

    add 5

commit 8b485bb4768b2abf8f6400dcba069f1a650ed5ec
Author: 
Date:   Wed Mar 4 09:59:27 2020 +0800

    add 4

commit 63ce9fb010da550c668aca66758c45fbfad46e2b
Author:
Date:   Wed Mar 4 09:59:04 2020 +0800

    add 3

commit 9cd34c4d42f52cfb40026dae613c8ad29d7cbc66
Author: 
Date:   Wed Mar 4 09:58:45 2020 +0800

    add 2

commit 77bd0eb1a97e1676367ea236c1c47c155eaa8430
Author: 
Date:   Wed Mar 4 09:58:23 2020 +0800

    add 1

commit 443sdafdsafgdf123123dfh234546gjnhbjh344
Author: 
Date:   Wed Mar 4 09:58:23 2020 +0800

    add base

上手

先手内容

git rebase -i HEAD~2 这里的git rebase-i HEAD~为常用命令,后面的2为倒叙git log的几个提交

比如git rebase -i HEAD~2,命令行当进入vim模式,并显示:

pick a75ed74 add 5
pick 8b485bb add 4

修改为

pick a75ed74 add 5

保存则删除add 4的commit

pick,对commit进行排序或删除

通过git rebase -i HEAD~n后,对每行进行删除或上下替换位置即可充值commit顺序或删除。

record,对提交commit的message进行修改

输入git rebase -i HEAD~3,进入vim如下:

pick 9cd34c4 add 2
pick 63ce9fb add 3
pick 575fd8b add 5

将第一行pick换成recordr,这里rrecord简写,二者没有差异

r 9cd34c4 add 2
pick 63ce9fb add 3
pick 575fd8b add 5

保存后会进入vim如下:

add 2

对这个修改为

add 2 ~ new commit

保存退出,使用git log

add 2 ~ new commit

edit,修改提交的代码

  • 场景一,需要在某两个提交间,穿插一个提交做个事情

git rebase -i HEAD~2

pick 6934312 add 3
pick 5ce6dde add 5

改为

e 6934312 add 3
pick 5ce6dde add 5

保存后终端显示以下两个关键句

git commit --amend
git rebase --continue

--amend为把修改add后添加到当前的提交上

--contine表示不做处理,继续下一个提交

比如此时我们vim 3.txt并追加内容edit test到3.txt文件中,并保存。

git add 3.txt
git commit -m 'new edit 3.txt'
git rebase --continue

此时的git log

add 5.txt
new edit 3.txt
add 3.txt
  • 场景二,需要在某两个提交间,穿插一个提交做个事情,但是不新增提交

git rebase -i HEAD~2

pick 6934312 add 3
pick 5ce6dde add 5

改为

e 6934312 add 3
pick 5ce6dde add 5
git add 3.txt
git commit --amend

此时的git log

add 5.txt
add 3.txt

此时修改归到了add 3.txt这个提交中

squash,合并变更到一个commit中

git rebase - i HEAD~2

输出

pick 6934312 add 3
pick 6fa47e4 add 5
pick 6934312 add 3
s 6fa47e4 add 5

进入vim

add 3

add 5

内容修改为

add 3 & add 5

git log

add 3 & add 5
add 2
add 1
add base

fixup,类似squash,不过是直接弃用对应的提交,将变更直接合并到更早的提交,不建议用,除非很熟练

git rebase -i HEAD~2

pick 311adc9 add 1
pick 7f9d45d add 2 ~ new comment

改为

pick 311adc9 add 1
s 7f9d45d add 2 ~ new comment

git log

add 1
add bash

exec,执行shell命令,没发现有什么实际用途目前(针对开发)

git rebase -i HEAD~2

add 1.txt

改为

exec echo "Hello World"
add 1.txt

保存

Executing: echo "Hello World"
Hello World

drop,直接删除某个提交

pick删除一样,pick是删除这一行,drop是使用命令描述删除这一行的提交

修改历史提交用户

git commit --amend --author "Iron <iron.yehong@outlook.com>" --no-edit