在Git中,与"origin master"相比,"origin/master"是什么意思?

12
我想将这个问题作为对@KevinBallard的回答的评论添加在这里:“origin master”与“origin/master”的区别是什么,但我的评论太长了。
所以我的问题是: 如果我在一个名为topic的分支中,是否可以只写git rebase master而不是git rebase origin/master?或者真的有两个不同的本地master分支吗?一个是远程主分支的副本,另一个是我的本地主分支?如果是这样的话:当我git pull时,这两个本地主分支(一个称为origin/master,另一个只称为master)都会更新吗?我很困惑...
或者也许是这样的:origin/master是实际远程主分支的本地副本,远程分支被获取后被覆盖,我的名为master的本地分支仅在我执行git merge origin/master(或git rebase …)时才更改。也就是说:当我执行git pull origin master时,我的本地副本origin/mastermaster都会被更新/合并。当然,假设我当前在主分支(即git checkout master是我的上一次检出)。
4个回答

22
  • master是本地分支。
  • origin master是名为origin的远程代码库上的master分支。
  • origin/master是你本地的origin master副本。

当你执行git pull命令(我认为它是恶魔,请问还有其他人吗?),它会自动执行以下操作:

  • git fetch:将origin master复制到origin/master中(将所有其它origin xxx分支复制到origin/xxx中)。
  • git merge:将origin/master合并到master中。

当你想要变基(master)时,必须执行以下操作:

  • git fetch
  • git rebase origin/master

来自git help pull的摘录:

更确切地说,git pull会使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。


“and all other origin xxx into origin/xxx”:啊,真的吗?那很有趣。它获取所有内容,但只自动合并主分支。谢谢。 - erik
“git merge”:它将“origin/master”合并到“master”中,但仅当我当前在分支“master”中时,是吗? - erik
@erik 我添加了一个man页面的摘录,其中解释说如果没有参数,你调用git fetch(它会获取所有分支),然后在当前分支中执行合并。 - Arnaud Denoyelle
@erik 个人而言,我从不使用 git pull。我总是使用 git fetch 命令来获取所有分支,然后使用 git merge origin/xxxgit rebase origin/xxx 进行变基/合并。 - Arnaud Denoyelle
1
就此而言,git pull --rebase - Simon Boudrias
显示剩余2条评论

6
"

<remote>/<branch>命名的分支由Git自动管理。

当您执行git pull时,Git实际上执行以下操作:

"
git fetch  
git merge origin/master

git fetch 命令会自动更新本地的 origin/master 分支,使其指向远程的 master 分支最新的提交记录。

因此,当你执行 git pull 命令时,这两个分支都会被更新。这是因为 fetch 更新了 origin/master 分支,而 merge 则更新了 master 分支。

如果我在名为 topic 的分支中,是否可以只写 git rebase master 而不是 git rebase origin/master?

可以,但是 master 分支不一定等同于 origin/master 分支,尽管大多数情况下它们是相同的。所以这完全取决于你。

或者说实际上有两个不同的本地 master 分支吗?

是的,它们是两个不同的本地分支。它们通常指向相同的提交记录并共享一个公共的树。


1
当你在任何分支上执行git pull时,实际上会执行两个操作:git fetchgit [merge|rebase]
抓取只是从远程仓库(默认称为origin)下载所有对象。下载的对象中包括引用-它们是指向某些具体提交的指针。其中一些指针被称为分支。如果远程仓库中有master分支,则它将保存为origin/master在您的本地仓库中-只是为了不与具有相同名称的本地分支发生冲突。
抓取后,git查看配置,并默认尝试将当前分支合并或变基到与origin具有相同名称的分支上。
在配置中,您可以指定哪个本地分支将重新基于哪个远程分支-因此您可以简单地运行git pull而无需添加其他参数。

相同的名称是什么意思?你是指,如果我在名为topic1的分支中,并且只使用git pull命令拉取,它实际上执行的是git pull origin topic1(如果origin是我的默认远程)吗?而git pull origin topic2将分支topic2拉入到我的当前分支(无论我的当前分支叫什么)? - erik

1
分支只是对提交点的引用。标签也是指向提交点的引用,但分支与标签不同,因为在某些情况下,git会自动更新分支引用以指向另一个提交点。这些自动更新发生在你创建新的提交点(`git commit`)时,当前HEAD所在的分支会被更新以引用新创建的提交点。
Git维护两种类型的分支:本地和远程。本地分支按上述方式进行更新。当你执行`git fetch`时,远程分支会被更新。
此外,你可以有本地分支来跟踪远程分支,在这种情况下,`git pull`只是以下两个操作的便利方式:`git fetch; git merge origin/`。
注意,本地分支和跟踪的远程分支可能具有不同的名称。
因此,在你的情况下,当你说`git merge master`时,你正在合并你的本地主分支。当你说`git merge origin/master`时,你正在合并远程分支(最终可能指向与本地主分支相同的提交点)。
请注意,您需要合并的是分支指向的真正合并提交点(可以使用git merge <some commit>命令),而不是分支本身。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接