我已经对我的Git存储库中的本地主题分支进行了一系列更改。每次提交后,我都会运行一小组冒烟测试,以便在可能的情况下验证功能。在提交拉取请求之前运行一组更大的测试后,我发现了之前错过的一些错误。我可以为bug修复创建一个新的提交,但因为它只是一个本地主题分支,我想修改我已经拥有的提交。我一直在做两种方式:
如果在上一次提交中碰巧需要修复错误,那么我可以使用--amend来解决问题。 Git是否提供了修改HEAD父母的快捷方式,还是我坚持使用当前的方法?
答案 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
更改为edit
或e
,保存并关闭,HEAD
将停止地点,做你想做的任何改变并进行分级,然后做commit
或rebase --continue
,并且rebase将继续。
答案 2 :(得分:2)
还有另一种解决此问题的方法,即以下列方式使用TopGit:主题分支中的每个提交都将成为自己的分支(您可以在此时使用tg import
提交已经存在)。要编辑提交,您只需切换到相应的分支,对其进行编辑,git commit
,然后运行tg update -a
以将更改转发到所有依赖于它的修补程序。最后,您将运行tg export
(选择适当的命令行选项)将临时TopGit分支转换为最终的一系列修订。