git:移动分支头
我有两个git分支,“A”和“B”,提交编号为1到8。我的历史是这样的git:移动分支头,git,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的头从commit 4移动到commit 6 我使用什么命令来执行此操作?您可以运行: git checko
1 -> 2 -> 3 -> 4[A] -> 5 -> 6 -> 7 -> 8[B]
我想更改它,使我的历史记录如下所示:
1 -> 2 -> 3 -> 4 -> 5 -> 6[A] -> 7 -> 8[B]
也就是说,我想将分支A的头从commit 4移动到commit 6
我使用什么命令来执行此操作?您可以运行:
git checkout A
git reset --hard 6
git branch -f A 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]
我们将把特定的commit命名为6,而不是重定到分支B,例如
git checkout A
git rebase 6 # rather than rebase B
当没有A1和A2提交时,这就简化为原来的问题:将[A]指针从4移动到6。这是可行的,但这是一条“艰难的道路”。它工作的原因是,如果您“在一个分支上”(用git术语来说),
git reset--hard
为您移动分支。但是git branch-f
一步重新指向分支。有一个限制:git branch-f
不允许您移动当前分支。因此,如果您已经“在分支A上”(如git branch
output所示),您需要使用这个git reset--hard
方法。(或者离开分支A,但这太傻了。:-)在这种情况下这是有效的,因为A实际上不包含任何内容;它只指向分支点,因此我们将指针移到其他位置而不会丢失任何东西。假设A有一些承诺?然后,您必须执行一个git-rebase来执行提交。这是更一般的,应该也能处理这种“空分支”的琐碎情况。@Kaz,git有轻量级分支,所以它们从不“包含”任何东西。它们只是一个附在提交上的移动便签。我的答案是这个场景,一个线性分支历史。如果它不是线性的,我会看看OP到底想要什么,然后想出一个解决方案。你也可以这样说CVS。分支不包含任何内容。它只是一个分支标签(“便签”),表示像1.2.0.2这样的分支编号。CV是否具有轻型分支?:)在分支A上我不能这样做,所以我选择了@Ralphteninja的答案。@Jayen您仍然可以使用Matthew的解决方案,您只需先签出任何其他分支即可。如果A是您唯一的分支,只需执行git checkout-b temp即可<代码>吉特分行-f A 6git checkout A
。before案例与问题不匹配。在问题中,没有提交仅在A上。before案例是该问题的推广。A1和A2不存在。空列表是一个列表。您的after case也不匹配。[A] 指向8,而不是6。另外,我不确定这种泛化是否有助于回答最初的问题。git-rebase
工作得很好,通过这样做,您可以将分支从[4]移动到[6]`。我会更新我的回复。不管是谁干的,你自己动手吧。这是使用分支跳转的高级用户界面进行跳转的正确方法。