2009-07-03 168 views
134

我在这里遇到了一些问题:我在Git中有一个特定于问题的分支28s,那是我在一般的develop分支中合并的。原来我做得太快了,所以我用git-revert来取消合并。然而,现在是合并28sdevelop的时候了,但git-merge命令看到了原始合并,并且愉快地宣布一切正常,并且分支已经合并了。现在我该怎么做?创建一个“还原”还原“28s - >开发”“'提交?似乎不是一个好办法,但目前我无法想象任何其他方法。在Git中重新执行还原合并

树结构的样子:

Git log output

+0

这是什么GUI? – 2009-07-03 16:01:18

+3

这是GitX(http://gitx.frim.nl)。 – 2009-07-06 06:56:16

回答

110

你必须 “恢复的复归”。取决于你是如何回复的,可能并不像听起来那么容易。看看official document on this topic

---o---o---o---M---x---x---W---x---Y 
      /
     ---A---B-------------------C---D 

允许:

---o---o---o---M---x---x-------x-------* 
      /     /
     ---A---B-------------------C---D 

但所有这一切工作的?当然可以。你可以恢复合并,从纯粹的技术角度来看,git很自然地做到了,并且没有真正的问题。
它只是把它从“合并前的状态”改为 “合并后的状态”,就是这样。
没什么复杂的,没什么奇怪的, 没什么真正危险的。 Git会做甚至没有考虑它。

所以从技术角度,有什么不对从工作流程的角度恢复合并,但 它的东西,你通常应该尽量避免

如果有可能,例如,如果发现得到了合并 到主树的问题,,而不是恢复合并,尽量真的很难

  • 平分问题然后修复它,
  • 或尝试恢复导致它的单个提交。

是的,它更复杂,不,它并不总是去上班(有时 的答案是:“哎呀,我真不应该把它合并,因为它不是 准备好着呢,我真的需要撤消合并的所有“)。因此,那么你真的应该恢复合并,但是当你想重新合并时,你现在需要通过恢复恢复来做到这一点。

+5

良好的链接(+1)。我冒昧地在您的答案中复制部分文件,以便读者立即看到本案中的相关选项。如果您不同意,请随时恢复。 – VonC 2009-07-03 11:00:28

+3

我们刚碰到一个案例,我们需要做到这一点,发现这里的乐趣并不完全停止。这是一个长期合并的分支,因此我们需要继续更新它。我的方法在这里:http://tech.patientslikeme.com/2010/09/29/dealing-with-git-merge-revisions/ – jdwyah 2010-09-29 15:07:51

+0

我跟着@ jdwyah的博客文章,这是光荣的(严重的是,这真是太棒了,它只是工作)。 – hellatan 2013-08-20 21:52:17

2

而不是使用git-revert你可以在devel分支扔都用这个命令离开(撤销)错误的合并提交(而不仅仅是恢复它)的。

git checkout devel 
git reset --hard COMMIT_BEFORE_WRONG_MERGE 

这也将相应地调整工作目录的内容。 注意

  • 保存在开发分支(因为错误的合并)的变化,因为他们太 将由git-reset删除。所有提交之后,您指定为 的git reset参数将会消失!
  • 此外,如果您的更改已从其他存储库 中取出,则不要执行此操作,因为重置将重写历史记录。

我推荐在试用之前仔细研究git-reset手册页。

现在,复位后,你可以在devel重新申请更改,然后做

git checkout devel 
git merge 28s 

这将是从28s真正合并到devel像最初的一个(也就是现在的 从Git的删除历史)。

29

让我们假设你有这样的历史

---o---o---o---M---W---x-------x-------* 
      /      
     ---A---B 

其中A,B未能提交和W - 正在恢复中号

的所以我才开始修复发现的问题我不W的摘樱桃承诺我的分支

git cherry-pick -x W 

然后我恢复W¯¯提交我的分支

git revert W 

之后我可以继续修复。

最终的历史可能看起来像:

---o---o---o---M---W---x-------x-------* 
      /     / 
     ---A---B---W---W`----------C---D 

当我发PR它会清楚地表明,PR是撤销还原并增加了一些新的提交。

2

要恢复的复归没有搞砸了您的工作流程太多:

  • 创建开发
  • 还原的还原承诺上的本地副本开发
  • 合并是复制到的本地垃圾副本你功能分支,并将你的功能分支推送到你的git服务器。

当您准备好时,您的功能分支应该能够正常合并。这里唯一的缺点是你会在历史中有一些额外的合并/还原提交。

1

我刚刚在面对同样的问题时发现了这篇文章。我发现上面的wayyy可怕的做重置困难等我最终会删除我不想要的东西,并将无法取回它。

取而代之,我检出了我希望分支返回的提交。 git checkout 123466t7632723。然后转换成分支git checkout my-new-branch。然后我删除了我不再需要的分支。当然,这只有在你能够抛弃你搞砸的分支时才有用。