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

树结构是什么样子的:

Git log output

有帮助吗?

解决方案

你必须“恢复恢复”。取决于你如何恢复它,它可能不像听起来那么容易。看着那(这 关于这个主题的官方文档.

---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 会不假思索地做到这一点。

因此,从技术角度来看,重新合并没有错,但是 从工作流程角度来看,您通常应该尝试避免.

例如,如果可能的话,如果您发现被合并到主树中的问题, 而不是恢复合并,尝试 真的 难以:

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

是的,这更复杂,不,它并不总是能起作用(有时答案是:“糟糕,我真的不应该合并它,因为它还没有准备好,我真的需要撤消 全部 合并”)。因此,您确实应该恢复合并,但是当您想重新进行合并时,您现在需要通过恢复恢复来完成。

其他提示

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

---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是撤消还原并增加了一些新的提交。

要在不过度破坏工作流程的情况下恢复恢复:

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

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

要在GIT还原一个复归:

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

而不是使用 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的历史中删除)。

我面临同样的问题时,才发现这个帖子。我发现上面wayyy吓人做复位顽固派等我将最终删除的东西我不想,也不会能够把它找回来。

相反,我检查了承诺,我想分支回到如git checkout 123466t7632723。然后转换到分支git checkout my-new-branch。然后我删除我不希望有更多的分支。当然,如果你能扔掉你搞砸了分公司,这只会工作。

我建议你按照下面的步骤来恢复一个复归,说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. 在原始合并之前的提交时创建新分支 - 将其称为“开发基础”
  2. 在“develop-base”之上执行“develop”的交互式变基(即使它已经位于顶部)。在交互式变基期间,您将有机会删除合并提交和反转合并的提交,即从 git 历史记录中删除这两个事件

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top