如何在不切换到分支的情况下快进分支?

时间:2013-10-31 17:26:38

标签: git branch git-branch

我目前在我的master分支上,我的舞台很脏。我不想承诺,我已经有太多的藏匿处存放我的变化(或者我太懒了?)。

我想快速转移一些分支而不切换到它们(记住,我的舞台很脏)。

我如何快速optimmobile?还是optimmaster(我目前的分支机构)?

图片:http://i.stack.imgur.com/WUPeq.png

2 个答案:

答案 0 :(得分:2)

注意:分支名称只是指向(单个)提交的指针。我们倾向于将其视为“分支” - 整个提交链 - 通过从每个提交向后工作到其父代来找到。父母只记录在提交本身,而不是任何分支名称。将分支名称视为粘贴到某个特定提交的粘滞便笺可能会有所帮助。我不能在文本中绘制它,所以我在下面以箭头(<--)绘制它。

将图像翻译成文本,旋转图像,做出一两个假设,然后截断一点以适应这个答案,你将展示:

                                        o...
                                       /
--o--M--o--o--o--o--o--o--o--o--o--o--o    <-- mobile
    /
---o                                       <-- optim, origin/optim

(这里“更新”的东西是向右,而不是在上面,并且省略了各种提交消息的文本。)

1

时发生“快进”
  • 您是“在分支机构上”,即HEAD是对分支名称的符号引用
  • 你要求git与另一个提交合并(通过名称或SHA1 ID;通常通过branch-name)
  • 并且,“merge with”commit是“直接”分支现在的位置,即,可以简单地沿着一些“后代”链接滑动分支名称以到达那里。 (更准确地说,HEAD提交是“待合并”提交的祖先。)

由于optim指向一个提交,其单个后代是合并提交M,并且该提交对于右边的每个小o都有一个后代,git可以滑动分支名称optim沿着提交链前进。

因此:

$ git checkout optim; git merge mobile

将标签向上和向右滑动到M,然后再向右滑动到mobile点的位置,给出:

                                        o...
                                       /
--o--M--o--o--o--o--o--o--o--o--o--o--o    <-- mobile, optim
    /
---o                                       <-- origin/optim

如果您想“手动”执行此操作,而无需执行任何其他操作,甚至没有“打开”该分支,您只需告诉git“请重新指向分支名称optim以定位相同的提交名称为mobile

$ git branch -f optim mobile

-f(或--force)标志表示继续更改现有标签的目标提交,而不是错误输出。

此命令不会检查操作是否为快进。 (当然普通git merge只检查是否要进行快进合并或“真正”合并。但是,你可以要求git merge--ff-only,即,如果操作是快进,则输出错误。)


1 获取和推送也应用相同类型的“快进”概念,因此这是“何时”,但不是“仅当”。

答案 1 :(得分:2)

使用git push . mobile:optim(是的,这是一个点)来快进optimmobile

相关问题