我有两个 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。
我需要使用什么命令来执行此操作?
当签出另一个分支时(不是
A
):
运行:
git branch -f A 6
git checkout A
git reset --hard 6
这是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。