撤消将文件从回购中删除的Git合并的最佳方法是什么?


13

因此,假设发生以下情况(并且我们都在使用SourceTree):

  1. 我们都在努力起源/发展。
  2. 我去度假一个星期。
  3. 我的同事在过去的几天里一直在本地工作,而没有将起源/开发重新合并到他的本地开发分支中。
  4. 他尝试进行推动,并被告知必须先合并,然后再进行牵引。
  5. 他遇到了冲突,阻止了自动合并后继续进行。
  6. 假设Git类似于SVN,我的同事将“新”文件丢弃在他的工作副本中,然后提交合并-从起源/开发部门清除这些“新”文件。
  7. 在该修订版的基础上,还需要进行为期数周的开发工作。
  8. 我从假期回来,发现我缺了几天的工作。

我们对Git都是非常陌生的(这是我们使用它的第一个项目),但是我所做的修复工作是:

  1. 将“ develop”重命名为“ develop_old”。
  2. 将develop_old合并到新的分支“ develop_new”。
  3. 将dev_new分支重置为错误合并之前的最后一次提交。
  4. 从那时起,Cherry逐一挑选每个提交,以手工解决冲突。
  5. 将develop_old和develop_new推到起点。

在这一点上,我希望develop_new是我们所有更改的“好”副本,并重新应用了随后的数周工作。我也假设说,“反向承诺”会做一个合并奇怪的事情,尤其是接下来的几个星期的工作价值是基于它-因为该合并包含了很多的事情,我们有东西,我们不要想一起t。

我希望这种情况再也不会发生,但是如果再次发生,我想知道一种更轻松/更好的解决方法。当基于该合并的回购中进行了大量工作时,是否有更好的方法来撤消“不良”合并?


1
您可以张贴git树的屏幕快照(适当编辑)还是使用您喜欢的git log格式的输出,并附上有关各种提交所发生情况的适当注释?(我要编辑/注释git log --graph --pretty=oneline --abbrev-commit并从那里

1
对您来说已经太迟了,但是单元测试已经抓住了这一点。
2014年

1
@nalply:如果错误合并也删除了单元测试,则不会。
Aaronaught 2014年

哇,这真是阴险的运气。
2014年

Answers:


6

如果我理解正确,这是您的情况:

    ,-c--c--c--c--M--a--a--X ← develop
o--o--y--y--y--y-´

经过一些共同的历史(o),您投入并推动了工作(y)。您的同事(c)确实在其本地存储库上工作,并且合并错误(M)。之后,在M之上可能还有一些其他提交(a)。

git reset --hard develop M^2
git branch coworker M^1

现在,您的图形看起来完全像错误合并之前的样子:

    ,-c--c--c--c ← coworker
o--o--y--y--y--y ← develop

做一个很好的合并(G):

git checkout develop
git merge coworker

导致:

    ,-c--c--c--c-、
o--o--y--y--y--y--G ← develop

现在移植其他提交:

git reset --hard X
git rebase --onto G M develop

这给出了最终结果:

    ,-c--c--c--c-、
o--o--y--y--y--y--G--a--a--X ← develop

请注意,这可能会导致更多合并冲突。同样,您只是更改了历史记录,即所有同事都应克隆/重置/重新设置为新的历史记录。

PS:当然,您应该用相应的提交ID 替换GMX在命令中将其替换。


在所有问题中,所有这些提交都已被推送到共享存储库中,这似乎很明显,所以我认为变基不是一个好选择。还原所有最近的提交,然后在良好的合并基础上挑选已还原的非冲突提交更为安全。
Aaronaught 2014年

那就是克隆/重置/重置的部分。-如果只有几个开发人员,告诉他们更新其存储库可能是有效的选择。
2014年

1

您正在考虑如何修复存储库是一件好事,但是如果您的同事删除了新文件并且没有覆盖很多更新,那么一种更简单的方法是简单地恢复已删除的文件。

我可能会先尝试仅选择原始提交(在当前标题上),然后在其中添加已丢失的代码。如果由于某种原因无法解决问题,只需将旧版本和您添加的文件一起签出,然后将其重新添加到新提交中即可。

您所描述的实际上是众所周知的Git反模式的子集,在我的一生中,我不记得它的名称-但其要旨是在Git合并期间进行任何“手动编辑”(即,编辑(实际上并不能解决任何合并冲突,但正在进行一些完全不相关的更改)被认为是极差的做法,因为它们本质上被合并本身掩盖了,并且在代码审查或调试会话中很容易被忽略。

因此,请务必向您的同事解释这是一次史诗般的失败,但在准备进行大手术之前,请考虑对创可贴打耳光。


我同意,如果整个文件都没了,那么如果您不关心旧文件中的历史记录,则可以做一件事:1.从当前混乱的分支中创建一个新分支。2.切换回坏分支,并创建另一个新分支,即您的救援分支。3.从您的救援分支返回到失败提交之前的提交。4.将已删除的文件复制到git之外的某个地方。5.切换到另一个新分支。6.将已删除文件的新版本复制到新分支并提交。莱纳斯·T(Linus T.)着名的帖子中提到了一种更复杂的保存历史的方式
埃琳(Elin)2014年

1
实际上,这显示了如何使用结帐jasonrudolph.com/blog/2009/02/25/…更好。
Elin 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.