修复了一个糟糕的合并

时间:2015-05-20 22:33:54

标签: git git-merge

所以我们的团队对Git来说是个新手。我们得到了像this one这样的情况,只是更糟糕的情况:开发人员做了一个糟糕的合并,而且糟糕的合并已被埋没在大约20个后续提交中,因为我们只注意到一天后的不良合并。

我们如何解决这个问题?

编辑:看起来git revert -m命令可能就是诀窍,但是我们真的只需要还原一个文件......一个严重损坏的大型edmx文件。有什么方法可以将恢复限制为该文件吗?

2 个答案:

答案 0 :(得分:5)

如果只有一个损坏的文件,你可以找到一个好的提交并从那里结帐:

git checkout <revision> -- path/to/file 

然后将其保存在下一次​​提交中。

答案 1 :(得分:5)

鉴于你的编辑,我建议提取一份文件的好副本&#34;预合并&#34;加上任何所需的变化。有多种方法可以执行此操作:您可以反向应用合并带来的更改,希望任何后续更改不会发生冲突或重叠;您可以提取一个良好的合并前版本并检查所需的任何更新;等等。

例如,如果<revspec>是具有已知良好版本文件的提交:

$ git log <revspec>..HEAD -- path/to/file # find changes to file

(这将显示从HEAD但不能从<revspec>或其父母触及文件的所有提交;这应该包括合并本身,显然你不会这样做。 t 希望保留,但也会显示您可能希望保留更改的提交。

$ git checkout <revspec> -- path/to/file

(这只是将旧版本提取到工作目录中,也将其写入索引,即,它已经暂存为提交)。

现在,如果有做的修订需要更改:

$ git show <rev> -- path/to/file | git apply
... repeat for all <rev>s, make sure they all apply;
    do manual work if needed ...
$ git add path/to/file

如果三个没有这样的修改,你不需要申请任何东西,也不需要add结果;您现在已准备好git commit

一种不同的方法,但现在你必须选择哪一方面&#34;合并引入了不好的东西。让我们说坏的东西来自第二个父母(分支合并,而不是分支合并进入):

$ git diff <mergerev>^1 <mergerev> -- path/to/file | git apply -R

在这里,我们得到git diff以显示文件如何从&#34; good&#34; (mergerev的第一父母)到&#34;坏&#34; (mergerev,从第二个父母带来的变化),&#34;反向申请&#34;那些对工作树的改变。

如果一切顺利,git add修复文件并提交。