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

时间:2011-04-11 05:43:45

标签: git github

很多时候,Git和Rails看起来很神奇......比如在first chapter of Rails 3 Tutorial book中,它谈到了Git:

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

它几乎说“它只是有效”而没有说太多关于它们是什么,并开始谈论分支。在网上搜索显示git remote add是添加“短名称”,例如origin,它也可以是任何名称,类似于URL的别名。并且origin是远程repo指向的常用路径。 (在“添加远程存储库”下的http://git-scm.com/book/en/Git-Basics-Working-with-Remotes中)

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

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

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

6 个答案:

答案 0 :(得分:326)

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,而不是输入整个网址。

  2. 什么是git push origin master

    这是一个命令,说“将名为master的本地分支中的提交推送到名为origin的远程”。执行此操作后,您上次与源同步的所有内容将被发送到远程存储库,其他人将能够在那里看到它们。

  3. 现在关于传输(即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用户,并且值得通过它们学习系统。祝你好运!

答案 1 :(得分:38)

更新:请注意,当前接受的答案会使git push的行为长期存在git://,尽管有评论指出该行为,但该行为尚未得到纠正。

您对遥控器的总结 - 就像存储库网址的昵称一样 - 是正确的。

  

那么为什么URL不是git://git@github.com/peter/first_app.git但是在其他语法中 - 它的语法是什么?为什么它必须以.git结尾?我最后尝试不使用.git,它也有效。如果不是.git,还有什么呢?初学者的git似乎是git服务器上的用户帐户?

您提到的两个URL表明应该使用两种不同的传输协议。以git@github.com:peter/first_app.git开头的那个是git协议,它通常仅用于对存储库的只读访问。另一个git是通过SSH指定对存储库的访问的不同方式之一 - 这是common misunderstanding中描述的“scp样式语法”。 scp样式语法中的用户名是git push origin master是因为GitHub处理识别用户的方式 - 实际上忽略了用户名,并且基于他们用于验证的SSH密钥对来识别用户

至于git push的详细程度,您已经注意到在第一次推送之后,您可以执行remote.master.url。这是因为一系列难以记住但通常有用的默认值:)

  • 如果未指定远程,则使用为当前分支配置的远程(在您的情况下为origin)。如果没有设置,则使用master
  • 如果没有指定“refspec”(例如master:my-experimentmaster等),则git默认推送与远程分支同名的每个本地分支。如果您的存储库和远程存储库之间只有一个名为master的分支,那么就像将master推送到远程git push origin master 一样。

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

git

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


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

我认为,对于{{1}},这种学习曲线是绝对值得的 - 使用大量主题分支,轻松合并它们,并且一旦你对自己有信心,在不同的存储库之间推送和拉动它们就非常有用系统。不幸的是:

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

答案 2 :(得分:5)

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

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

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

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

  5. git相当优雅且易于理解,但有一条学习曲线可供使用。

答案 3 :(得分:2)

您使用git可能是您是程序员。如果您是一名程序员,那么您可以理解什么是变量!

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

git remote add origin <url_of_remote repository>

示例:

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

让我们剖析命令:

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

可能您正在使用 Github 作为您的中央存储库内容。我会给你一个例子,并说明 git remote add origin 命令

假设我正在与 GitHub BitBucket 一起使用git存储库的中央服务器,并且已经在两个网站上为我的 first-app < / strong>项目。

现在,如果我想将更改同时推送到这两个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 (BITBUCKET bb)解释一下,我们可以将任何我们想要的名称称为起源。

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

推送到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。

答案 4 :(得分:0)

Git远程添加原点:

它将您的源代码集中到其他项目。它是基于Linux开发的, 完整的开源,并使您的代码对其他git用户有用。我们称其为参考

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

答案 5 :(得分:0)

这是对此问题(Export Heroku App to a new GitHub repo)的回答,已被标记为与该问题重复,并在此处重定向。

我想将我的仓库从Heroku镜像到Github个人,以便显示我在Heroku中所做的所有提交等。 Github文档中的https://docs.github.com/en/free-pro-team@latest/github/importing-your-projects-to-github/importing-a-git-repository-using-the-command-line很有用。