git:移动分支头

And*_*zos 30 git

我有两个git分支,"A"和"B",并提交编号为1到8.我的历史看起来像这样

1 -> 2 -> 3 -> 4[A] -> 5 -> 6 -> 7 -> 8[B]
Run Code Online (Sandbox Code Playgroud)

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

1 -> 2 -> 3 -> 4 -> 5 -> 6[A] -> 7 -> 8[B]
Run Code Online (Sandbox Code Playgroud)

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

我用什么命令来做这个?

Mat*_*hen 44

你可以运行:

git branch -f A 6
Run Code Online (Sandbox Code Playgroud)

  • @Kaz,git有轻量级分支,因此它们永远不会"包含"任何内容.它们只是附加到提交的移动便笺.我的答案是针对这种情况,一个线性分支历史.如果它不是线性的,我会看看OP实际上想要什么并提出解决方案. (6认同)

ral*_*nja 13

git checkout A
git reset --hard 6
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,但却是"艰难的方式".它的工作原理是,如果你是"在一个分支上"(用git术语),`git reset --hard <rev>`为你移动分支.但是`git branch -f <name> <rev>`一步重新指向分支.有一个限制:`git branch -f`不会让你移动你当前的分支.因此,如果你已经"在分支A上"(如`git branch`输出所示),你需要使用这个`git reset --hard`方法.(或者离开分支A,但那变得很傻.:-)) (7认同)

Kaz*_*Kaz 7

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

git checkout A
git rebase B
Run Code Online (Sandbox Code Playgroud)

rebase更一般; 它也处理这种情况:

之前:

                  A1 -> A2 -> [A]
                /
1 -> 2 -> 3 -> 4  -> 5 -> 6 -> 7 -> 8[B]
Run Code Online (Sandbox Code Playgroud)

后:

                                      A1' -> A2' -> [A]
                                     /
1 -> 2 -> 3 -> 4  -> 5 -> 6 -> 7 -> 8[B]
Run Code Online (Sandbox Code Playgroud)

合并A1'和A2'以解决父分支上4到8之间的增量.

Git rebase处理这个简单的案例没有麻烦.我创建了一个包含两个提交的repo 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.
Run Code Online (Sandbox Code Playgroud)

噗,完了.日志现在显示指向第二个提交的分支.

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

                            A1'' -> A2'' -> [A]
                           /
1 -> 2 -> 3 -> 4  -> 5 -> 6 -> 7 -> 8[B]
Run Code Online (Sandbox Code Playgroud)

我们将命名特定的提交6,而不是重新定位到分支B,例如

git checkout A
git rebase 6   # rather than rebase B
Run Code Online (Sandbox Code Playgroud)

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