我们正在Git中执行还原的合并

我们正在Git中执行还原的合并,git,git-merge,git-revert,Git,Git Merge,Git Revert,我在这里遇到了一点问题:我在Git中有一个特定于问题的分支28s,我将其合并到generaldevelop分支中。原来我做得太快了,所以我用git revert撤消合并。然而,现在是将28s合并到develope中的时候了,但是git merge命令看到了最初的合并,并愉快地宣布一切都很好,分支已经合并。我现在该怎么办?创建“还原”还原“28s->开发”“提交?这似乎不是一个好办法,但我现在无法想象还有其他办法 树结构的外观: 您必须“还原还原”。取决于您如何还原原始版本,它可能不像听起来那么容

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

树结构的外观:

您必须“还原还原”。取决于您如何还原原始版本,它可能不像听起来那么容易。看这张照片

允许:

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D
但这一切都有效吗?当然有。您可以还原合并,也可以从 纯粹从技术角度来看,git做得很自然,没有真正的优势 麻烦。
它只是认为这是从“合并前状态”到 “合并后的状态”,就是这样。
没有复杂,没有奇怪, 没有什么真正危险的。Git甚至不会去想它

因此,从技术角度来看,恢复合并没有错, 但是从工作流的角度来看,您通常应该尝试这样做 避免

如果可能的话,例如,如果您发现一个问题被合并了 在主目录树中,而不是还原合并,请尽全力执行以下操作:

  • 将问题平分到合并的分支中,然后修复它
  • 或者尝试还原导致它的单个提交
是的,它更复杂,不,它不总是能工作(有时) 答案是:“哦,我真的不应该合并它,因为它不是 准备好了吗,我真的需要撤销所有的合并”)。那么你呢 确实应该恢复合并,但如果要重新执行合并,则 现在需要通过还原还原来执行此操作


您可以在
devel
分支中使用此命令来丢弃(撤消)错误的合并提交,而不是使用
git revert

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

  • 将更改保存到“开发”分支中(因为合并错误),因为它们 也会被git reset清除。在指定为的提交之后的所有提交
    git reset
    参数将消失
  • 另外,如果您的更改已经从其他存储库中提取,请不要这样做 因为重置将重写历史记录
我建议在尝试此操作之前仔细研究
git reset
手册页

现在,重置后,您可以在
devel
中重新应用更改,然后执行以下操作

git checkout devel
git merge 28s
这将是从
28s
devel
的真正合并,就像最初的合并(现在是
从git的历史记录中删除)。

让我们假设您有这样的历史记录

---o---o---o---M---W---x-------x-------*
              /                      
      ---A---B
其中A、B提交失败,W-是M的还原

因此,在我开始修复发现的问题之前,我会认真挑选W,并将其提交给我的分支机构

git cherry-pick -x W
git revert W 
然后我在我的分支上回复W commit

git cherry-pick -x W
git revert W 
之后我可以继续修理

最终的历史可能如下所示:

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

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

要还原还原,而不会过多地扰乱您的工作流程,请执行以下操作:

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

您的功能分支现在应该可以在准备就绪时正常合并。这里唯一的缺点是,您的历史记录中会有一些额外的合并/还原提交。

我在遇到同样的问题时发现了这篇文章。我发现上面的方法很可怕,我会删除一些我不想删除的东西,并且无法恢复


相反,我签出了我希望分支返回的提交,例如,
git checkout 123466t7632723
。然后转换为分支
git签出我的新分支
。然后我删除了我不想要的分支。当然,只有当您能够扔掉弄乱的分支时,这才有效。

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

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

我建议您按照以下步骤还原还原,例如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
现在为分支机构创建PR
users/yourname/revertOfSHA1

  • 在原始合并之前提交时创建新分支-称之为“开发基础”
  • 在“开发基础”的顶部执行“开发”的交互式重基(即使它已经在顶部)。在交互式重新基址期间,您将有机会删除合并提交和反转合并的提交,即从git历史中删除这两个事件

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

    良好链接(+1)。我冒昧地在您的回答中复制了部分文档,以便读者能够立即看到本案例中的相关选项。如果你不同意,请随时回复。我们刚刚遇到了一个需要这样做的案例,发现乐趣并没有到此为止。这是一个合并的长期运行的分支,所以我们需要继续更新它。我的方法是:@jdwyah这似乎是一个断开的链接,但听起来很有趣。这里有一个archive.org镜像,但它缺少图像:博客帖子已经复活,谢谢:我也跟着@jdwyah帖子。它工作得很好,我只会将“git revert SHA_OF the_MERGE_revert_REVERSION”更改为“SHA_OF the_revert_MERGE”或类似的内容。它是GitX()