Git Rebase 进阶使用指南:修改本地提交的技巧
这个命令大体作用就是对本地的commit进行修改,适用于以下情况:
- 本地历史排查修改
- 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
换成record
或r
,这里r
为record
简写,二者没有差异
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