是否有一种方法可以通过非交互方式更改提交消息,同时使用 git commit --fixup=amend 进行提交修复?

3

我想通过脚本使用 git commit --fixup 来压缩一些提交,但是我卡在了这个事实上:消息的 -m 开关不能与 --fixup:amend 一起使用。

$ git commit --fixup=amend::/'Upgrade to foo' -m "Upgrade to bar"
fatal: options '-m' and '--fixup:amend' cannot be used together

(如果可能的话,我以后会使用git rebase --autosquash <some-much-earlier-commit>将它们全部压缩成一起)

我可以使用简单的--fixup而不是amend,但是然后我无法更改提交消息。没有-m消息,编辑器会打开以编辑提交消息,因此无法通过脚本完成。

我知道这些都是“瓷”命令,但我正在通过脚本执行此操作,想知道是否仍然有一种方法可以使用“管道”命令执行git commit --fixup=amend的等效操作,同时仍然可以非交互式地更改提交消息?


1
你可能正在寻找 git commit-tree - matt
好的,我认为我理解了。我认为这是一个XY问题,你有一个部分解决方案来解决问题。如果您能创建一个示例,那将更清楚。我建议您创建一个git历史记录。然后展示在运行此“git commit”命令后您想要的结果。 - Code-Apprentice
@j6t 我认为你对直接使用 --fixup 有些困惑,因为 --fixup=amend 允许更改消息 - 这就是两者之间的区别。只是需要在 $EDITOR 中交互式地完成,而不是在命令行中使用 -m,这就是我在这里遇到的问题。git commit --amend -m "message" 只会更改最后一次提交的提交,并且除此之外什么都不做。 - paradroid
请在问题中说明在使用git commit --fixup后如何调用git rebase - j6t
@j6t 好的,我已经添加了,但我看不出它有什么帮助。(实际上,我只是重新设置了基础分支,因为我在 git 配置中设置了自动压缩) - paradroid
显示剩余3条评论
2个回答

1

没错,你完全可以使用git commit --fixup=amend来修复和修改提交信息,而无需交互式输入任何内容。你只需要在旧的git commit命令中使用-C--reuse-message选项即可。

以下是示例命令:

git commit --fixup=amend -C HEAD --no-edit

-C--no-edit参数指定要修复的提交,并确保提交消息不会在编辑器中打开,从而避免需要交互式输入。

Git将自动使用新消息修复和修改提交,无需您交互式编辑消息。

但是,请注意,使用--fixup=amend会修改提交历史记录,因此请谨慎使用,特别是如果提交已经推送到远程存储库。


1
“Git会自动使用新消息修复和修改提交,而无需您交互式编辑消息。” - 谢谢,但它如何获取新消息? - paradroid
然而,需要注意使用--fixup=amend会修改提交历史记录。但我不确定你的意思,因为我这样做时,只会创建一个具有!fixup前缀的新提交。仅当使用rebase --autosquash命令时,它才会被压缩到先前的提交中。 - paradroid
同时这个代码并不能正常工作:fatal: Only one of -c/-C/-F/--fixup can be used.(在 git 2.34.1 上测试过) - Chris Maes

-1
Git会根据你的git commit --fixup=amend:...命令创建一个新的提交。你可以自己创建这个提交:
git commit -m "amend! <commit hash / old commit message>" -m "new commit message"

所以对于你给出的例子,它将是这样的。
git commit -m "amend! Upgrade to foo" -m "Upgrade to bar"

注意:第二个-m参数将填充描述。或者在使用编辑器时,您可以将第二个-m参数放在第三行。
amend! Upgrade to foo

Upgrade to bar

查看:如何从命令行提交带有“消息”和“描述”的更改?

下次我心情好的时候,我会试试这个,但我持怀疑态度。目前我还无法理解它,因为我忘记了这个问题是关于什么。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接