既然origin已经表示远程存储库中的master分支,是否有必要在'git push origin master'中写入'master'?

elcex8rz  于 2022-11-20  发布在  Git
关注(0)|答案(1)|浏览(192)

我想知道是否有必要使用master,因为origin不就已经意味着远程repo上的master分支了吗?
非常感谢你的帮助,你太棒了。

umuewwlo

umuewwlo1#

你提问的前提是错误的:origin * 并不 * 表示特定的分支。更具体地说,在git push origingit fetch origin(或任何类似的命令)中,单词origin出现在命令需要称为 remote 的地方,而不是命令需要分支名称的地方。
一个 remote 是......嗯,它有多种用途,但 main 是一个URL的简称。假设URL是:

https://github.com/someverylongusername/anotherverylongrepositoryname.git

哪个更容易输入,上面的,还是origin?Git让你使用origin来 * 平均 * https://...,而不必输入https://...
现在,如果运行:

git push

并省略 * origin * 和 * 分支名称,Git做了两个假设:1
1.我Git应该查找与 * 当前分支名称 * 关联的远程。
1.我Git应该使用 * 当前分支名称 * 作为分支名称。
请注意,这两个分支都使用(因此需要)* 当前分支名称 *。当前分支名称是您现在 checkout 的分支名称,因为您运行了:

git switch foobranch

或:

git checkout barbranch

如果最近一次切换或 checkout 是master,那么 current分支name就是master,您可能已经准备好了。您可以运行git pushgit push origin:包括origin的命令告诉Git所涉及的远程操作是origin,因此它可以跳过步骤1,但仍然执行这里的步骤2。
现在,有几种情况下,你 * 不能 * 省略远程和/或分支名称。而且,因为远程名称 * 总是在前面 *,如果你 * 必须 * 提供分支名称,你 * 也必须 * 提供远程名称。例如,如果你当前在你的feature/new上,但你想 * 推送 * 你的feature/old,你有两个选择:

  • 切换到feature/old并运行不带参数的git push,或者
  • 运行git push origin feature/old-不能在这里省略origin * 或 * feature/old,即使实际上只需要指定feature/old

这一切让人非常困惑的是,当您有一个 * 遥控器 * 时,您有 * 远程跟踪名称 *。2也就是说,如果您有一个名为origin的遥控器,您可能 * 还 * 有名称origin/masterorigin/main,加上origin/feature/new等等。这些名称都以origin/开头,这可以帮助你记住,这些是你自己的Git仓库的 * 副本 *,是你的Git软件在GitHub Git仓库中看到的名字,当你的Git调用GitHub软件并说要查看GitHub仓库时。
(Does这一切都有意义吗?你可能要通读几遍。克隆人如此相似,就像在一个聚会上,每个人都叫布鲁斯。布鲁斯让布鲁斯告诉布鲁斯,布鲁斯在找布鲁斯。这很清楚,很明显,对吗?那是五个不同的人。)
现在,有一个地方你可以使用origin,Git在这里寻找一个 * 分支或类似的名称 *,在 * 这个 * 例子中,origin意味着origin/HEAD,而origin/HEAD是Git所称的 * 符号引用 *。
1这两个假设只是Git 2.0以来的默认设置,但Git 1.x已经有十多年的历史了,只有少数系统还在使用它。但你可以 * 配置 * Git以旧的方式运行。这里还值得一提的是,当push.default设置为Git 2.0以来的simple时,没有参数的git push这只在当前分支有一个 upstream 集合的情况下才有效。
2Git文档正式称呼这些 * 远程跟踪分支名称 *。我喜欢省略 branch 这个词,因为它们显然 * 不是 * 实际的 * 分支 * 名称。它们只是 * 从 * 分支名称复制而来,就像在其他一些仓库中看到的那样。旧的Git文档对如何称呼它们也很奇怪,所以人们倾向于在这里使用很多混合的术语。

相关问题