什么是“git remote add ...”和“git push origin master”?
很多时候,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
)。知道发生了什么的人可以提供一些细节吗?
有时候感觉就像很多魔术一样没有解释......有时候使用它的人是如此自信,当被问到为什么,无法解释它,并用“就是这样”的方式回应。有时非常务实和务实。实践并不坏,但不知道发生了什么事情可能不切实际。
git
就像UNIX一样。用户友好但对其朋友挑剔。它与shell管道一样功能强大且用户友好。
话虽这么说,一旦你了解它的模式和概念,它具有相同的zenlike清晰度我来自UNIX命令行工具的期望。你应该考虑抽出一些时间阅读在线提供的许多优秀的git教程之一。 Pro Git书是一个开始的好地方。
回答你的第一个问题。
-
什么是
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的。 -
什么是
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用户从中学习系统是值得的。祝你好运!
存储库名称末尾的
.git
只是一个约定。通常,在git服务器上,存储库保存在名为project.git
的目录中。当仅指定project
时,git客户端和协议通过测试project.git
来尊重该惯例。git://[email protected]/peter/first_app.git
不是有效的git url。 git存储库可以通过指定的各种url方案来标识和访问。[email protected]:peter/first_app.git
是该页面上提到的ssh
网址。git
是灵活的。它允许您跟踪任何存储库中几乎任何分支的本地分支。虽然master
(您的本地默认分支)跟踪origin/master
(远程默认分支)是一种流行的情况,但它不是通用的。很多时候你可能不想这样做。这就是为什么第一个git push
如此详细。它会告诉git在执行git pull
或git push
时如何处理本地master
分支。git push
和git pull
的默认值是与当前分支的远程一起工作。这是比起始原件更好的默认值。 git push决定这一点的方式解释为here。
git
是相当优雅和理解,但有一个学习曲线穿行。
正如我在其他答案中所评论的,在git的默认配置中,'git push'不使用'git branch/checkout --track'设置的配置变量来确定要推送哪个远程引用。然而,你说得对,git pull确实使用了这些。 – 2011-04-11 06:21:18
更新:请注意,目前接受的答案使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中有一些奇怪的行为现在很难改变,因为许多脚本可能依赖于它们,但会让人感到困惑。
我认为亲git书是一个很好的资源,对于新手来说很容易理解。大大平滑学习曲线。另外,我认为试图将SVN和其他集中式概念“映射”到git上会使道路更加艰难而不是平滑。根据我的经验,完全重置是更快更简单的方法。 – 2011-04-11 07:06:36
@Noufal Ibrahim:我同意你的观点。我并没有试图将SVN概念映射到git上,因为我知道可能导致的可怕混淆 - 但从上到下有更好的教学方法。 – 2011-04-11 07:25:26
您可能需要在段落中添加关于传输的注释,说明'[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
该注释 - 如果不使用'push.default',则在使用'git push'时,将使用上游配置来查找默认远程,但不会影响refs的映射。 – 2011-04-11 06:46:47
是不是......我使用的其他VCS如TortoiseSVN似乎是非常“黑匣子”......一些简单的命令具有非常明确的工作方式。学习它不到一个小时,每个人都很清楚它是如何做到的。使用Git或Hg,看起来更像是一个单元的学期课程。当发生什么事情时,人们并不确定发生了什么以及如何解决问题。 [cont'd] – 2011-04-11 06:47:11