我有两个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。
我用什么命令来做这件事?
答案 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。