2

我目前在我的master分支上,我的舞台很脏。我不想提交,而且我已经有太多的存储空间来存储我的更改(或者我太懒了?)。

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

我怎么能快optimmobile?还是optimmaster(我当前的分支)?

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

4

2 回答 2

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;通常按分支名称)
  • 并且,“合并”提交是“直接”在分支现在所在的位置,即,可以简单地将分支名称沿着一组“后代”链接滑动以到达那里。(更准确地说,HEAD提交是“待合并”提交的祖先。)

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

因此:

$ 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

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

此命令不检查操作是否为快进。(当然,plaingit merge只检查它来决定是进行快进合并还是“真正的”合并。但是,您可以要求git merge执行--ff-only,即,如果操作不是快进,则出错。)


1 Fetch 和 push 也应用相同的“快进”概念,所以这是“when”而不是“only when”。

于 2013-10-31T18:15:45.970 回答
2

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

于 2013-10-31T19:27:06.053 回答