什么是“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书是一个开始的好地方。
回答你的第一个问题。
-
什么是
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。 -
什么是
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”(例如,
master
,master:my-experiment
等),那么git将默认推送与远程分支具有相同名称的每个本地分支。 如果你的仓库和远程仓库之间只有一个叫做master
的分支,那么就像把master
分配给远程master
分支一样。
就个人而言,由于我倾向于有很多主题分支(通常是几个遥控器),我总是使用以下forms:
git push origin master
…以避免意外推动其他分支。
在回答您对其他答案之一的意见时,听起来好像是以非常有效的方式自上而下地学习git – 您已经发现缺省值工作,并且您的问题是询问为什么;)更严重的是,git基本上可以像SVN一样使用,但是了解一下远程和分支意味着你可以更灵活地使用它,这可以真正改变你的工作方式。 你对一个学期课程的评价让我想起了Scott Chacon在一个播客采访中所说的话 – 学生们被教授计算机科学和软件工程中的各种基本工具,但很less有版本控制。 分布式版本控制系统如git和Mercurial现在非常重要,而且非常灵活,所以值得为它们开设课程来给人们一个很好的基础。
我的观点是,使用git
,这个学习曲线是绝对值得的 – 与许多主题分支合作,轻松合并,并在不同的存储库之间推送和拉取它们,一旦您对系统充满信心,就会非常有用。 只是不幸的是:
- git的主要文档很难为新手parsing。 (虽然我认为,如果你几乎任何git的问题谷歌,有用的教程材料(或堆栈溢出答案:))现在出现。)
- git中有一些奇怪的行为现在很难改变,因为很多脚本可能依赖于它们,但却让人感到困惑。
-
存储库名称末尾的
.git
只是一个约定。 通常,在git服务器上,存储库保存在名为project.git
目录中。 git客户端和协议通过在仅指定project
情况下通过testingproject.git
尊重这个约定。 -
git://git@github.com/peter/first_app.git
不是有效的git url。 可以通过这里指定的各种urlscheme来识别和访问git存储库。git@github.com:peter/first_app.git
是该页面提到的ssh
url。 -
git
是灵活的。 它允许你跟踪任何仓库几乎任何分支的本地分支。 虽然master
(你的本地默认分支)跟踪origin/master
(远程默认分支)是一个stream行的情况,但它并不是通用的。 很多时候你可能不想这样做。 这就是为什么第一个git push
太冗长了。 它会告诉git在执行git pull
或git push
时如何处理本地master
分支。 -
git push
和git pull
的默认值是使用当前分支的远程。 这是比起源主更好的默认值。 这里解释了 git push的方式。
git
是相当优雅和可理解的,但是有一条学习曲线可以走过去。