如何进行交互式的git修改(amend)?

3
如何在交互式补丁模式下撤消最后一次提交的部分内容并选择要撤消的部分?
当您在最后一次提交中意外地检入了几行太多的代码时,例如调试打印语句或编辑器为您执行的空格更改时,此功能将非常有用。
天真的方法是:
git commit --amend --interactive --patch

但是这似乎不起作用。也就是说,它只是让你进入编辑器进行重新措辞。

丑陋的方法是

git show HEAD~1:path/to/some/file > path/to-some/file
git add -up
git commit --amend

但这很烦人,因为它要求你事先指定文件,并且让你逐个重新添加所有的补丁(而不允许你只取消添加其中的一部分)。

我发现有时候使用 git show | git apply -R,然后结合使用 git add --patch 或者 git checkout --patch 可以帮助解决问题。虽然这种方法并不比重置再添加更好,但它取决于你想要做多少工作。 - cmbuckley
请注意,没有所谓的“交互式修改”,而git commit --amend只是一种谎言(在许多情况下很有用,但在本例中不是这样)。实际上,--amend只是使新提交的父级与当前提交的父级相同。根据Git创建新提交的方式,它只需要做到这一点就足够了。 - torek
3个回答

3

关于什么?

git reset -p HEAD~
git commit --amend --no-edit

第一条命令可以让您交互式地取消暂存代码块(选择y来获取您想要从提交中删除的部分),然后使用提交修改将其写入新的提交。


1

git gui提供了一个图形用户界面,看起来有点枯燥(它使用的是标准的Tcl/Tk),但在允许您查看和编辑即将提交的内容方面做得相当不错。

针对您的用例:

  • 从命令行启动git gui
  • 勾选右侧“底部文本区域上方”的“Amend Last Commit”复选框
  • 单击左侧“Staged Changes(将提交)”面板中的文件以查看其内容
  • 在“文件内容”窗格(右侧)中,您可以右键单击以取消暂存单个行或完整的差异块

1
这就是git reset的好处所在。你可以:
git reset HEAD^
git add --interactive
git commit --amend

要“取消暂存”最后一次提交,重新添加您想要的部分,然后重写提交(将其他更改保持未暂存状态,以供您处理或丢弃)。

您还可以使用 git reset -p 选择要取消暂存的块,这与(但相反于)git add -p非常相似。


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