【问题标题】:How do I fast foward branches without switching to them?如何在不切换到它们的情况下快速前进分支?
【发布时间】:2013-11-11 20:11:38
【问题描述】:

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

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

我怎样才能将optim 快速转发到mobile ?或optimmaster(我当前的分支)?

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

【问题讨论】:

  • 如果你将你的存储命名为git stash save <"message">,你不应该有太多存储的问题。

标签: git branch git-branch


【解决方案1】:

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

将您的图像转换为文本,旋转它,做出一两个假设,并截断一点以很好地适应这个答案,您正在展示:

                                        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,并且该提交对于右侧的每个小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,即,如果操作出错不是快进。)


1Fetch 和 push 也应用相同类型的“快进”概念,所以这是“何时”而不是“仅当”。

【讨论】:

  • 谢谢,我真的经常(至少每周)使用它git branch -f late_branch newest_branch
  • @gasp:查看另一个答案和最后一条评论中的 ff 别名。
【解决方案2】:

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

【讨论】:

  • push 更新存储在远程的分支名称(然后移动origin/optim,本地副本“我上次发现远程设置了optim”);这不是一回事。 (不过,最终可能仍然是 OP 想要的。)
  • D'oh,我错了,. 表示远程 本地的,所以这工作正常并使用“推送”机制来检查这种变化是快进的。
  • ...还有一个别名 ff,看起来像这样:!f() { git push . $1@{u}:$1; }; f 非常方便。
  • @StefanNäwe:当我尝试使用该别名时,它给了我一个错误fatal: No upstream configured for branch 'test'(测试是我试图快进的分支)。有没有办法为此配置“本地”上游(独立于为任何远程仓库配置的任何上游?)
  • @Chris Dodd:“本地上游”是什么意思?
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 2010-10-03
  • 2019-12-13
  • 1970-01-01
  • 2020-05-31
  • 2022-12-15
  • 2018-06-28
  • 2022-01-13
相关资源
最近更新 更多