git:移动分支头

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

我有两个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 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 6
git checkout A
。before案例与问题不匹配。在问题中,没有提交仅在A上。before案例是该问题的推广。A1和A2不存在。空列表是一个列表。您的after case也不匹配。[A] 指向8,而不是6。另外,我不确定这种泛化是否有助于回答最初的问题。
git-rebase
工作得很好,通过这样做,您可以将分支从[4]移动到[6]`。我会更新我的回复。不管是谁干的,你自己动手吧。这是使用分支跳转的高级用户界面进行跳转的正确方法。