【问题标题】:How does rebasing master on a "remote" local branch works?在“远程”本地分支上重新设置 master 是如何工作的?
【发布时间】:2014-10-24 01:18:44
【问题描述】:

我是 git 新手,我一直在关注这个 tutorial

我想我理解了大部分内容,直到我进入远程存储库。我理解的关于远程存储库的唯一概念是 git fetch 和 git remote。根据该教程, git fetch 通过 git remote 的 add 选项从指定的 url 获取远程存储库。它将存储库下载到“远程”分支中。如果我理解正确的话,它不是远程存储库中的分支,而是我从远程存储库下载的分支。它还不是我本地存储库的一部分,它仍然可以合并/重新定位到它(我的本地存储库)中。也许我错了,我在这里遗漏了一些东西,请随时纠正我。

现在,我觉得我完全不明白的是 git 如何设法将“远程”存储库重新定位到我的本地存储库。

我了解,当我对一个分支进行 rebase 时,它​​会将那个分支中的提交基于它最初分支的不同提交。我仍然必须将分支合并到我的主分支中。当我这样做时,实际上会发生什么?

git checkout master 
git fetch origin
git rebase origin/master

这不会将我的本地 master 分支重新设置为远程 master 分支吗?我一直在想这个picture

我将拥有本地 master 分支而不是功能,而不是 Master,我将拥有远程 origin/master 分支。除了 Master 并没有真正分支出 origin/master。

这不会删除我的本地分支 master 吗?这不会将我所有的工作都转移到“远程”存储库中吗?另外,在推送到真正的远程存储库之前,我不需要合并回来?

【问题讨论】:

  • 反之亦然。 git rebase origin/master 将您的提交重新设置在 origin/master 之上。
  • 你的意思是把 origin/master 复制到我本地的 master 分支,然后添加新的提交?
  • 类似的东西。您可能已经看过它们,但我发现 official docs 很有帮助。

标签: git git-rebase git-remote git-fetch


【解决方案1】:

这里的关键是,rebase 与 git 中大多数1 其他与分支相关的项目一样,确实是根据 提交图 而不是分支名称。分支名称用于一两个目的:

  • 在提交图中定位提交,并且
  • 仅在适用的情况下:移动分支以使其指向正确的提交

所以如果你运行:

git checkout master
git fetch origin
git rebase origin/master

第一步让您“进入分支主控”:它只是将master 写入HEAD2(当然还会更新您的工作树)。

第二步从origin 获取您还没有的任何提交。这些进入您的存储库,扩充提交 graph,并更新 origin/master 以指向那里的最新提交。例如,您可能在fetch 之前有过这个:

            * - *   <-- HEAD=master
          /
..- o - o           <-- origin/master

一旦fetch 完成,并且你的 git-borg 已经添加了 origin 的生物和技术独特性,你现在拥有:

            * - *   <-- HEAD=master
          /
..- o - o - o       <-- origin/master

此时,您可以将您的两次提交(*s 中的)git rebase 放到新的origin/master 的尖端。这实际上是通过制作提交的副本来工作的:你会得到两个新的,它们与旧的相同,但有不同的父 ID:它们链接 origin/master 的新提示而不是旧的 (pre-fetch) 提示。制作副本后,git rebase 调整您的分支 master 以指向新的最尖端提交。

(并且,为了与 Borg 主题保持一致,您的原始提交仍在您的存储库中。一旦 reflog 条目过期,它们最终会被丢弃,默认情况下是 30 天。)


1这里的例外是只做分支名称的事情。例如,您可以使一个分支成为对另一个分支的间接引用。通常,这仅适用于HEAD。或者,您可以重命名一个分支,这与它指向的位置没有任何关系。

2更准确地说,它将ref: refs/heads/master 写入.git/HEAD。这就是“在一个分支上”所需要的:分支的全名放在那个文件中,加上“ref:(space)”前缀。

【讨论】:

  • +1,部分用于注意分支和提交之间的区别,部分用于漂亮的 ASCII 提交图,主要用于 git 同化
  • 感谢您的解释!您能否详细说明:“制作副本后, git rebase 会调整您的分支 master 以指向新的最尖端提交。”变基后本地分支master上不是什么都没有吗?提交不是移动到新获取的源/主节点的尖端吗?
  • @MinusFour:您可能会查看我的其他一些答案,例如stackoverflow.com/a/25222144/1256452,其中我显示旧的“已放弃”提交仍在回购中,只要您能找到就可以恢复一种命名它们的方法。另外,在我谈论分支如何“自动前进”的地方寻找答案,例如,stackoverflow.com/a/21055585/1256452 ...在这种情况下,你不是“开启”origin/master(你不能)所以它 不动
  • 我想我现在明白了。该教程让我认为 rebase 实际上破坏了我的 master 分支以将其移出到 origin/master。现在我认为它只是更新了对更新提交的引用,这些提交也链接了源/主提交图。 master 现在包括新的提交以及 origin/master 中的任何内容。
  • @MinusFour:是的,完全正确。原始提交仍然存在,并且它们的内容已被复制到新提交中(几乎相同,只是差异足以重新定位),master 指向这些新副本的最顶端。
猜你喜欢
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2013-09-08
  • 1970-01-01
  • 2014-01-17
  • 2021-09-13
相关资源
最近更新 更多