在Git中间添加对提交的更改

vir*_*iru 14 git

如何将新更改添加到中间的提交中,我的意思是不添加到顶部提交.

git log
commit1 <--- HEAD
commit2
commit3
Run Code Online (Sandbox Code Playgroud)

如何直接将更改添加到commit3,而不删除commit1和commit2,然后将更改添加到commit3.

我需要使用藏匿处吗?

如果可能,请提供链接.

sir*_*ide 13

你必须做一个互动的rebase.有关详细信息,请阅读git rebase的帮助页面.简短的回答是,您将继续像往常一样提交"中间"更改,然后运行git rebase -i HEAD~4.它将在文本编辑器中显示最后3个提交的列表.只需重新排序最新提交放在中间的提交,然后保存并退出编辑器.然后Git将尝试以新顺序重建历史记录.它可能因冲突而停止.如果是这样,请像修改合并冲突一样修复它们,然后git rebase --continue在它们全部修复并添加之后运行.当你遇到冲突时它会告诉你所有这些,所以只需阅读错误信息就可以了.

编辑:实际上,看起来你想要编辑现有的提交.在这种情况下,当编辑器出现时,将新的临时提交移动到commit3旁边,然后将命令从"pick"更改为"squash":

pick 123456 commit3
squash 541343 tmpcommit
pick 654321 commit2
pick 431523 commit1
Run Code Online (Sandbox Code Playgroud)

EDIT2:如果分支和commit1,commit2和commit3已经公开,那么你不应该重新定位.再说一遍,你不应该修改提交,所以整个问题都没有实际意义.我假设这是一个私人分支,或者其他人希望重新定位和重绕的分支.


Jos*_*Lee 9

你可以用git-rebase做到这一点:

git rebase -i commit3^
Run Code Online (Sandbox Code Playgroud)

在弹出的文件中,更改pick commit3edit commit3.保存并退出,然后进行更改.像往常一样提交它们,然后使用git rebase --continue.完成后,您将看到commit3和commit2之间的新变化.

(这将与Sjoerd的答案相同;它只是一种不同的思考方式.如果你的更改与commit2冲突,你将不得不处理这两种方式.)

  • 如果更改已经位于工作树中,则此方法不起作用。当然,他可以在编辑 commit3 时隐藏更改,执行 rebase 然后取消隐藏,而不是像我的回答那样执行压缩。 (2认同)

Sjo*_*erd 4

创建一个新分支,它是 commit3 的副本。添加您的更改并提交。然后,将 commit2 和 commit1 合并到该分支。