git:移动分支头

问题描述 投票:0回答:3

我有两个 git 分支,“A”和“B”,提交编号为 1 到 8。我的历史记录如下

1 -> 2 -> 3 -> 4[A] -> 5 -> 6 -> 7 -> 8[B]

我想改变它,让我的历史看起来像这样:

1 -> 2 -> 3 -> 4 -> 5 -> 6[A] -> 7 -> 8[B]

也就是说,我想将分支 A 的头从提交 4 移动到提交 6。

我需要使用什么命令来执行此操作?

git
3个回答
59
投票

当签出另一个分支时(不是

A
):

运行:

git branch -f A 6

17
投票
git checkout A
git reset --hard 6

10
投票

这是rebase的一个特例,只是分支为空:

git checkout A
git rebase B

rebase
比较笼统;它也处理这种情况:

之前:

                  A1 -> A2 -> [A]
                /
1 -> 2 -> 3 -> 4  -> 5 -> 6 -> 7 -> 8[B]

之后:

                                      A1' -> A2' -> [A]
                                     /
1 -> 2 -> 3 -> 4  -> 5 -> 6 -> 7 -> 8[B]

A1' 和 A2' 被合并以考虑父分支上 4 和 8 之间的增量。

Git rebase 可以轻松处理这种琐碎的情况。我创建了一个存储库,其中在

master
上有两个提交,并且一个分支
br
指向第一个提交。

$ git checkout br
Switched to branch 'br'
$ git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded br to master.

噗,完成。日志现在显示指向第二次提交的分支。

我们也可以实现这个“之后”:[感谢 M. Flaschen 指出这个缺失]:

                            A1'' -> A2'' -> [A]
                           /
1 -> 2 -> 3 -> 4  -> 5 -> 6 -> 7 -> 8[B]

我们不会将分支变基为 B,而是将特定提交命名为 6,例如

git checkout A
git rebase 6   # rather than rebase B

当没有 A1 和 A2 提交时,这就简化为原来的问题:将 [A] 指针从 4 移至 6。

© www.soinside.com 2019 - 2024. All rights reserved.