1

我想修改在我们的持续集成服务器上未通过单元测试的合并提交,但我不想留下未通过历史测试的提交。

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

我的问题是,我无法弄清楚如何轻松地回到原始提交之前的状态,以便我可以修复失败的测试,重新提交合并,然后强制推动该更改。

我真的不想重做整个合并,因为有相当多的文件必须解决冲突,除了一个以外的所有文件都已成功解决。

到目前为止我尝试过的

尝试1:git reset

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

git reset HEAD^
# Fix the failing test
git commit

不幸的是,这导致了一个非合并提交,它默默地合并了所有的分支更改——这并不是我真正想要的。*8')

尝试 2: reset, stash, merge&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 .thengit stash apply运行使我的工作目录干净,但现在我不仅有冲突,我还与它们中的冲突发生冲突,并且任何应该删除的文件都已重新添加。

尝试 3:amend和/或rebase.

我尝试了qqx简单建议来解决问题和原始提交,但实际上没有回到中间合并状态,您将无法访问合并工具。git commit --amend

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

{file}:文件不需要合并

在尝试修复合并冲突时,我真的很喜欢能够使用kdiff3.

usingrebase遇到同样的问题。


任何可以让我达到我想要的结果的工作流程提示将不胜感激。

4

2 回答 2

4

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

于 2012-11-21T15:19:15.890 回答
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切换到使用新的合并提交。

于 2012-11-21T17:14:51.703 回答