在Git中重新进行恢复合并

Tom*_*oss 207 git git-merge git-revert

我在这里遇到了一个问题:我28s在Git中有一个特定于问题的分支,我在一般develop分支中合并.事实证明我做得太快了,所以我使用git-revert来撤消合并.然而,现在是合并的时候28sdevelop,但是git-merge命令看到了原始的合并,并且愉快地宣布一切都很好并且分支已经合并.现在我该怎么做?创建'还原'还原"28s - >开发""提交?似乎不是一个很好的方法,但我现在无法想象任何其他.

树结构是什么样的:

Git日志输出

J-1*_*DiZ 153

你必须"恢复还原".取决于你是如何回复的,它可能不像听起来那么容易.查看有关此主题官方文档.

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D
Run Code Online (Sandbox Code Playgroud)

允许:

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D
Run Code Online (Sandbox Code Playgroud)

但这一切都有效吗?当然可以.你可以恢复合并,从纯粹的技术角度来看,git非常自然地做到了,没有真正的麻烦.
它只是认为它是从"合并前的状态"到"合并后的状态"的变化,就是这样.
没有什么复杂的,没有什么奇怪的,没有什 Git会在没有考虑它的情况下做到这一点.

因此,从技术角度来看,恢复合并没有任何问题,但从工作流角度来看,这通常是您应该尽量避免的.

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

  • 将问题平分到您合并的分支中,然后修复它,
  • 或尝试还原导致它的单个提交.

是的,它更复杂,不,它并不总是能够工作(有时答案是:"哎呀,我真的不应该合并它,因为它还没有准备好,我真的需要撤消所有的合并").那么你真的应该恢复合并,但是当你想重新进行合并时,你现在需要通过恢复恢复来做到这一点.

  • 博客帖子已经复活,谢谢:http://blog.jdwyah.com/2015/07/dealing-with-git-merge-revisions.html (15认同)
  • 良好的链接(+1).我冒昧地在你的答案中复制部分文件,以便读者在这种情况下立即看到相关选项.如果您不同意,请随时恢复. (8认同)
  • 我们遇到了一个案例,我们需要这样做,发现这里的乐趣并没有完全停止.这是一个已经合并的长期分支,所以我们需要继续更新它.我的方法在这里:http://tech.patientslikeme.com/2010/09/29/dealing-with-git-merge-revisions/ (5认同)
  • @jdwyah似乎是一个损坏的链接,但这听起来像是一个有趣的阅读。这是一个archive.org镜像,但缺少图像:https://web.archive.org/web/20111229193713/http://tech。Patientslikeme.com/2010/09/29/dealing-with-git-合并修订 (2认同)
  • @jdwyah 帖子的当前链接 https://blog.jdwyah.com/2015/07/07/dealing-with-git-merge-revisions.html (2认同)

Mak*_*yar 51

我们假设你有这样的历史

---o---o---o---M---W---x-------x-------*
              /                      
      ---A---B
Run Code Online (Sandbox Code Playgroud)

其中A,B失败提交,W - 恢复M

所以在我开始修复发现问题之前,我会选择W提交给我的分支机构

git cherry-pick -x W
Run Code Online (Sandbox Code Playgroud)

然后我在我的分支上恢复W commit

git revert W 
Run Code Online (Sandbox Code Playgroud)

我可以继续修复.

最终的历史可能如下:

---o---o---o---M---W---x-------x-------*
              /                       /     
      ---A---B---W---W`----------C---D
Run Code Online (Sandbox Code Playgroud)

当我发送PR时,它将清楚地显示PR是撤消还原并添加一些新的提交.

  • @Isochronous C 和 D 似乎是解决 A 和 B 引入的问题的提交。 (5认同)
  • 看起来它可能会有所帮助,但在细节上是如此稀疏(上图中的C,D是什么),它比有用的更令人沮丧 (3认同)

Sam*_*fel 8

要在不搞砸工作流程的情况下还原恢复,请执行以下操作:

  • 创建开发的本地垃圾副本
  • 还原本地副本上的还原提交
  • 将该副本合并到您的功能分支中,然后将您的功能分支推送到您的git服务器.

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

  • 谢谢你!这是唯一真正解释如何做到这一点的答案,而不是说你不应该这样做。真的很有帮助。 (2认同)

Ric*_*ard 7

要还原GIT中的还原,请执行以下操作:

git revert <commit-hash-of-previous-revert>
Run Code Online (Sandbox Code Playgroud)


knw*_*iss 5

而不是使用的git-revert,你可以在已经使用这个命令devel分支扔掉(撤消)错误的合并提交(而不仅仅是恢复它)。

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE
Run Code Online (Sandbox Code Playgroud)

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

  • 将您的更改保存在开发分支中(由于错误的合并),因为它们也会被git-reset. 在您指定为git reset参数之后的所有提交都将消失!
  • 此外,如果您的更改已经从其他存储库中提取,请不要这样做,因为重置将重写历史记录。

我建议git-reset在尝试之前仔细研究手册页。

现在,重置后您可以重新应用您的更改devel,然后执行

git checkout devel
git merge 28s
Run Code Online (Sandbox Code Playgroud)

这将是一个真正的融合28sdevel像最初的一个(现在是从Git的历史擦除)。

  • 对于那些不太熟悉 git 并且可能想要遵循以下说明的人:小心结合 `reset --hard` 和 `push origin`。另请注意,强制推送到原点可能真的会破坏 GitHub 上的开放 PR。 (11认同)