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


288

通常,Git和Rails看起来就像魔术一样……例如在《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/zh-CN/Git-Basics-Working-with-Remotes中的 “添加远程存储库”下)

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

另外,为什么它需要这么冗长git push origin master?默认值不能是原点和母版吗?我发现第一次origin master需要,但是在进行少量编辑和提交之后,就git push只需要它(不需要origin master)。知道怎么回事的人可以提供一些细节吗?

有时候感觉像是很多魔法而没有解释……有时,使用它的人非常自信,当被问到为什么时,无法解释它,并以“就是这样”的方式做出回应。有时很务实。切合实际并不坏,但是可能不切实际,不知道发生了什么。

Answers:


344

git就像UNIX。用户友好,但对它的朋友很挑剔。它与Shell管道一样强大且用户友好。

话虽如此,一旦您了解了它的范式和概念,它就会具有与UNIX命令行工具相同的清晰感。您应该考虑花点时间阅读在线提供的许多优秀git教程之一。Pro Git书是一个很好的起点。

回答您的第一个问题。

  1. 什么是 git remote add ...

    您可能知道,git是一个分布式版本控制系统。大多数操作在本地完成。要与外界交流,请git使用所谓的remotes。这些存储库不是本地磁盘上的存储库,您可以push将其更改为(以便其他人可以看到)或pull更改(以使其他更改)。该命令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“ Remote ” 的本地分支中的提交”的命令。一旦执行了此操作,您上一次与原始同步的所有内容将被发送到远程存储库,其他人将可以在此处看到它们。

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

现在的冗长。您键入的命令是常规命令。可能会告诉git这样的东西“ master在这里调用的分支foo是在远程调用的分支的本地镜像bar”。用git来说,这意味着master track bar/foo。首次克隆时,您将获得一个名为的分支master和一个名为的远程节点origin(从中克隆到的分支),其中本地主节点设置为跟踪原始节点。设置完成后,您只需说git push一遍就可以了。如果需要,可以使用更长的命令(例如,git push可以推送到官方的公共仓库,并且git push review master可以用来推送到团队用来查看代码的单独的遥控器)。您可以使用来将您的分支设置为跟踪分支--set-upstreamgit branch命令的选项。

我觉得从内到外更好地理解了git(与我使用过的大多数其他应用不同)。一旦了解了数据在存储库中的存储和维护方式,这些命令及其作用将变得非常清晰。我确实同意您的看法,许多git用户中都有一些精英,但是我也发现曾经有UNIX用户,值得一试。祝好运!


8
您可能希望在段落中添加有关传输的注释,以说明这git@github.com:peter/first_app.gitscpgit中ssh URL 的-style语法。另一点是,默认情况下,除非已设置为(或在更高版本中)mastergit push 否则上游配置不会影响的行为-我写了一篇有关此混乱原因的博客文章:longair.net/blog/2011 /push.defaulttrackingupstream
02/27

1
对该注释的一个小更正-如果没有push.default使用上游配置,则在使用时将用于查找默认的远程git push,但不会影响ref的映射。
Mark Longair

1
我想知道为什么“内而外”(通常是“黑匣子”)很容易学习……就像自顶向下的方法一样,在顶部(界面)输入和获得的内容,定义非常好,希望也很简单。用户只需要关心“接口”,而实际上并不需要知道其中的内容。如果用户想了解更多信息,则可以通过特殊的实现方式知道,但是通常是可选的。
nonopolarity 2011年

3
Apropos黑色Boxen vs. Git是我所遇到的第一件事,它实际上比从“界面” 更容易由内而外地学习。正确的方法是否值得商bat。我只是说当涉及到git时,由内而外更有效。
Noufal Ibrahim 2011年

9
“ git就像UNIX。用户友好,但对它的朋友很挑剔。” 这太棒了,我想把它印在T恤上。
proflux 2013年

41

更新:请注意,当前接受的答案使人们对的行为普遍存在误解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样式语法” 。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问题都用Google搜索,那么时下有用的教程材料(或Stack Overflow答案:)就会出现。)
  • git中有一些奇怪的行为,现在很难更改,因为许多脚本可能依赖于它们,但却使人感到困惑。

我认为Pro git书是很好的资源,对于新手来说很容易理解。大大平滑了学习曲线。另外,我认为尝试将SVN和其他集中化概念“映射”到git上将使道路更加艰难而不是更加平滑。根据我的经验,完全重置是一种更快,更轻松的方式。
Noufal Ibrahim 2011年

@努法尔·易卜拉欣:我同意你的所有观点。我并不是要建议将SVN概念“映射”到git上,因为我知道这可能会造成可怕的混乱-但是,有更好的方法从上至下进行git的教学。
Mark Longair 2011年

9

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

git remote add origin <url_of_remote repository>

例:

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

让我们剖析命令:

git remote,用于管理您的Central服务器以托管git存储库。

可能是您将Github用于中央存储库。我会给你一个例子,并解释git remote add origin命令

假设我正在与GitHubBitBucket一起使用git存储库的中央服务器,并且已经在两个网站上为我的第一个应用程序项目创建了存储库。

现在,如果我想将更改同时推送到这两个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 FOR GITHUB)和bb_origin(bb对于BITBUCKET)只是为了说明您可以将任何我们想要的名字称为origin。

现在,在进行了一些更改之后,我将不得不将所有这些更改发送(推送)到中央存储库,以便其他用户可以看到这些更改。所以我打电话

推送到GitHub

git push gh_origin master

推送到BitBucket

git push bb_origin master

gh_origin被保持的值https://github.com/user/first-app-git.gitbb_origin被保持的值的https://user@bitbucket.org/user/first-app-git.git

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

就像每当我需要发送代码更改时一样,我需要使用这些单词而不是记住或键入相同的URL。

在大多数情况下,除了来源以外,您什么都看不到,因为在大多数情况下,您将只处理一个中央存储库,例如Github或BitBucket。


5
  1. .git在库名的末尾仅仅是一个惯例。通常,在git服务器上,存储库保存在名为的目录中project.git。git客户端和协议通过project.gitproject指定何时进行测试来遵守此约定。

  2. git://git@github.com/peter/first_app.git不是有效的git网址。git存储库可以通过此处指定的各种url方案进行标识和访问。 git@github.com:peter/first_app.gitssh该页面上提到的网址。

  3. git灵活。它使您可以针对任何存储库的几乎任何分支来跟踪本地分支。尽管master(您的本地默认分支)跟踪origin/master(远程默认分支)是一种流行的情况,但它并不通用。很多时候,您可能不想这样做。这就是为什么第一个git push这么冗长的原因。master当您执行a git pull或a 时,它会告诉git如何处理本地分支git push

  4. 默认的git pushgit pull是与当前分支的遥控工作。这是比原始主机更好的默认值。git push确定它的方式在这里解释。

git 相当优雅且易于理解,但需要学习。


1
正如我在另一个答案中所评论的那样,在git的默认配置中,git push它不会使用设置的配置变量git branch/checkout --track来确定将哪个远程ref推送到。您说对了,git pull确实使用了这些。
Mark Longair 2011年

0

Git远程添加原点:

它将您的源代码集中到其他项目。它是基于Linux开发的,完整的开源程序,并使您的代码对其他git用户有用。

使用git hub的远程URL将代码推送到git存储库中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.