很多时候,Git和Rails看起来像魔术......比如在_1340249中,它谈到了Git:
git remote add origin git@github.com:peter/first_app.git
git push origin master
它几乎没有说太多关于它们是什么,并开始谈论分支 . 在网上搜索显示 git remote add
是要添加"short name",例如 origin
,它也可以是任何名称,这就像URL的别名 . 并且 origin
是远程仓库所指向的通常路径 . (http://git-scm.com/book/en/Git-Basics-Working-with-Remotes下"Adding Remote Repositories")
那么为什么URL不是 git://git@github.com/peter/first_app.git
而是在其他语法中 - 它是什么语法?为什么它必须以 .git
结束?我最后尝试不使用 .git
它也有效 . 如果不是 .git
,还有什么呢? git@github.com
中的 git
似乎是git服务器上的用户帐户?
另外,为什么使用 git push origin master
需要如此冗长?默认不能是origin和master吗?我发现第一次需要 origin master
,但经过一个小的编辑和提交后, git push
就是它所需要的全部(不需要 origin master
) . 知道发生了什么的人可以提供一些细节吗?
有时候感觉就像没有任何解释的魔法......有时使用它的人是如此自信,当被问到为什么时,无法解释它,并回答“就像它的方式” . 有时非常务实和务实 . 实践并不坏,但可能不实际到不知道发生了什么 .
5 回答
git
就像UNIX . 用户友好但对其朋友挑剔 . 它与shell管道一样强大且用户友好 .话虽这么说,一旦你了解它的范例和概念,它就具有与UNIX命令行工具相同的清晰度 . 你应该考虑花些时间阅读在线提供的众多优秀git教程之一 . Pro Git书是一个很好的起点 .
回答你的第一个问题 .
git remote add ...
您可能知道,
git
是一个分布式版本控制系统 . 大多数操作都在本地完成 . 为了与外界沟通,git
使用了所谓的remotes
. 这些是本地磁盘上的存储库以外的存储库,您可以对其进行更改(以便其他人可以看到它们)或pull
(以便您可以进行其他更改) . 命令git remote add origin git@github.com:peter/first_app.git
创建一个名为origin
的新远程位于git@github.com:peter/first_app.git
. 执行此操作后,在推送命令中,您可以按origin
而不是键入整个URL .git push origin master
这是一个命令,说“将名为
master
的本地分支中的提交推送到名为origin
的远程” . 执行此操作后,您上次与源同步的所有内容将被发送到远程存储库,其他人将能够在那里看到它们 .现在关于运输(即
git://
)的意思 . 远程存储库URL可以有多种类型(file://
,https://
等) . Git只依赖于传输提供的身份验证机制来处理权限和内容 . 这意味着对于file://
URL,它将是UNIX文件权限等 .git://
方案要求git使用自己的内部传输协议,该协议针对发送git变更集进行了优化 . 至于确切的URL,它是这样的,因为github设置其git
服务器的方式 .现在冗长 . 您可以告诉git这样的命令,例如“这里名为
master
的分支”是名为_134021_的远程名为foo
的分支的本地镜像 . 在git中,这意味着master
跟踪bar/foo
. 当您第一次克隆时,您将获得一个名为master
的分支和一个名为origin
的远程(您从中克隆),并使用本地主设置来跟踪原始主数据 . 设置完成后,您可以简单地说git push
并且它会执行此操作 . 如果需要,可以使用更长的命令(例如git push
可能会推送到官方公共仓库,而git push review master
可用于推送到您的团队用来查看代码的单独远程) . 您可以使用git branch
命令的--set-upstream
选项将分支设置为跟踪分支 .从内到外,我更好地理解了这个问题 . 一旦了解了数据库如何在存储库中存储和维护,命令及其执行的操作就变得非常清晰 . 我做同意你的意见,许多
git
用户都有一些精英主义,但我也发现曾经有过UNIX用户,并且值得通过它们来学习系统 . 祝好运!更新:请注意,当前接受的答案会延续common misunderstanding关于
git push
的行为,尽管有评论指出,但仍未更正 .您对遥控器的总结 - 就像存储库URL的昵称 - 是正确的 .
您提到的两个URL表明应该使用两种不同的传输协议 . 以
git://
开头的那个用于git协议,它通常仅用于对存储库的只读访问 . 另一个是git@github.com:peter/first_app.git
,是通过SSH指定对存储库的访问的不同方式之一 - 这是the documentation中描述的"scp-style syntax" . scp样式语法中的用户名是git
是因为GitHub处理识别用户的方式 - 实际上忽略了用户名,并且基于用于进行身份验证的SSH密钥对来识别用户 .至于
git push origin master
的详细程度,您已经注意到在第一次推送之后,您可以执行git push
. 这是因为一系列难以记住但通常有用的默认值:)如果未指定远程,则使用为当前分支配置的远程(在您的情况下为
remote.master.url
) . 如果没有设置,则使用origin
.如果没有指定"refspec"(例如
master
,master:my-experiment
等),则git默认推送与远程分支同名的每个本地分支 . 如果你的存储库和远程存储库之间只有一个名为master
的分支,那就像将master
推送到远程master
一样 .就个人而言,由于我倾向于有许多主题分支(通常是几个遥控器),我总是使用以下形式:
...以避免意外推动其他分支 .
回答你对其他答案之一的评论,听起来好像是以非常有效的方式自上而下地学习git - 你发现默认设置有效,而你的问题是询问原因;)更严重的是,git可以像SVN一样简单地使用,但是对于遥控器和分支的了解意味着你可以更灵活地使用它,这可以真正改变你的工作方式 . 你对一学期课程的评论让我想起了Scott Chacon在一个播客采访中所说的话 - 学生们会学习计算机科学和软件工程中的各种基本工具,但很少有版本控制 . 分布式版本控制系统(如git和Mercurial)现在非常重要,而且非常灵活,因此值得教授课程,以便为人们提供良好的基础 .
我的观点是,使用
git
,这种学习曲线绝对值得 - 使用大量主题分支,轻松合并它们,并且一旦您对系统充满信心,在不同的存储库之间推送和拉动它们就非常有用 . 不幸的是:git的主要文档很难为新手解析 . (虽然我认为,如果你谷歌几乎任何git问题,有用的教程材料(或Stack Overflow答案:))现在出现 . )
git中有一些奇怪的行为现在很难改变,因为许多脚本可能依赖它们,但却让人感到困惑 .
存储库名称末尾的
.git
只是一个约定 . 通常,在git服务器上,存储库保存在名为project.git
的目录中 . 当仅指定project
时,git客户端和协议通过测试project.git
来遵守此约定 .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
如此冗长 . 当你执行git pull
或git push
时,它告诉git如何处理本地master
分支 .git push
和git pull
的默认设置是使用当前分支的远程 . 这是一个比origin master更好的默认值 . git push确定的方式解释为here .git
相当优雅和易于理解,但有一个学习曲线可以走过 .你使用git可能是你是程序员 . 如果你是一个程序员,你可以理解变量是什么!
看一下添加远程仓库的语法 .
例:
让我们剖析一下这个命令:
git remote 这用于管理您的中央服务器以托管您的git存储库 .
可能是您正在使用 Github 作为中央存储库的东西 . 我将举例说明 git remote add origin 命令
假设我正在使用 GitHub 和 BitBucket 作为git存储库的中央服务器,并在我的 first-app 项目的两个网站上创建了存储库 .
现在,如果我想将我的更改推送到这两个git服务器,那么我需要告诉git如何访问这些中央存储库 . 所以我将不得不添加这些,
For GitHub
And For BitBucket
我使用了两个变量(到目前为止我很容易将它们称为变量) gh_origin (gh FOR GITHUB)和 bb_origin (bb for BITBUCKET)只是为了解释你我们可以调用我们想要的任何东西 .
现在,在进行一些更改后,我将不得不将所有这些更改发送(推送)到中央存储库,以便其他用户可以看到这些更改 . 所以我打电话
Pushing to GitHub
Pushing to BitBucket
gh_origin 持有 https://github.com/user/first-app-git.git 的值, bb_origin 持有 https://user@bitbucket.org/user/first-app-git.git 的值
因为每当我需要发送我的代码更改时,我需要使用这些单词而不是记住或键入相同的URL .
大多数时候除了 origin 之外你什么都看不见,因为大多数时候你只会处理一个像Github或BitBucket这样的中央存储库 .
Git远程添加源:
它将您的源代码集中到其他项目 . 它是基于Linux开发的,完全开源并使您的代码对其他git用户有用 . 我们将其称为参考
使用git hub的远程url将代码推送到git存储库 .