我想修改在我们的持续集成服务器上进行单元测试失败的合并提交,但我不想留下在历史记录中测试失败的提交。
由于此提交仅由CI服务器使用(并且不会被其他任何人拉下),我想修复合并,然后--force
推送它以替换现有的失败合并提交。
我的问题是,我无法弄清楚如何在原始提交之前立即回到状态,以便我可以修复失败的测试,重新启动合并,然后强制推送更改。< / p>
我真的不想重做整个合并,因为有很多冲突文件需要解决,除了一个之外的所有文件都已成功解决。
git reset
我的第一次尝试是在合并提交之前对提交进行混合重置,修复合并引入的错误,然后重新发送。
git reset HEAD^
# Fix the failing test
git commit
不幸的是,这导致了一个非合并提交,它默默地包含了所有的分支变化 - 实际上并不是我想要的。 * 8' )
reset
,stash
,merge
&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
会运行,但现在我不仅有冲突,我在冲突中存在冲突,而且任何应该删除的文件已经加入了。
amend
和/或rebase
。我尝试nice simple suggestion qqx来解决问题和git commit --amend
原始提交,但实际上没有回到合并中期状态,您将失去对合并工具的访问权限
一旦我提交,我就失去了运行git mergetool {file}
的能力,因为它只是返回错误:
{file}:文件不需要合并
在尝试修复合并冲突时,我真的希望能够使用kdiff3
等工具一起查看我的基本,左,右和当前修订。
使用rebase
会遇到同样的问题。
工作流程的任何提示都可以让我达到我想要的结果。
答案 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
切换到使用新的合并提交。