撤消旧的快进提交

Undoing an old fast foreward commit

回顾我所做的一些工作,有一个快进的提交真的让人很难分辨在做什么​​,所以我想把那个提交移动到它自己的分支。这是我目前的情况:

A--B--C--D

假设 C 是我要移动的一个提交。 C 也(来自 FF 提交)有它自己的分支(branch2)。我希望它看起来像:

A--B--------C2--D
    \      / 
     \    /
      C--/

所以 C 在 branch2,C2 是合并提交,A、B 和 D 都在 master

这里有一些额外的信息:

$ git reflog show branch2
245c52c branch2@{0}: commit: C
7c2a064 branch2@{1}: branch: Created from HEAD

$ git reflog show master
c0a8aff master@{0}: commit: D
244c52c master@{1}: merge branch2: Fast-forward
8a93b2f master@{2}: commit: B
fe872d8 master@{3}: commit: A

如果你有:

 A--B--C--D (master)
       |
   (branch2)

您可以重置 master 并重做 merge (in a non-FF way), then cherry-pick D (or rebase,如果 D 实际上是多次提交)

git checkout master
git branch tmp # mark D if you need to
git reset --hard B
git merge --no-ff branch2

 A--B----C2
     \   /
      --C (branch2)
         \
          --D (tmp)

然后:

git cherry-pick D

如果 D 实际上由多个提交组成,'tmp' 分支会派上用场:

git rebase --onto master branch2 tmp

这将重播 branch2 之后的所有提交(因此不包括 C),直到 tmp HEAD(即 D)在 masterC2)之上