Git 取消合并后合并分支

Git merging branches after unmerging

我在 git 合并时遇到问题。我有 2 个分支,开发和功能。我做了什么:

  1. 我错误地将功能合并到开发中,所以我取消了它(git revert -m 1)
  2. 我将 develop 合并到 feature 中,但是它删除了我的 feature 分支中的所有代码更改,所以我取消了合并 ( git revert -m 1 )
  3. 我尝试创建另一个从开发到功能的合并,它没有显示任何变化。

现在,如何将 develop 中的所有代码合并到我的功能分支中而不丢失功能中的代码?

首先,回到合并功能分支之前的 develop 提交。然后,force-push 它到托管存储库:

# check out the (local) develop branch first
git checkout develop
# go back the commit you want to end up in there
git reset --hard abc123def456
# push it to the remote
git push --force-with-lease origin HEAD:develop

现在,您仍然拥有混乱的功能分支。为此,您实际上也这样做了。请注意,如果您没有远程分支,则最后一步将被省略。

就是说,如果您认为在某处遗漏了一些提交,请查看 git reflog。由此,您可以 re-trace 对存储库所做的大部分更改。如果您发现那里缺少一个提交,您可以 git cherry-pick 将其放入您想要的任何分支。

我想你现在明白了在恢复合并后不能再次合并相同的提交 ID,因为那些提交 ID 已经在历史中了。为了再次合并它们,您需要为它们提供新的提交 ID。

一般来说,如果您在 develop 等共享分支上搞砸了某些东西,那么除非您立即发现它,否则请重置它并可以在其他人开始使用它或合并其他人之前强制推出修复像你所做的那样,然后恢复,可能是最好的行动方案。

但是,对于您自己的 功能分支,通常您不需要还原,因为您可以随心所欲地重写自己的分支,而不会影响其他任何人。如果您可以重写您的分支,那么与其将最新的 develop 合并到其中,不如将您自己的分支变基到最新的 develop 上会更简洁一些。如果您还没有将您的分支合并到 develop,您通常可以在您的分支已经签出的情况下执行此操作:

git fetch
git rebase origin/develop

您可以随时进行。 (在活跃的回购中,我可能每天至少做几次。)

在您当前的情况下,您将无法这样做,因为您分支上的提交 ID 已经在 develop 中。所以这是第一次,您需要改为执行此操作(您的分支已经签出):

git fetch
git reset --hard <commit-before-merge-of-develop>
# Now use a fancy rebase to rewrite your branch on top of develop
git rebase --onto origin/develop <original-commit-from-develop>

请注意,<commit-before-merge-of-develop> 表示合并到 develop 之前分支上的提交 ID,而 <original-commit-from-develop> 表示分支的原始 merge-base [=12] =] 在你不小心将它合并到 develop 之前。换句话说,这是您分支上第一个 new 提交的父项。 “花哨的”rebase 将重写您分支上的所有 new 提交 ID,这样您就可以在准备就绪时再次将它们合并到 develop 中。