在Git中重新进行恢复合并

问题描述 投票:187回答:8

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

树结构是什么样的:

git git-merge git-revert
8个回答
146
投票

你必须“恢复还原”。取决于你是如何回复的,它可能不像听起来那么容易。看看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会在没有考虑它的情况下做到这一点。

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

如果可能的话,例如,如果您发现问题已合并到主树中,而不是还原合并,请尝试以下方法:

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

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


44
投票

我们假设你有这样的历史

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

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

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

git cherry-pick -x W

然后我在我的分支上恢复A提交

git revert W 

我可以继续修复。

最终的历史可能如下:

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

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


7
投票

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

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

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


5
投票

要在GIT中恢复还原:

git revert <commit-hash-of-previous-revert>

3
投票

您可以在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

这将是从28sdevel的真正合并,就像最初的那个(现在从git的历史中删除)。


1
投票

我遇到同样的问题时才发现这篇文章。我发现上面的方式可怕做重置硬盘等。我最终会删除我不想要的东西,并且无法取回它。

相反,我检查了我希望分支回到例如的提交。 git checkout 123466t7632723。然后转换为分支git checkout my-new-branch。然后我删除了我不想要的分支。当然,只有当你能够扔掉你搞砸的树枝时,这才有效。


1
投票
  1. 在原始合并之前在提交时创建新分支 - 称之为'develop-base'
  2. 在'develop-base'之上执行'develop'的交互式变换(即使它已经在顶部)。在交互式rebase期间,您将有机会删除合并提交和反转合并的提交,即从git历史记录中删除这两个事件

此时,您将拥有一个干净的“开发”分支,您可以像往常一样合并功能。


0
投票

我建议你按照以下步骤恢复恢复,比如SHA1。

git checkout develop #go to develop branch
git pull             #get the latest from remote/develop branch
git branch users/yourname/revertOfSHA1 #having HEAD referring to develop
git checkout users/yourname/revertOfSHA1 #checkout the newly created branch
git log --oneline --graph --decorate #find the SHA of the revert in the history, say SHA1
git revert SHA1
git push --set-upstream origin users/yourname/revertOfSHA1 #push the changes to remote

现在为分支users/yourname/revertOfSHA1创建PR

© www.soinside.com 2019 - 2024. All rights reserved.