很多时候,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
)。知道发生了什么的人可以提供一些细节吗?
有时感觉很多魔法没有解释......有时使用它的人是如此自信,当被问到为什么时,无法解释它,并回答“就像它的方式”。有时非常务实和务实。实践并不坏,但可能不实际到不知道发生了什么。
答案 0 :(得分:326)
git
就像UNIX一样。用户友好但对其朋友挑剔。它与shell管道一样强大且用户友好。
话虽这么说,一旦你理解了它的范例和概念,它就具有与UNIX命令行工具所期望的相同的清晰度。你应该考虑花些时间阅读在线提供的众多优秀git教程之一。 Pro Git书是一个很好的起点。
回答你的第一个问题。
什么是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
,而不是输入整个网址。
什么是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用户,并且值得通过它们学习系统。祝你好运!
答案 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
。master:my-experiment
,master
等),则git默认推送与远程分支同名的每个本地分支。如果您的存储库和远程存储库之间只有一个名为master
的分支,那么就像将master
推送到远程git push origin master
一样。就个人而言,由于我倾向于拥有许多主题分支(通常是几个遥控器),我总是使用以下形式:
git
...以避免意外推动其他分支。
在回复您对其他答案之一的评论时,听起来好像 以非常有效的方式自上而下地学习git - 您发现默认设置有效,并且你的问题是询问为什么;)更严重的是,git 可以基本上像SVN一样使用,但了解一下遥控器和分支意味着你可以更灵活地使用它,这可以真正改变你的工作方式。你对一学期课程的评论让我想起了Scott Chacon在一个播客采访中所说的话 - 学生们会学习计算机科学和软件工程中的各种基本工具,但很少有版本控制。分布式版本控制系统(如git和Mercurial)现在非常重要,而且非常灵活,因此值得教授课程,以便为人们提供良好的基础。
我认为,对于{{1}},这种学习曲线是绝对值得的 - 使用大量主题分支,轻松合并它们,并且一旦你对自己有信心,在不同的存储库之间推送和拉动它们就非常有用系统。不幸的是:
答案 2 :(得分:5)
存储库名称末尾的.git
只是一个约定。通常,在git服务器上,存储库保存在名为project.git
的目录中。当仅指定project.git
时,git客户端和协议通过测试project
来遵守此约定。
git://git@github.com/peter/first_app.git
不是有效的git网址。可以通过指定here的各种url方案来识别和访问git存储库。 git@github.com:peter/first_app.git
是该页面上提到的ssh
网址。
git
非常灵活。它允许您跟踪任何存储库的几乎任何分支的本地分支。虽然master
(您的本地默认分支)跟踪origin/master
(远程默认分支)是一种流行的情况,但它不是通用的。很多时候你可能不想这样做。这就是为什么第一个git push
如此冗长。当您执行master
或git pull
时,它会告诉git如何处理本地git push
分支。
git push
和git pull
的默认设置是使用当前分支的远程。这是一个比origin master更好的默认值。 git push确定的方式解释为here。
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很有用。