如何在Git中回退到几个提交之前的分支?

3

以下是当前的分支设置:

A---B---C-----------------D---E---F master
         \
          G---H---I---J---K---L branchA

当我开始在branchA上工作时,我意识到最近的几个提交是为了一个新功能,应该是一个新的分支。因此,我想让树看起来像这样:

A---B---C-----------------D---E---F master
         \
          G---H---I------------M branchA
                   \
                    J---K---L branchB

我不想重命名分支,因为这将把G、H和I也改成新的分支名称。我可以创建一个新的分支,从I开始 (git branch branchB <SHA-of-I>),但如何最好地“移动”提交J、K和L呢?在branchB上执行git merge branchA只会快进branchB头指针到与branchA相同的点。


1
“move commits JKL” 是什么意思?当你在那里创建分支 B 时,它们就在分支 B 上了,正如所期望的那样。剩下要做的就是将 branchA 重置回 I,并执行创建提交 M 的操作(它是从哪里来的?)。 - Cascabel
J、K 和 L 是最初错误提交,它们被添加到 branchA 中,需要成为它们自己的分支(branchB)的一部分。 - MidnightLightning
没错。但这并不意味着它们需要被移动到其他地方。除非在JKL之前的branchA上有任何 不应该 在branchB上的内容,否则只需在branchA当前位置创建branchB,然后将branchA移回到I。 - Cascabel
是的,在 JKL(GH 和 I)之前,branchA 上有提交。 - MidnightLightning
3个回答

6

您无需移动 J、K 和 L。您希望它们在 branchB 上吗?将 branchB 指向提交 L 即可。

git branch branchB branchA    # start branch B at commit L
git checkout branchA
git reset --hard <SHA1-of-I>

# If you don't want to check out branchA, you could use
#     git branch -f branchA <SHA1-of-I>

需要移动的是分支A,将其移回到提交I。
如果已经进行了提交M,则需要使用rebase。不要重置分支A,而是使用git rebase --onto <SHA1-of-I> <SHA1-of-L> branchA将分支A上从提交L开始的所有内容移动到提交I上。

就是这样!提交 M 是一些新的提交(实际上应该在 branchA 上),而我缺少的命令是 git reset --hard。谢谢! - MidnightLightning

0

0

我不明白你对于 G、H、I 出现在 branchB 而不是 branchA 的担忧。我的意思是,如果你将 branchA 重命名为 branchB,然后从 I 分支出新的 branchA,并将 M 提交到 branchA,你应该能够得到你想要的结果。

据我所知,分支只是指向特定提交的命名引用(查看 .git/refs/heads),而树的其余部分仅由 git 中的父子关系确定。即使你以某种方式将 J-K-L 变基到新的 branchB,并将 M 提交到现在空出的位置,对象数据也将是相同的。M 和 J 都将指向 I 作为它们的父级,G/D 将指向 C 作为它们的父级,其余部分将简单地指向它们的直接父级。我有什么遗漏吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接