2011-04-11 96 views
248

很多时候,Git和Rails的看起来像变魔术一样......如在first chapter of Rails 3 Tutorial book,它谈论的Git:什么是“git remote add ...”和“git push origin master”?

git remote add origin [email protected]: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://[email protected]/peter/first_app.git,但在其他语法 - 它是什么语法?为什么必须以.git结束?我试过最后不使用.git,它也可以。如果不是.git,还有什么可以的?在[email protected]中的git似乎是git服务器上的用户帐户?

此外,它为什么需要如此详细以便使用git push origin master?不能默认是起源和主人吗?我发现第一次需要origin master,但经过小小的编辑和提交,然后git push就是它所需要的(不需要origin master)。知道发生了什么的人可以提供一些细节吗?

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

回答

293

git就像UNIX一样。用户友好但对其朋友挑剔。它与shell管道一样功能强大且用户友好。

话虽这么说,一旦你了解它的模式和概念,它具有相同的zenlike清晰度我来自UNIX命令行工具的期望。你应该考虑抽出一些时间阅读在线提供的许多优秀的git教程之一。 Pro Git书是一个开始的好地方。

回答你的第一个问题。

  1. 什么是git remote add ...

    正如你可能知道,git是一个分布式版本控制系统。大多数操作都在本地完成。为了与外界沟通,git使用所谓remotes。这是一个比本地磁盘上,您可以push更改成(以便其他人可以看到他们)或pull(这样就可以让别人改变)其他存储库。命令git remote add origin [email protected]:peter/first_app.git创建一个名为origin的新远程,位于[email protected]:peter/first_app.git。一旦你这样做,在你推命令,你可以推到origin不是键入出整个URL的。

  2. 什么是git push origin master

    这是说“推提交名为master远程命名origin地方分支”的命令。执行此操作后,所有与原始同步的内容都将发送到远程存储库,其他人员将能够在此处看到它们。

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

现在的详细程度。你输入的命令是一般的命令。有可能告诉git类似于“在这里称为master的分支是名为bar的远程分支名为foo的分支的本地镜像”。在git中,这意味着master跟踪bar/foo。第一次克隆时,您将获得一个名为master的分支和一个名为origin(您从中克隆)的远程设备,并使用本地主设备来追踪原点上的主设备。一旦建立起来,你可以简单地说git push,它会做到这一点。如果需要,可以使用较长的命令(例如,git push可能推送到官方公开回购,git push review master可用于推送到您的团队用于查看代码的单独的远程设备)。您可以使用git branch命令的--set-upstream选项将您的分支设置为跟踪分支。

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

+6

您可能需要在段落中添加关于传输的注释,说明'[email protected]: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/ – 2011-04-11 06:15:24

+1

该注释 - 如果不使用'push.default',则在使用'git push'时,将使用上游配置来查找默认远程,但不会影响refs的映射。 – 2011-04-11 06:46:47

+0

是不是......我使用的其他VCS如TortoiseSVN似乎是非常“黑匣子”......一些简单的命令具有非常明确的工作方式。学习它不到一个小时,每个人都很清楚它是如何做到的。使用Git或Hg,看起来更像是一个单元的学期课程。当发生什么事情时,人们并不确定发生了什么以及如何解决问题。 [cont'd] – 2011-04-11 06:47:11

5
  1. 存储库名称末尾的.git只是一个约定。通常,在git服务器上,存储库保存在名为project.git的目录中。当仅指定project时,git客户端和协议通过测试project.git来尊重该惯例。

  2. git://[email protected]/peter/first_app.git不是有效的git url。 git存储库可以通过指定的各种url方案来标识和访问。 [email protected]:peter/first_app.git是该页面上提到的ssh网址。

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

  4. git pushgit pull的默认值是与当前分支的远程一起工作。这是比起始原件更好的默认值。 git push决定这一点的方式解释为here

git是相当优雅和理解,但有一个学习曲线穿行。

+1

正如我在其他答案中所评论的,在git的默认配置中,'git push'不使用'git branch/checkout --track'设置的配置变量来确定要推送哪个远程引用。然而,你说得对,git pull确实使用了这些。 – 2011-04-11 06:21:18

35

更新:请注意,目前接受的答案使common misunderstanding延续有关git push的行为,尽管有评论指出,但行为仍未纠正。像一个仓库的URL一个绰号 - -

你什么遥控器是总结是正确的。

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

您提到的两个URL指示应该使用两种不同的传输协议。以git://开头的那个是git协议,通常只用于对存储库的只读访问。另外一个,[email protected]:peter/first_app.git,是指定通过SSH访问的库的不同方式之一 - 这是the documentation描述的“SCP风格的语法”。这在SCP风格的语法的用户名是git是因为的方式,GitHub的涉及用户身份识别 - 本质上的用户名被忽略,用户是基于SSH密钥对,他们用来认证标识。

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

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

个人,因为我往往有很多话题分支(而且经常几个遥控器)我总是使用形式:

git push origin master 

...以避免意外推等分支机构。


在回答关于其他答案之一您的意见,这听起来我好像在自上而下的方式非常有效地学习有关的git - 你已经发现,默认工作,你的问题是问为什么;)更严重,混帐可以基本上被简单地为SVN使用,但知道一点关于遥控器和分支意味着你可以更flexibily使用它,这真的可以改变你的工作方式为了更好。你对一个学期课程的评论让我想起了Scott Chacon在一个播客采访中所说的一些东西 - 学生们被教授计算机科学和软件工程中的各种基本工具,但很少有版本控制。分布式版本控制系统(如git和Mercurial)现在非常重要,而且非常灵活,因此值得为其教授课程以便给予人们良好的基础。

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

  • git的主要文档是很难解析的新手。 (虽然我认为如果你的Google几乎有任何git问题,但是有帮助的教程材料(或Stack Overflow答案:))现在出现了。)
  • git中有一些奇怪的行为现在很难改变,因为许多脚本可能依赖于它们,但会让人感到困惑。
+0

我认为亲git书是一个很好的资源,对于新手来说很容易理解。大大平滑学习曲线。另外,我认为试图将SVN和其他集中式概念“映射”到git上会使道路更加艰难而不是平滑。根据我的经验,完全重置是更快更简单的方法。 – 2011-04-11 07:06:36

+0

@Noufal Ibrahim:我同意你的观点。我并没有试图将SVN概念映射到git上,因为我知道可能导致的可怕混淆 - 但从上到下有更好的教学方法。 – 2011-04-11 07:25:26

相关问题