我如何重做git合并提交?

时间:2012-11-21 14:49:29

标签: git git-merge git-rebase git-stash git-reset

我想修改在我们的持续集成服务器上进行单元测试失败的合并提交,但我不想留下在历史记录中测试失败的提交。

由于此提交仅由CI服务器使用(并且不会被其他任何人拉下),我想修复合并,然后--force推送它以替换现有的失败合并提交。

我的问题是,我无法弄清楚如何在原始提交之前立即回到状态,以便我可以修复失败的测试,重新启动合并,然后强制推送更改。< / p>

我真的不想重做整个合并,因为有很多冲突文件需要解决,除了一个之外的所有文件都已成功解决。

到目前为止我尝试了什么

尝试1:git reset

我的第一次尝试是在合并提交之前对提交进行混合重置,修复合并引入的错误,然后重新发送。

git reset HEAD^
# Fix the failing test
git commit

不幸的是,这导致了一个非合并提交,它默默地包含了所有的分支变化 - 实际上并不是我想要的。 * 8' )

尝试2:resetstashmerge&amp; apply

然后我尝试使用stash来保存我在第一次尝试合并时所做的更改:

git reset HEAD^
git add .               # Since there were untracked files
git stash
git merge branch
git stash apply         # Fails
git add .
git stash apply         # Merged but with conflicts

不幸的是,当git stash apply尝试将我的隐藏更改与现有的冲突合并文件合并时,它会因错误而失败

  

无法申请肮脏的工作树,请进行更改

如果我使用git add .尽职尽责地使我的工作目录干净,那么git stash apply会运行,但现在我不仅有冲突,我在冲突中存在冲突,而且任何应该删除的文件已经加入了。

尝试3:amend和/或rebase

我尝试nice simple suggestion qqx来解决问题和git commit --amend原始提交,但实际上没有回到合并中期状态,您将失去对合并工具的访问权限

一旦我提交,我就失去了运行git mergetool {file}的能力,因为它只是返回错误:

  

{file}:文件不需要合并

在尝试修复合并冲突时,我真的希望能够使用kdiff3等工具一起查看我的基本,左,右和当前修订。

使用rebase会遇到同样的问题。


工作流程的任何提示都可以让我达到我想要的结果。

2 个答案:

答案 0 :(得分:3)

由于您只是重置最近的提交,因此您似乎没有进行任何其他提交,因为有问题的提交。因此,您应该能够修复代码,对更改的文件使用git add,然后使用git commit --amend替换现有的合并提交。这将保留合并信息。

答案 1 :(得分:1)

git branch old_merge
git checkout -b new_merge HEAD~
git merge branch

会让您回到挂起合并状态,您可以使用常规合并工具。由于旧合并保存为old_merge分支,因此您还可以使用git checkout old_merge {file}来使用您之前尝试为特定文件所做的选择。一旦完成,您可以正常提交,然后签出您之前正在处理的分支,并使用git reset --hard new_merge切换到使用新的合并提交。