使用 autosquash 进行变基无法按预期工作

问题描述 投票:0回答:2

我正在尝试使用 git-rebase 提供的

autosquash
选项来压缩最后 3 个提交。我有以下病史:

* commit 78a7e4844fa32d2ef1bb7bd9b44c4a1b9551d31a (HEAD, new)
| Author: maxim koretskyi <[email protected]>
| Date:   Fri Feb 20 10:29:48 2015 +0200
|
|     squash! s3
|
* commit f25491cadc646baf14bd7e951245c6777230a1d7
| Author: maxim koretskyi <[email protected]>
| Date:   Fri Feb 20 10:29:42 2015 +0200
|
|     squash! s2
|
* commit b988237356ffb59752e49049d083c558373f9486
| Author: maxim koretskyi <[email protected]>
| Date:   Fri Feb 20 10:29:24 2015 +0200
|
|     squash! s1
|
* commit abbcdc833e5eaabe79681bd82087b4d7969e8599 (new1, ne, 9484)
| Author: maxim koretskyi <[email protected]>
| 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

我做错了什么?

git rebase
2个回答
15
投票

来自文档,但强调我的:

当提交日志消息以“squash! ...”(或“fixup! ..."), 并且有一个提交的标题以相同的 ... 开头, 自动修改

rebase -i
的待办事项列表,以便提交 标记为压缩紧随要修改的提交之后, 并将移动的提交的操作从选择更改为挤压(或 修理)。忽略第一个之后的后续“fixup!”或“squash!”, 如果您使用
git commit --fixup/--squash
引用了早期的修复/压缩。

您的第一个

squash!
s3
作为其
...
部分。因此,rebase 会查找以
s3
作为“标题”的提交(这在文档中从未定义,但它似乎意味着“单行描述”,即日志消息的第一行)。列表中没有此类提交。

继续第二个,我们发现同样的问题,第三个也是如此。

如果您的第一个提交(标题为

s1
)后面跟着一个标题为
squash! s1
的提交,则该特定提交将获得“挤压”一词。

(请注意,

git commit --fixup=<id>
git commit --squash=<id>
将为您创建这种“相同标题”提交。“忽略后续”内容是因为您可以在工作时执行此操作:

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
的提交。)


0
投票

如果您的目标是:

pick b988237 ...
squash f25491c ...
squash 78a7e48 ...

您需要以下提交消息:

* commit 78a7e4844fa32d2ef1bb7bd9b44c4a1b9551d31a (HEAD, new)
| Author: maxim koretskyi <[email protected]>
| Date:   Fri Feb 20 10:29:48 2015 +0200
|
|     squash! s1
|
* commit f25491cadc646baf14bd7e951245c6777230a1d7
| Author: maxim koretskyi <[email protected]>
| Date:   Fri Feb 20 10:29:42 2015 +0200
|
|     squash! s1
|
* commit b988237356ffb59752e49049d083c558373f9486
| Author: maxim koretskyi <[email protected]>
| Date:   Fri Feb 20 10:29:24 2015 +0200
|
|     s1
|
* commit abbcdc833e5eaabe79681bd82087b4d7969e8599 (new1, ne, 9484)
| Author: maxim koretskyi <[email protected]>
| Date:   Wed Feb 18 18:21:58 2015 +0200
|
|     3

导致:

pick b988237 s1
squash f25491c squash! s1
squash 78a7e48 squash! s1

注意:

squash! 
之后的提交消息必须用作挤压目标的参考。

使用上述提交消息,您可以通过以下任一方式获取交互式编辑器内容:

git rebase -i b988237356ffb59752e49049d083c558373f9486 --autostash

或者将

rebase.autostash
设置为 true 可以省略该标志,并且常规的 rebase 交互式命令就足够了:

git rebase -i b988237356ffb59752e49049d083c558373f9486
© www.soinside.com 2019 - 2024. All rights reserved.