在Git中,origin/master与origin master有什么区别?

418

我知道,origin是指远程仓库,而master则是该仓库的分支。

在Git命令行中,origin/masterorigin master有什么区别?是否有一种明确的方法来理解何时使用origin/master和何时使用origin master


3
可能是重复问题:Git 分支:master vs. origin/master vs. remotes/origin/master - Gabriel Moretti
3
可能这是一个重复的问题,但是@Dietrich Epp下面的回答清晰地解释了区别,而不会让这个问题更加混乱。 - Suncat2000
7个回答

540

(注意: 当此问题最初发布时,Git中分支的默认名称为“master”。由于现在的默认名称为“main”,因此已更新此答案以使用“main”,希望这对新接触Git的人更加自然。)

实际上有三个东西: origin main是两个单独的东西,origin/main是一个东西,总共三个东西。

两个分支:

  • main是一个本地分支
  • origin/main是一个远程跟踪分支(它是命名为“origin”的远程上命名为“main”的分支的本地副本)

一个远程:

  • origin是一个远程

origin/main是远程吗?

origin/main分支是本地的!每次从origin获取时,origin/main都会更新。但是,origin/main可能过时,甚至可能main不再存在于origin上。您可以使用--prune选项(-p)与git fetch一起使用,以自动删除如果所跟踪的分支被删除,则自动删除远程跟踪分支。

origin/main分支不是originmain分支的引用或指针。它是一个本地副本。

示例:分两步拉取

由于origin/main是一个分支,因此可以合并它。以下是分两步拉取的步骤:

第一步,从远程origin获取main。将获取origin上的main分支,并将本地副本命名为origin/main

git fetch origin main

然后将origin/main合并到main中。

git merge origin/main

然后,您可以将main中的新更改推回origin

git push origin main

更多示例

您可以通过名称获取多个分支...

git fetch origin main stable oldstable

您可以合并多个分支...

git merge origin/main hotfix-2275 hotfix-2276 hotfix-2290

你能使用不同的名字吗?

如果我不想,我的本地分支就不必被命名为main。它不必与远程分支具有相同的名称!假设我想将我的分支命名为alice,但仍然要跟踪origin/main

我可以很容易地这样做:

git checkout -b alice --track origin/main
你可以看到本地分支名为alice,但远程分支名为main,本地副本名称为origin/main。这完全没问题!可能会有点困惑,但也许你已经有一个不同的分支名为main,需要切换到另一个分支来处理不同的更改。

7
第一部分非常有用。我不知道更多的例子,特别是合并的例子如何适用。感谢您的回答。 Translated: 前面的部分非常有用。我没有想到更多的例子,特别是那个合并的例子如何适用。谢谢你的回答。 - Senthil Kumaran
1
因为当我执行 "git checkout origin/master" 命令时,会进入分离头状态。如果我确实有一个本地副本的远程主分支,为什么不能在其上工作、提交和添加呢?或者说我可以这样做,但为什么它是分离的呢? - stu
4
你只能提交到本地分支,当你切换到一个远程分支时,你会进入"游离头指针(detached head)"状态。当然,这是远程分支的本地副本,但它仍然是一个远程分支。 "master"与 "origin / master"没有任何相关规则,它们可能完全不同。 - Dietrich Epp
12
“origin是一个远程……”“origin”只是一个名称,您可以为远程库选择任何名称,但“origin”是默认名称。远程指的是其他地方的存储库,可能是GitHub,也可能是另一台计算机,甚至可能是同一台计算机上的其他位置。 - Dietrich Epp
3
"git remote add"是创建新远程的命令。 "origin"是所添加远程的名称。由于"origin"只是一个名称,您可以选择其他名称。例如,'git remote add home my-server: projects / my-project' 添加名为"home"的远程。建议参考文档:http://git-scm.com/docs/git-remote - Dietrich Epp
显示剩余13条评论

29

origin/master 是一个实体(因为它不是一个物理分支),代表远程 origin 上的 master 分支的状态。

origin master 是远程 origin 上的 master 分支。

所以我们有以下内容:

  • origin/master(指向远程分支的表示或指针)
  • master - (实际分支
  • <Your_local_branch>(实际分支
  • <Your_local_branch2>(实际分支
  • <Your_local_branch3>(实际分支

例如(在本地分支master中):

git fetch # get current state of remote repository
git merge origin/master # merge state of remote master branch into local branch
git push origin master # push local branch master to remote branch master

33
这是不正确的,origin master 不是一个分支,它实际上是两个独立的部分,"origin"(一个远程库)和 "master"(一个本地分支)。 - Dietrich Epp
远程主分支的状态在本地是存在的,对吧? - Senthil Kumaran
5
是的,这是不正确的,origin/master是远程主分支。本地分支只是主分支。 - Aniket Thakur
仅供将来参考)@AniketThakur,这可能有点令人困惑。实际上,origin/master也是一个_本地_分支,尽管它是远程跟踪分支。 - starriet
1
@starriet:是的,“master”通常是远程分支的名称。但要明确,在编写“git push origin master”时,该命令中的“master”是一个名为“master”的本地分支的refspec,并且默认情况下也将一个名为“master”的远程分支命名为远程分支。您可以执行类似于“git push origin master:my-cool-branch”的操作,在该命令中,“master”是本地分支,“my-cool-branch”是远程分支。 - Dietrich Epp
显示剩余2条评论

15

origin/master 是远程的 master 分支

通常在执行 git fetch origin 获取服务器上的所有更改后,您会执行 git rebase origin/master,以将您的更改重新应用并将分支移动到最新的索引。这里的 origin/master 是指远程分支,因为您实际上是在告诉 GIT 将 origin/master 分支重新应用到当前分支上。

例如,在推送时,您会使用 origin master。简单来说,git push origin master 是告诉 GIT 推送本地的 master 分支到远程仓库。


4
这似乎是最接近原帖所寻找的 - origin master 告诉软件对 'origin' 仓库中 'master' 分支上的内容做某些操作。origin/master 是一种引用方式,就像 f3a4d5HEAD 一样。 - Nemesarial

5

origin是远程git URL的名称。下面是更多示例。

bangalore => bangalore.example.com:project.git
boston => boston.example.com:project.git

就origin/master(例如bangalore/master)而言,它指向 bangalore 站点上 "master" commit 的指针。 你可以在克隆中看到它。

很有可能自从你进行了“fetch”或“pull”以来,remote bangalore已经更新了。


5
在讲解区别之前,我们需要了解 Git 中 origin 的含义。 origin 只是远程仓库的原始名称。Origin 只是一个位置而已。在下面的示例中,存储库 URL 是您代码所在的 origin 或真相来源。
git clone https://github.com/mycode/git-awsomecode.git 现在,这个 origin 或者你的存储库的真相来源可以有分支,包括 master 或 develop 或其他你想要的名字。
现在,在上下文中理解 origin 我们可以轻松地理解以下内容的含义。
1. origin master: 我是一个位于名为 (origin) 的远程仓库上的主分支。
那么如果我输入 git pull origin master 会发生什么?
这将使用远程主分支(即 origin master)中的所有更改更新我的本地主分支(在我的本地机器上)。
现在,我想将我的更改与我的本地主分支合并,该怎么做?

git merge origin/master

这将使用origin/master更新我的本地主分支与我的更改。命名为origin/master只是一种惯例,您可以将本地主分支命名为origin/master或abcd。因此,您可以将本地分支命名为master而不是origin/master,并且git的命令将是git merge master
如何使用所有本地更改更新远程主分支?

git push origin master

该命令表示将所有本地更改发送到origin(即存储库(https://github.com/mycode/git-awsomecode.git))到主分支。

2
git pull origin master 不是更新任何本地分支吗,而这可能并不是"本地主分支" 吗? - roulette01

5

考虑到您可以在网络电缆未插入的情况下切换到 origin/master (尽管是在脱离状态下),因此它必须是位于 originmaster 分支的本地表示。


1
在上下的回答中,人们说 origin/master 是远程主分支。你的回答有点与他们所说的相矛盾。请解释一下。 - Surya

-2

我建议使用该命令合并开发和主分支

git checkout master

git merge --commit --no-ff --no-edit develop

更多信息,请查看https://git-scm.com/docs/git-merge


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