修改一个不是前一个提交的提交记录

164

我经常有以下这样的工作流程:

  1. 提交一组文件的更改
  2. 提交另一组文件的更改
  3. 意识到错过了应该包含在第一个提交中的一些更改
  4. 咒骂

我不能使用 git commit --amend,因为我需要修改的不是最近的提交。那么,在不影响第二个提交的情况下,如何将更改添加到第一个提交中最好的方法是什么?


1
请参考以下链接获取脚本版本的信息:https://dev59.com/rFHTa4cB1Zd3GeqPPCiS#3940887 - VonC
4
我已经为此创建了一个 Bash 脚本:https://github.com/colinodell/git-amend-old。安装后,您可以像这样使用它:`git amend-old abcd123,其中 abcd123` 是您想要用暂存的更改修正的旧提交。希望对某人有所帮助! - Colin O'Dell
1个回答

215
您可以使用git rebase来解决这个问题。运行git rebase -i sha1~1,其中sha1是要更改的提交哈希值。找到要更改的提交,按照rebase编辑器中的注释将"pick"替换为"edit"。从那里继续,您可以编辑该提交。
请注意,这将更改该提交以及所有后代的sha1 -- 换句话说,它将重写该点之后的历史记录。这样做可能会破坏存储库,但如果您还没有推送,则影响并不大。

31
你可以考虑使用 'HEAD~N' 来代替 'sha1',其中 N 是你想要从 'HEAD' 开始 rebase 的提交之前的数量。 - 3lectrologos
16
我理解错了吗?看起来你实际上需要选择要更改的提交记录之前的一个提交记录。如果 sha1 是你想要更改的提交记录的哈希值,那么在 rebase 命令中你应该指定 sha1^。否则,要更改的提交记录将不会出现在列表中。 - Rob Kennedy
8
最后,在修订提交后,必须运行git rebase --continue来重新应用其后的提交。 - Artyom
2
如果您只有一个文件有未暂存的更改,并且您想将其提交到旧提交中,我发现最简单的方法是:1)将文件复制到桌面或其他位置 2) git stash 3) git rebase -i sha1^ 4) 将要更改的旧提交上的 pick 改为 edit 5) 现在您的工作区看起来像是在旧提交期间的样子,将(旧)文件替换为新文件的副本 6) git add path/to/file 将该文件添加到提交中 7) git commit --amend 8) git rebase --continue 退出变基 9) git stash pop - woojoo666
50
非常顺利地完成了任务。 git stash; git rebase -i sha1~1; git stash apply; git commit --amend; git rebase --continue; git push --force - snlehton
显示剩余2条评论

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