如何使用Git修改非HEAD提交?

时间:2014-01-10 23:51:16

标签: git

我已经对我的Git存储库中的本地主题分支进行了一系列更改。每次提交后,我都会运行一小组冒烟测试,以便在可能的情况下验证功能。在提交拉取请求之前运行一组更大的测试后,我发现了之前错过的一些错误。我可以为bug修复创建一个新的提交,但因为它只是一个本地主题分支,我想修改我已经拥有的提交。我一直在做两种方式:

  1. 进行更改,测试它们。存放它们然后在rebase -i期间的适当位置弹出。
  2. 进行新的提交,然后重新安排-i重新排序并压缩它们。
  3. 如果在上一次提交中碰巧需要修复错误,那么我可以使用--amend来解决问题。 Git是否提供了修改HEAD父母的快捷方式,还是我坚持使用当前的方法?

3 个答案:

答案 0 :(得分:5)

Git不提供修改当前HEAD以外的提交的快捷方式。这是因为提交的每次更改都会有效地创建一个全新的提交对象,该对象与之前的提交对象不兼容。这也意味着当你要改变HEAD的直接父级时,HEAD也需要改变。这不是显而易见的,也是一种破坏性的行为。编辑您之前发布的任何提交也非常气馁。

如果你真的想这样做,你将不得不做一个交互式的rebase,其影响非常明确:每个rebase都会创建新的,不兼容的提交对象。

正确的解决方案是保持历史记录保持原样,即使存在错误,只需添加一个修复前面介绍的错误的新提交即可。 Git应该尊重项目中的历史。正如您稍后确定并修复了该错误一样,您还应该创建一个提交,以便稍后修复该错误。将非完美代码作为历史的一部分是没有错的。不断改变过去的提交只会引入你用它解决的更多问题,并且有点违背“源控制精神”。

答案 1 :(得分:2)

你说local branch我会回答,假设你没有推动任何东西,否则不要这样做。

假设你要编辑的提交是'abcdef',你将运行一个rebase

git rebase abcdef~ 
# the ~ is needed, you need the parent of the commit you want to edit

然后,当您的编辑器启动时,将要编辑的提交从pick更改为edite,保存并关闭,HEAD将停止地点,做你想做的任何改变并进行分级,然后做commitrebase --continue,并且rebase将继续。

答案 2 :(得分:2)

还有另一种解决此问题的方法,即以下列方式使用TopGit:主题分支中的每个提交都将成为自己的分支(您可以在此时使用tg import提交已经存在)。要编辑提交,您只需切换到相应的分支,对其进行编辑,git commit,然后运行tg update -a以将更改转发到所有依赖于它的修补程序。最后,您将运行tg export(选择适当的命令行选项)将临时TopGit分支转换为最终的一系列修订。