所以我们的团队对Git来说是个新手。我们得到了像this one这样的情况,只是更糟糕的情况:开发人员做了一个糟糕的合并,而且糟糕的合并已被埋没在大约20个后续提交中,因为我们只注意到一天后的不良合并。
我们如何解决这个问题?
编辑:看起来git revert -m
命令可能就是诀窍,但是我们真的只需要还原一个文件......一个严重损坏的大型edmx文件。有什么方法可以将恢复限制为该文件吗?
答案 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
修复文件并提交。