什么是"git remote add ..."和"git push origin master"?

nop*_*ole 276 git github

很多时候,Git和Rails看起来像魔术......比如在Rails 3 Tutorial一书第一章中,它讨论了Git:

git remote add origin git@github.com:peter/first_app.git
git push origin master
Run Code Online (Sandbox Code Playgroud)

并且它几乎说"它只是有效"而没有说太多关于它们是什么并且开始谈论分支.在网上搜索显示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,还有什么呢?在gitgit@github.com似乎是git的服务器上的用户帐户?

另外,为什么它需要如此冗长才能使用git push origin master?默认不能是origin和master吗?我发现第一次,origin master需要,但经过一个小的编辑和提交,然后git push就是它所需要的(没有必要origin master).知道发生了什么的人可以提供一些细节吗?

有时候感觉就像没有任何解释的魔法......有时使用它的人是如此自信,当被问到为什么时,无法解释它,并回答"就像它的方式".有时非常务实和务实.实践并不坏,但可能不实际到不知道发生了什么.

Nou*_*him 334

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创建一个名为originat 的新远程git@github.com: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服务器的方式.

现在冗长.您输入的命令是一般命令.有可能告诉git类似" master这里调用的分支foo是在远程调用的分支上调用的分支的本地镜像bar".在git中,这意味着master 轨道 bar/foo.当您第一次进行克隆时,您将获得一个被调用的分支master和一个被调用的远程origin(您从中克隆),并使用本地主服务器集来跟踪主服务器.设置完成后,您可以简单地说git push,它就会这样做.如果需要,可以使用更长的命令(例如,git push可以推送到官方公共仓库,并git push review master可以用于推送到您的团队用来查看代码的单独远程).您可以使用命令--set-upstream选项将分支设置为跟踪分支git branch.

我觉得git(与我使用的大多数其他应用程序不同)从内到外更好理解.一旦了解了数据库如何在存储库中存储和维护,命令及其执行的操作就变得非常清晰.我同意你的意见,许多git用户都有一些精英主义,但我也发现曾经有过UNIX用户,并且值得通过它们来学习系统.祝好运!

  • "git就像UNIX.用户友好但对它的朋友很挑剔." 这太棒了我想把它印在T恤上. (8认同)
  • 您可能希望在段落中添加关于传输的注释,解释为`git@github.com: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/ (7认同)
  • Apropos black boxen vs. inside out.Git是我遇到的第一件事,实际上*更容易*从内部学习而不是从"界面"学习.是否正确的方式是值得商榷的.我只是说当涉及到git时,内部更有效. (3认同)

Mar*_*air 39

更新:请注意,目前接受的答案会延续对行为的常见误解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"(例如master,master:my-experiment等),则git默认推送与远程分支具有相同名称的每个本地分支.如果您master的存储库和远程存储库之间只有一个共同调用的分支,那么就像将您推master送到远程服务器一样master.

就个人而言,由于我倾向于有许多主题分支(通常是几个遥控器),我总是使用以下形式:

git push origin master
Run Code Online (Sandbox Code Playgroud)

...以避免意外推动其他分支.


回答你对其他答案之一的评论,听起来好像是以非常有效的方式自上而下地学习git - 你发现默认设置有效,而你的问题是询问原因;)更严重的是,git 可以像SVN一样简单地使用,但是对于遥控器和分支的了解意味着你可以更灵活地使用它,这可以真正改变你的工作方式.你对一学期课程的评论让我想起了Scott Chacon在一个播客采访中所说的话 - 学生们会学习计算机科学和软件工程中的各种基本工具,但很少有版本控制.分布式版本控制系统(如git和Mercurial)现在非常重要,而且非常灵活,因此值得教授课程,以便为人们提供良好的基础.

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

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


Mr.*_*Jha 13

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

git remote add origin <url_of_remote repository>
Run Code Online (Sandbox Code Playgroud)

例子:

git remote add origin git@github.com:peter/first_app.git
Run Code Online (Sandbox Code Playgroud)

让我们剖析一下命令:

git remote这用于管理用于托管 Git 存储库的中央服务器。

也许你正在使用GitHub作为你的中央存储库的东西。给大家举个例子,解释一下git remote add origin命令

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

现在,如果我想将我的更改推送到这两个 Git 服务器,那么我需要告诉 Git 如何访问这些中央存储库。所以我将不得不添加这些,

对于 GitHub

git remote add gh_origin https://github.com/user/first-app-git.git
Run Code Online (Sandbox Code Playgroud)

对于 Bitbucket

git remote add bb_origin https://user@bitbucket.org/user/first-app-git.git
Run Code Online (Sandbox Code Playgroud)

我使用了两个变量(我很容易称它们为变量)gh_originGitHub 的gh )和bb_originBitbucket 的bb )只是为了向您解释我们可以将 origin 称为任何我们想要的名称。

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

推送到 GitHub

git push gh_origin master
Run Code Online (Sandbox Code Playgroud)

推送到 Bitbucket

git push bb_origin master
Run Code Online (Sandbox Code Playgroud)

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

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

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

大多数时候,除了origin之外你什么也看不到,因为大多数时候你只会处理一个中央存储库,例如 GitHub 或 Bitbucket。


ans*_*hul 5

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

  2. git://git@github.com/peter/first_app.git不是有效的git网址.可以通过此处指定的各种url方案来识别和访问git存储库. 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与当前分支的遥控工作.这是一个比origin master更好的默认值.git push确定的方式在这里解释.

git 相当优雅和易于理解,但有一个学习曲线可以走过.