什么是 "git remote add ..." 和 "git push origin master"?

323

很多时候,Git和Ruby on Rails看起来就像是魔法⋯⋯比如在Ruby on Rails 3教程书的第一章中,它讲到了Git:

git remote add origin git@github.com:peter/first_app.git
git push origin master
它基本上是说“它只是起作用”,没有过多说明是什么,就开始谈论分支。在互联网上搜索可以发现,git remote add用于添加“短名称”,例如origin,它可以是任何名称,就像是URL的别名。

origin通常指向远程存储库的路径(在http://git-scm.com/book/en/Git-Basics-Working-with-Remotes的“添加远程存储库”中)。

那么为什么URL不是git://git@github.com/peter/first_app.git,而是其他语法--它是什么语法?为什么必须以.git结尾?我尝试过不使用.git,它也可以工作。如果不是.git,它还可以是什么?git@github.com中的git似乎是Git服务器上的用户帐户?

此外,为什么使用git push origin master如此冗长?默认不能是origin和master吗?我发现第一次需要origin master,但进行小修改和提交后,git push就足够了(不需要origin master)。了解情况的人能否给出一些细节?

有时感觉很神奇而没有解释......有时使用它的人非常自信,当被问及原因时无法解释,并回答类似“这就是事实”的话。有时非常实用和务实。成为务实是不错的,但也许到了不知道正在发生什么的程度就不实用了。

6个回答

394

Git类似于Unix。它很友好,但对它的朋友很挑剔。它的功能和易用性几乎与shell管道一样强大和友好。

话虽如此,一旦您了解了其范例和概念,它具有与Unix命令行工具相同的禅意清晰度。您应该考虑抽出一些时间阅读在线上提供的许多优秀的Git教程之一。 Pro Git书是一个不错的起点。

回答您的第一个问题。

  1. git remote add ...是什么?

    您可能知道,Git是一种分布式版本控制系统。大多数操作都在本地完成。为了与外部世界通信,Git使用称为“远程”的东西。这些是除了本地磁盘上的另一个存储库,您可以将更改“推送”到其中(以便其他人可以看到它们)或从其中“拉取”(以便您可以获得他人的更改)。命令git remote add origin git@github.com:peter/first_app.git创建了一个名为origin的新远程地址位于git@github.com:peter/first_app.git。一旦这样做,您可以在推送命令中将其推送到 origin 而不是键入整个URL。

  2. git push origin master是什么?

    此命令表示“将本地名为 master 的分支中的提交推送到名为 origin 的远程”。执行此操作后,您上次与 origin 同步的所有内容都将发送到远程存储库,其他人将能够在那里看到它们。

现在讲一下传输方式(即 git:// 的含义)。远程仓库的 URL 可以是多种类型(file://https:// 等等)。Git 会依靠传输提供的认证机制来处理权限等方面的问题。这意味着对于 file:// URL,它将使用 Unix 文件权限等。而 git:// 方案则要求 Git 使用其自身的内部传输协议,该协议针对发送 Git changesets 进行了优化。至于确切的 URL,是因为 GitHub 设置了其 Git 服务器的方式。
再谈一下冗长性。你输入的命令是通用命令。可以告诉 Git 类似“这里称为主分支的分支是名为 bar 的远程分支 foo 的本地镜像”。在 Git 中,这意味着 master 跟踪 bar/foo。第一次克隆时,你将得到一个名为 master 的分支和一个名为 origin 的远程(从中克隆),本地 master 已设置为跟踪 origin 上的 master。
设置好后,只需运行 git push 即可。较长的命令是为了方便需要它的情况而存在的(例如,git push 可能会推送到官方公共仓库,而 git push review master 可用于推送到团队用于代码审查的单独远程)。你可以使用 git branch 命令的 --set-upstream 选项将分支设置为跟踪分支。

我觉得 Git(与我使用过的大多数其他应用程序不同)更容易从内部理解。一旦你了解了存储和维护库内数据的方式,命令及其功能就会变得清晰明了。我同意你所说的 Git 用户中存在某种精英主义,但我也曾经在 Unix 用户中发现过这种情况,值得克服难关去学习系统。祝好运!


9
在你的段落中,你可能需要添加一条关于传输的说明,解释git@github.com:peter/first_app.git是Git中SSH URL的scp样式语法。另外一点是,默认情况下,master的上游配置不会影响到git push的行为,除非你将push.default设置为tracking(或后来版本中的upstream) - 我在我的博客文章中对这个引起困惑的问题进行了说明:http://longair.net/blog/2011/02/27/an-asymmetry-between-git-pull-and-git-push/。 - Mark Longair
1
对那个评论进行小修正 - 没有 push.default,在使用 git push 时将使用上游配置来查找默认远程,但不会影响引用的映射。 - Mark Longair
3
就黑盒子和从内到外的学习而言,Git是我遇到的第一件比从“界面”学习更容易的事情。这是否是正确的方法还有待商榷。我只是想说,在使用Git时,从内而外的学习方式更加有效。 - Noufal Ibrahim
10
"Git就像UNIX一样,对用户友好但对它的朋友挑剔。" 这句话很棒,我希望能把它印在T恤上。 - chrislatimer
1
@MinhTran 是的,你可以。origin通常用作你最初克隆的位置,但你完全可以给它取其他名字。这只是一个名称而已。 - Noufal Ibrahim
显示剩余8条评论

44
更新:请注意,当前被接受的答案延续了一个针对 普遍误解 的描述,即关于 git push 行为的,尽管已经有评论指出这一点但还没有得到纠正。

关于远程仓库是什么的总结 - 就像一个与存储库URL相关的昵称 - 是正确的。

那么为什么URL不是 git://git@github.com/peter/first_app.git,而是另一种语法 -- 它是什么语法?为什么必须以 .git 结尾?我尝试过不在结尾使用 .git 也可以,如果不是 .git,还能是什么?开头的 git 似乎是Git服务器上的用户帐户?

你提到的两个 URL 意味着应该使用两种不同的传输协议。以 git:// 开头的是 Git 协议,通常只用于对存储库的只读访问。而另一个 URL git@github.com:peter/first_app.git,是指定通过 SSH 访问存储库的不同方式之一 - 这是 文档 中描述的“scp风格的语法”。在 scp 风格的语法中,用户名为 git 是因为 GitHub 处理用户标识的方式 - 基本上忽略了该用户名,并根据用户用来验证的 SSH 密钥对进行标识。

至于 git push origin master 的冗长性,你已经注意到在第一次推送后,你可以只使用 git push。这是由于一系列难以记住但通常有帮助的默认设置:)

  • 如果没有指定远程分支,则使用当前分支配置的远程分支(在你的情况下为 remote.master.url)。如果未设置,则使用 origin
  • 如果没有指定“refspec”(例如 mastermaster:my-experiment 等),则 Git 默认将推送每个具有与远程分支相同名称的本地分支。如果您只在您的存储库和远程存储库之间共享一个名为 master 的分支,则与将您的 master 推送到远程 master 相同。

就我个人而言,由于我倾向于拥有许多主题分支(并且通常有几个远程存储库),我总是使用以下形式:

git push origin master

...避免意外推送其他分支。


针对你在其他回答中的评论,我觉得你已经通过自顶向下的方式非常有效地学习了Git - 你发现默认设置可以工作,而你的问题是想知道为什么。更严肃地说,Git可以像SVN一样简单地使用,但了解一些关于远程和分支的知识可以让你更加灵活地使用它,并且这可以真正改变你的工作方式,使之变得更好。

你关于一个学期课程的评论让我想起了Scott Chacon在一次播客采访中说过的一句话 - 计算机科学和软件工程的课程教授了各种基本工具,但很少有人教版本控制。分布式版本控制系统如Git和Mercurial现在非常重要且非常灵活,值得教授相关课程来给人们提供良好的基础。

我的看法是,对于Git,这个学习曲线绝对是值得的 - 在许多主题分支上工作,轻松地合并它们,并在不同的代码库之间推拉它们,一旦你对该系统变得自信,这是极其有用的。只不过不幸的是:

  • Git的主要文档对于新手来说很难理解。(尽管我认为,如果你谷歌任何Git问题,现在都会出现有用的教程材料(或Stack Overflow答案:))
  • Git中有一些奇怪的行为,现在很难更改,因为许多脚本可能依赖于它们,但对人们来说却很令人困惑。

我认为《Pro Git》这本书是一份很好的资源,对于新手来说也很容易理解。它大大地平缓了学习曲线。此外,我认为试图将SVN和其他集中式概念映射到git上会使道路变得更加困难,而不是更加顺畅。根据我的经验,完全重置是一种更快、更简单的方式。 - Noufal Ibrahim
@Noufal Ibrahim:我同意你的所有观点。 我并不是想建议将“映射”SVN概念到git上,因为我知道那会引起可怕的混乱 - 有更好的方法从上到下教授git。 - Mark Longair

19

看一下添加远程仓库的语法。

git remote add origin <url_of_remote repository>

例子:

git remote add origin git@github.com:peter/first_app.git

让我们来解析这个命令:

git remote用于管理托管Git版本库的中央服务器。

也许你正在使用GitHub作为你的中央版本库。我会给你一个例子并解释git remote add origin命令。

假设我正在使用GitHubBitbucket作为Git版本库的中央服务器,并在这两个网站上为我的first-app项目创建了版本库。

现在,如果我想将更改推送到这两个Git服务器,那么我需要告诉Git如何连接这些中央版本库。所以我必须添加这些内容:

对于GitHub:

git remote add gh_origin https://github.com/user/first-app-git.git

对于Bitbucket

git remote add bb_origin https://user@bitbucket.org/user/first-app-git.git

我用了两个变量(方便叫它们变量)gh_origin(gh代表GitHub)和bb_origin(bb代表Bitbucket),只是为了向你解释我们可以把源称为任何想要的东西。

现在,在进行一些更改后,我将不得不将所有这些更改发送(推送)到中央仓库,以便其他用户可以看到这些更改。因此,我称之为

推送到GitHub

git push gh_origin master

推送到 Bitbucket

git push bb_origin master

gh_origin 的值是 https://github.com/user/first-app-git.git,而 bb_origin 的值是 https://user@bitbucket.org/user/first-app-git.git

这两个变量让我的生活更加轻松

因为每当我需要发送我的代码更改时,我只需使用这些变量,而无需记住或键入相同的URL。

大多数情况下,除了 origin 以外,您将只与一个中央存储库(比如GitHub或Bitbucket)打交道,因此您不会看到其他任何东西。


7
  1. 仓库名结尾的.git只是一个约定。通常,Git服务器上的存储库保存在以project.git命名的目录中。当只指定project时,Git客户端和协议遵循此约定通过测试project.git来进行。

  2. git://git@github.com/peter/first_app.git不是有效的Git URL。可以通过不同的URL方案指定这里列出的各种Git存储库,并访问它们。git@github.com:peter/first_app.git是该页面上提到的ssh URL。

  3. Git是灵活的。它允许您跟踪任何存储库的任何分支对应于本地分支。虽然master(本地默认分支)跟踪origin/master(远程默认分支)是一种受欢迎的情况,但并非普遍适用。很多时候,您可能不想这样做。这就是为什么第一个git push如此冗长。它告诉Git在执行git pullgit push时如何处理本地的master分支。

  4. git pushgit pull的默认值是使用当前分支的远程。这比origin master更好。 git push确定这一点的方法在这里解释。

git相当优雅且易懂,但需要经历一个学习曲线。


1
正如我对其他答案的评论所说,在Git的默认配置中,“git push”不会使用通过“git branch/checkout --track”设置的配置变量来确定要推送到哪个远程引用。你是对的,git pull确实使用了这些变量。 - Mark Longair

0

-1

Git 远程添加 origin:

它将你的源代码集中到其他项目中。它基于 Linux 开发,完全开源,并使你的代码对其他 Git 用户有用。我们称其为参考。

使用 GitHub 的远程 URL 将你的代码推送到 Git 存储库中。


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