什么是“git远程添加…”;还有“git push origin master”?

很多时候,Git和Ruby on Rails看起来就像魔法……例如在Ruby on 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/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需要如此冗长?默认不能是原点和master吗?我发现第一次,origin master是需要的,但经过一个小的编辑和提交,然后git push是它所需要的(不需要origin master)。有了解情况的人能告诉我们一些细节吗?

有时候感觉就像有很多没有解释的魔法……有时使用它的人太自信了,当被问及为什么时,他们无法解释,只是回答“就是这样”。有时非常实际和务实。实际一点也不错,但可能不实际到不知道发生了什么。

366270 次浏览

Git就像Unix。它对用户很友好,但它对朋友很挑剔。它就像一个外壳管道一样强大和用户友好。

话虽如此,一旦您理解了它的范例和概念,它就具有我从Unix命令行工具中所期望的相同的禅宗般的清晰度。您应该考虑抽出一些时间来阅读在线上可用的许多优秀Git教程。Pro Git这本书是一个很好的开始。

回答你的第一个问题。

  1. git remote add ...是什么?

    您可能知道,Git是一个分布式版本控制系统。大多数操作在本地完成。为了与外界通信,Git使用了所谓的“remotes"。这些是存储库,而不是本地磁盘上的存储库,你可以你的更改(以便其他人可以看到它们)或(以便你可以获得其他更改)。命令git remote add origin git@github.com:peter/first_app.git创建一个名为origin的新远程服务器,位于git@github.com:peter/first_app.git。一旦你这样做了,在你的推送命令中,你可以推送到起源,而不是输入整个URL。

  2. git push origin master是什么?

    这个命令表示“将本地分支中的提交推到名为__abc1的远程分支”。一旦执行,你上次与起源同步的所有内容将被发送到远程存储库,其他人将能够在那里看到它们。

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

现在是冗长。您键入的命令是通用命令。可以这样告诉Git:“这里名为的分支是远程名为__abc2的分支喷火的本地镜像”。在Git中,这意味着 < >强跟踪< / >强 酒吧/ foo。当你第一次克隆时,你会得到一个名为的分支和一个名为起源的远程(你克隆的地方),带有本地主集来跟踪源上的主集。

一旦这个设置好了,你可以简单地说git push,它就会这样做。更长的命令可以在你需要的情况下使用(例如,git push可能会推送到官方的公共存储库,而git push review master可以用于推送到你的团队用来检查代码的单独远程服务器)。你可以使用git branch命令的--set-upstream选项将你的分支设置为跟踪分支。

我觉得Git(不像我使用过的大多数其他应用程序)更容易由内而外地理解。一旦您理解了如何在存储库中存储和维护数据,命令及其功能就变得非常清晰。我同意你的观点,在许多Git用户中有一些精英主义,但我也发现,对于Unix用户来说,曾经有过这样的经历,学习系统是值得的。好运!

  1. 储存库名称后面的.git只是一个约定。通常,在Git服务器上,存储库保存在名为project.git的目录中。Git客户端和协议通过在只指定project时测试project.git来遵守这一约定。

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

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

  4. git pushgit pull的默认值是使用当前分支的远程。这是一个比origin master更好的默认值。git push确定这个的方式在在这里中解释。

git是相当优雅和可理解的,但有一个学习曲线通过。

更新:注意,目前接受的答案延续了关于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问题,有帮助的教程材料(或Stack Overflow的答案:))现在。)
  • Git中有一些奇怪的行为现在很难改变,因为许多脚本可能依赖于它们,但这让人们感到困惑。

Git远程添加原点:

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

它使用GitHub的远程URL将代码推入Git存储库。

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

git remote add origin <url_of_remote repository>

例子:

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

让我们来分析一下这个命令:

git远程用于管理你的中央服务器,用于托管你的Git存储库。

也许你正在使用GitHub来处理你的中央存储库。我将给你一个例子,并解释Git远程添加原点命令

假设我正在使用GitHubBitbucket都作为Git存储库的中央服务器,并且已经在两个网站上为我的first-app项目创建了存储库。

现在,如果我想将更改推送到这两个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 对于GitHub)和bb_origin (bb 对于Bitbucket都)只是为了解释你,我们可以称原点为我们想要的任何东西。

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

推送到GitHub

git push gh_origin master

推送到Bitbucket

git push bb_origin master

gh_origin保存了https://github.com/user/first-app-git.git的值,而bb_origin保存了https://user@bitbucket.org/user/first-app-git.git的值

这两个变量让我的生活更简单

因为每当我需要发送我的代码更改时,我需要使用这个词,而不是记住或键入相同的URL。

大多数情况下,除了起源之外,你不会看到任何东西,因为大多数情况下你只会处理一个中央存储库,比如GitHub或Bitbucket。

这是这个问题(导出Heroku App到一个新的GitHub repo)的答案,它被标记为这个问题的副本,并重定向到这里。

我想把我的存储库从Heroku镜像到GitHub个人,这样它就能显示所有的提交,等等,这也是我在Heroku中做的。GitHub文档中的使用命令行导入Git存储库 . .是有用的。