我目前在我的master
分支上,我的舞台很脏。我不想提交,而且我已经有太多的存储空间来存储我的更改(或者我太懒了?)。
我想快速向前移动一些分支而不切换到它们(记住,我的舞台很脏)。
我怎么能快optim
进mobile
?还是optim
到master
(我当前的分支)?
图片:http: //i.stack.imgur.com/WUPeq.png
我目前在我的master
分支上,我的舞台很脏。我不想提交,而且我已经有太多的存储空间来存储我的更改(或者我太懒了?)。
我想快速向前移动一些分支而不切换到它们(记住,我的舞台很脏)。
我怎么能快optim
进mobile
?还是optim
到master
(我当前的分支)?
图片:http: //i.stack.imgur.com/WUPeq.png
注意:分支名称只是指向(单个)提交的指针。我们倾向于将其视为“分支”——整个提交链——是通过从每个提交向后工作到其父级来找到的。父母只记录在提交本身中,而不是任何分支名称中。将分支名称视为粘贴到某个特定提交上的便签可能会有所帮助。我无法在文本中绘制它,所以我将其绘制为下面的箭头 ( <--
)。
将您的图像转换为文本,旋转它,做出一两个假设,并截断一点以很好地适应这个答案,您将展示:
o...
/
--o--M--o--o--o--o--o--o--o--o--o--o--o <-- mobile
/
---o <-- optim, origin/optim
(这里“较新”的东西在右边,而不是在上面,并且省略了各种提交消息的文本。)
“快进”发生在以下情况:1
HEAD
是一个分支名称的符号引用HEAD
提交是“待合并”提交的祖先。)由于optim
指向一个提交,其单个后代是合并提交,并且该提交对于右侧M
的每个小节点都有一个后代,因此 git 可以沿着该提交链向前滑动分支名称。o
optim
因此:
$ git checkout optim; git merge mobile
将标签向上和向右滑动到 M,然后再向右滑动到 wheremobile
点,给出:
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
or --force
) 标志表示继续更改现有标签的目标提交,而不是出错。
此命令不检查操作是否为快进。(当然,plaingit merge
只检查它来决定是进行快进合并还是“真正的”合并。但是,您可以要求git merge
执行--ff-only
,即,如果操作不是快进,则出错。)
1 Fetch 和 push 也应用相同的“快进”概念,所以这是“when”而不是“only when”。
使用git push . mobile:optim
(是的,这是一个点)快进optim
到mobile
.