我正在尝试使用autosquash
git-rebase提供的选项压缩最后3次提交.我有以下历史:
* commit 78a7e4844fa32d2ef1bb7bd9b44c4a1b9551d31a (HEAD, new) | Author: maxim koretskyi| Date: Fri Feb 20 10:29:48 2015 +0200 | | squash! s3 | * commit f25491cadc646baf14bd7e951245c6777230a1d7 | Author: maxim koretskyi | Date: Fri Feb 20 10:29:42 2015 +0200 | | squash! s2 | * commit b988237356ffb59752e49049d083c558373f9486 | Author: maxim koretskyi | Date: Fri Feb 20 10:29:24 2015 +0200 | | squash! s1 | * commit abbcdc833e5eaabe79681bd82087b4d7969e8599 (new1, ne, 9484) | Author: maxim koretskyi | Date: Wed Feb 18 18:21:58 2015 +0200 | | 3
所以我想要提交消息s1
,s2
并s3
以前缀squash!
为基础进行压缩.现在我发出以下命令:
$ git rebase -i abbcdc833 --autosquash
所以git打开一个文本编辑器,其中包含以下内容:
pick b988237 squash! s1 pick f25491c squash! s2 pick 78a7e48 squash! s3
但我希望它是这样的:
pick b988237 squash! s1 squash f25491c squash! s2 squash 78a7e48 squash! s3
我究竟做错了什么?
从文档,但强调我的:
当提交日志消息以"squash!..."(或"fixup!...")开头,并且有一个提交标题以相同的...开头时,自动修改todo列表
rebase -i
以便提交标记为压缩是在提交修改后立即进行的,并将移动的提交的操作从pick更改为squash(或fixup).在第一次之后忽略后续的"fixup!"或"squash!",以防你提到早期的fixup/squashgit commit --fixup/--squash
.
你的第一个squash!
具有s3
作为其...
部分.因此,rebase寻找具有s3
其"标题" 的提交(这在文档中从未定义,但它似乎意味着"单行描述",即日志消息的第一行).列表中没有此类提交.
继续到第二个,我们发现了同样的问题,同样与第三个问题相同.
如果你的第一个提交(带标题s1
)之后是一个标题为的提交squash! s1
,那个特定的提交将得到一个"壁球"字.
(注意git commit --fixup=
或git commit --squash=
将为你创建这种"相同标题"提交."忽略后续"的东西是因为你可以在工作时这样做:
git add ...; git commit -m thing1 ... edit ... git add ...; git commit -m thing2 # now fix thing1 bug noticed while working on thing2 ... edit ... git add ...; git commit --no-edit --fixup=HEAD^ ... edit/test some more, discover fixup was not complete git add ...; git commit --no-edit --fixup=HEAD
在这种情况下,第二个修正的线是fixup! fixup! thing1
; rebase只是寻找一个"标题"的提交thing1
.)