什么是“git remote add …”和“git push origin master”?

很多时候,Git和Rails看起来像魔术……就像Rails 3教程的第一章一样 ,它讲的是Git:

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

而且它几乎可以说“它只是起作用”,并没有太多的说明它们是什么,并开始谈论分支。 在网上search表明, git remote add是添加一个“简称”,如origin ,它也可以是任何名称,这就像一个URL的别名。 origin是远程回购指向的通常path。 (在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 ,但在一个小的编辑和提交后,然后git push是所有需要(不需要origin master )。 有谁知道发生了什么事给一些细节?

有时候感觉就像很多魔术一样,没有任何解释……有时候使用它的人是如此自信,当被问到为什么,不能解释它,并用“这就是这样”的方式回应。 有时非常务实和务实。 实践并不坏,但是不知道发生了什么事情可能不切实际。

git就像UNIX一样。 用户友好但挑剔的朋友。 它与shellpipe道一样强大,用户友好。

这就是说,一旦你了解了它的范例和概念,它就像我从UNIX命令行工具中期待的一样清晰。 你应该考虑抽出一些时间阅读在线提供的许多好的git教程之一。 Pro Git书是一个开始的好地方。

回答你的第一个问题。

  1. 什么是git remote add ...

    你可能知道, git是一个分布式的版本控制系统。 大部分操作都是在本地完成 为了与外界沟通, git使用了所谓的remotes 。 这些存储库不是您本地磁盘上的存储库,您可以push更改push入(以便其他人可以看到它们)或从中pull (以便获取其他更改)。 命令git remote add origin git@github.com:peter/first_app.git创build一个新的名为origin远程。 一旦你这样做,在你的推送命令中,你可以推送到origin而不是input整个URL。

  2. 什么是git push origin master

    这是一个命令,它将“将本地分支名为master的提交推送到远程命名origin ”。 一旦执行完毕,所有与原始同步的东西都将被发送到远程存储库,其他人将能够在那里看到它们。

关于传输(即什么git:// )的意思。 远程存储库URL可以有多种types( file://https://等)。 Git只是依靠传输提供的authentication机制来处理权限和内容。 这意味着对于file:// URL,它将是UNIX文件许可权等git://scheme要求git使用自己的内部传输协议,该协议针对发送git变更集进行了优化。 至于确切的URL,就是因为githubbuild立git服务器的方式。

现在是冗长。 您input的命令是一般的命令。 可以告诉git这样的东西:“这里叫做master的分支是远程调用bar上叫做foo的分支的本地镜像”。 在git中,这意味着master 跟踪 bar/foo 。 当你第一次克隆的时候,你会得到一个叫做master的分支和一个叫做origin的远程(你克隆的地方),本地master设置来跟踪原始的master。 一旦build立,你可以简单地说git push ,它会做到这一点。 如果你需要的话,可以使用更长的命令(例如, git push可能会推到官方的公共仓库,而git push review master可以用来推送到你的团队用来检查代码的单独的远程仓库)。 您可以使用git branch命令的--set-upstream选项将您的分支设置为跟踪分支。

我觉得git(不像我使用过的其他大多数应用程序)从内到外都能更好地理解。 一旦你了解了数据库中的数据是如何存储和维护的,这些命令和它们所做的事情就变得清晰起来。 我同意你的看法,在许多git用户中有一些精英主义,但是我也发现,曾经有UNIX用户,经过他们学习这个系统是值得的。 祝你好运!

更新:请注意,目前接受的答案延续了对git push行为的一个常见的误解 ,即使有评论指出, git push也没有得到纠正。

你对什么遥控器的总结是正确的 – 就像一个存储库URL的昵称。

那么为什么这个URL不是git://git@github.com/peter/first_app.git,但是在其他语法中它是什么语法? 为什么它必须以.git结尾? 我在最后尝试不使用.git,它也可以工作。 如果不是.git,还有什么可以的? 在初学者的git似乎是在git服务器上的用户帐户?

您提到的两个URL表明应该使用两种不同的传输协议。 以git://开头的那个是git协议,通常只用于对存储库的只读访问。 另一个是git@github.com:peter/first_app.git ,它是指定通过SSH访问存储库的不同方法之一 – 这是文档中描述的“scp-style语法”。 scp-style语法中的用户名是git是因为GitHub处理识别用户的方式 – 实质上这个用户名被忽略了,而且用户是根据他们用来validation的SSH密钥对来识别的。

至于git push origin master的详细程度,你已经注意到在第一次push之后,你可以做git push 。 这是因为一系列难以记忆但通常有用的默认值:)

  • 如果未指定远程,则使用为当前分支configuration的远程(在您的案例中位于remote.master.url中)。 如果没有设置,则使用origin
  • 如果没有指定“refspec”(例如, mastermaster:my-experiment等),那么git将默认推送与远程分支具有相同名称的每个本地分支。 如果你的仓库和远程仓库之间只有一个叫做master的分支,那么就像把master分配给远程master分支一样。

就个人而言,由于我倾向于有很多主题分支(通常是几个遥控器),我总是使用以下forms:

 git push origin master 

…以避免意外推动其他分支。


在回答您对其他答案之一的意见时,听起来好像是以非常有效的方式自上而下地学习git – 您已经发现缺省值工作,并且您的问题是询问为什么;)更严重的是,git基本上可以像SVN一样使用,但是了解一下远程和分支意味着你可以更灵活地使用它,这可以真正改变你的工作方式。 你对一个学期课程的评价让我想起了Scott Chacon在一个播客采访中所说的话 – 学生们被教授计算机科学和软件工程中的各种基本工具,但很less有版本控制。 分布式版本控制系统如git和Mercurial现在非常重要,而且非常灵活,所以值得为它们开设课程来给人们一个很好的基础。

我的观点是,使用git ,这个学习曲线是绝对值得的 – 与许多主题分支合作,轻松合并,并在不同的存储库之间推送和拉取它们,一旦您对系统充满信心,就会非常有用。 只是不幸的是:

  • git的主要文档很难为新手parsing。 (虽然我认为,如果你几乎任何git的问题谷歌,有用的教程材料(或堆栈溢出答案:))现在出现。)
  • git中有一些奇怪的行为现在很难改变,因为很多脚本可能依赖于它们,但却让人感到困惑。
  1. 存储库名称末尾的.git只是一个约定。 通常,在git服务器上,存储库保存在名为project.git目录中。 git客户端和协议通过在仅指定project情况下通过testingproject.git尊重这个约定。

  2. git://git@github.com/peter/first_app.git不是有效的git url。 可以通过这里指定的各种urlscheme来识别和访问git存储库。 git@github.com:peter/first_app.git是该页面提到的ssh url。

  3. git是灵活的。 它允许你跟踪任何仓库几乎任何分支的本地分支。 虽然master (你的本地默认分支)跟踪origin/master (远程默认分支)是一个stream行的情况,但它并不是通用的。 很多时候你可能不想这样做。 这就是为什么第一个git push太冗长了。 它会告诉git在执行git pullgit push时如何处理本地master分支。

  4. git pushgit pull的默认值是使用当前分支的远程。 这是比起源主更好的默认值。 这里解释了 git push的方式。

git是相当优雅和可理解的,但是有一条学习曲线可以走过去。