在Git中重新做一个归并

我在这里遇到了一个小问题:我在Git中有一个特定于问题的分支28s,我将它合并到通用的develop分支中。结果发现我做得太快了,所以我使用git-revert来撤销合并。然而,现在已经到了将28s合并到develop的时候了,但是git-merge命令看到了原始的合并,并高兴地宣布一切正常,分支已经合并。我现在该怎么办?创建一个'Revert "Revert "28s -> develop"" ' commit?这似乎不是个好办法,但目前我想不出还有什么别的办法。

树的结构是什么样子的:

Git log output

160769 次浏览

你必须“还原还原”。取决于你是如何还原原始文件的,它可能不像听起来那么容易。看看关于这个主题的官方文件

---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做得很自然,没有什么实在的 麻烦。< br > 它只是认为这是从“合并前的状态”到 "state after merge",就是这样。
没有复杂,没有奇怪, 没什么特别危险的。

. Git会毫不犹豫地执行它 所以从技术角度来说,还原归并并没有什么错, 但是从工作流的角度来看,这是你通常应该尝试的 避免< /强>。< / p >

如果有可能,例如,如果你发现一个问题被合并了 进入主树,与其恢复合并,不如尝试really hard to:

  • 把问题分成你合并的分支,然后修正它,
  • 或者尝试恢复引起它的单个提交。
是的,它更复杂,不,它并不总是有效(有时) 答案是:“哦,我真的不应该合并它,因为它不是 准备好了,我真的需要撤消合并的所有”)。然后你 应该恢复合并,但是当你想重新合并时,你 现在需要通过还原还原来实现。

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

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE

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

  • 保存更改在开发分支(因为错误的合并),因为他们 git-reset. too将被删除。所有提交都在您指定的之后 git reset参数将消失!李< / > 此外,如果您的更改已经从其他存储库中取出,则不要这样做 因为重置将重写历史

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

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

git checkout devel
git merge 28s
这将是一个真正的合并,从28sdevel,就像初始的一个(现在是

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

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

哪里A, B失败的提交和W -是恢复M

所以在我开始修复发现的问题之前,我选择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是撤销恢复,并添加一些新的提交。

要在不破坏工作流程的情况下还原还原:

  • 创建一个develop的本地垃圾副本
  • 在develop的本地副本上恢复恢复提交
  • 将该副本合并到您的特性分支中,并将您的特性分支推到您的git服务器。

当你准备好了,你的特征分支现在应该可以正常合并了。唯一的缺点是在历史记录中会有一些额外的合并/恢复提交。

当我遇到同样的问题时,我发现了这篇文章。我发现上面的方式是可怕的做重设顽固性等。我最终会删除一些我不想删除的东西,并且无法恢复。

相反,我签出了我想让分支返回到e.g. git checkout 123466t7632723的提交。然后转换为分支git checkout my-new-branch。然后我删除了我不再需要的分支。当然,这只有在你能够扔掉你搞砸的分支的情况下才会起作用。

要在GIT中恢复一个恢复:

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

我建议您按照以下步骤恢复一个恢复,比如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

  1. 在最初的合并之前在提交时创建新的分支-称其为' development -base'
  2. 在' development -base'之上执行'develop'的交互式重基(即使它已经在顶部)。在交互重基期间,你将有机会删除合并提交和反转合并的提交,即从git历史中删除这两个事件

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