git:移动分支头

时间:2012-03-18 15:14:21

标签: git

我有两个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。

我用什么命令来做这件事?

3 个答案:

答案 0 :(得分:44)

你可以运行:

git branch -f A 6

答案 1 :(得分:13)

git checkout A
git reset --hard 6

答案 2 :(得分:7)

这是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上创建了一个包含两个提交的repo,并指向了第一个提交的分支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.

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

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

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

我们将命名特定的提交6,例如

,而不是重新定位到分支B.
git checkout A
git rebase 6   # rather than rebase B

当没有A1和A2提交时,这会减少到原来的问题:将[A]指针从4移动到6。