保持同步
BY 童仲毅(geeeeeeeeek@github)
这是一篇在原文(BY atlassian)基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名(CC BY 2.5 AU)协议共享。
SVN 使用唯一的中央仓库作为开发者之间沟通的桥梁,在开发者的工作拷贝和中央仓库之间传递变更集合(changeset),协作得以发生。这和Git的协作模型有所不同,Git 给予每个开发者一份自己的仓库拷贝,拥有自己完整的本地历史和分支结构。用户通常共享一系列的提交而不是单个变更集合。Git 允许你在仓库间共享整个分支,而不是从工作副本提交一个差异集合到中央仓库。
下面的命令让你管理仓库之间的连接,将分支「推送」到其他仓库来发布本地历史,或是将分支「拉取」到本地仓库来查看其它开发者的贡献。
git remote
git remote
命令允许你创建、查看和删除和其它仓库之间的连接。远程连接更像是书签,而不是直接跳转到其他仓库的链接。它用方便记住的别名引用不那么方便记住的 URL,而不是提供其他仓库的实时连接。
例如,下图显示了你的仓库和中央仓库以及另一个开发者仓库之间的远程连接。你可以向 Git 命令传递 origin 和 john 的别名来引用这些仓库,替代完整的 URL。
用法
git remote
列出你和其他仓库之间的远程连接。
git remote -v
和上个命令相同,但同时显示每个连接的 URL。
git remote add <name> <url>
创建一个新的远程仓库连接。在添加之后,你可以将 <name>
作为 <url>
便捷的别名在其他 Git 命令中使用。
git remote rm <name>
移除名为远程仓库的连接。
git remote rename <old-name> <new-name>
将远程连接从 <old-name>
重命名为 <new-name>
。
讨论
Git 被设计为给每个开发者提供完全隔离的开发环境。也就是说信息并不是自动地在仓库之间传递。开发者需要手动将上游提交拉取到本地,或手动将本地提交推送到中央仓库中去。git remote
命令正是将 URL 传递给这些「共享」命令的快捷方式。
名为 origin 的远程连接
当你用 git clone
克隆仓库时,它自动创建了一个名为 origin 的远程连接,指向被克隆的仓库。当开发者创建中央仓库的本地副本时非常有用,因为它提供了拉取上游更改和发布本地提交的快捷方式。这也是为什么大多数基于 Git 的项目将它们的中央仓库取名为 origin。
仓库的 URL
Git 支持多种方式来引用一个远程仓库。其中两种最简单的方式便是 HTTP 和 SSH 协议。HTTP 是允许匿名、只读访问仓库的简易方式。比如:
http://host/path/to/repo.git
但是,直接将提交推送到一个 HTTP 地址一般是不可行的(你不太可能希望匿名用户也能随意推送)。如果希望对仓库进行读写,你需要使用 SSH 协议:
ssh://user@host/path/to/repo.git
你需要在托管的服务器上有一个有效的 SSH 账户,但不用麻烦了,Git 支持开箱即用的 SSH 认证连接。
栗子
除了 origin 之外,添加你同事的仓库连接通常会带来一些便利。比如,如果你的同事 John 在 dev.example.com/john.git
上维护了一个公开的仓库,你可以这样添加连接:
git remote add john http://dev.example.com/john.git
通过这种方式访问每个开发者的仓库,中央仓库之外的协作变得可能。这给维护大项目的小团队带来了极大的便利。
git fetch
git fetch
命令将提交从远程仓库导入到你的本地仓库。拉取下来的提交储存为远程分支,而不是我们一直使用的普通的本地分支。你因此可以在整合进你的项目副本之前查看更改。
用法
git fetch <remote>
拉取仓库中所有的分支。同时会从另一个仓库中下载所有需要的提交和文件。
git fetch <remote> <branch>
和上一个命令相同,但只拉取指定的分支。
讨论
当你希望查看其他人的工作进展时,你需要 fetch。fetch 下来的内容表示为一个远程分支,因此不会影响你的本地开发。这是一个安全的方式,在整合进你的本地仓库之前,检查那些提交。类似于 svn update,你可以看到中央仓库的历史进展如何,但它不会强制你将这些进展合并入你的仓库。
远程分支
远程分支和本地分支一样,只不过它们代表这些提交来自于其他人的仓库。你可以像查看本地分支一样查看远程分支,但你会处于分离 HEAD 状态(就像查看旧的提交时一样)。你可以把它们视作只读的分支。如果想要查看远程分支,只需要向 git branch
命令传入 -r
参数。远程分支拥有 remote 的前缀,所以你不会将它们和本地分支混起来。比如,下面的代码片段显示了从 origin 拉取之后,你可能想要查看的分支:
git branch -r
# origin/master
# origin/develop
# origin/some-feature
同样,你可以用寻常的 git checkout
和 git log
命令来查看这些分支。如果你接受远程分支包含的更改,你可以使用 git merge
将它并入本地分支。所以,不像 SVN,同步你的本地仓库和远程仓库事实上是一个分两步的操作:先 fetch,然后 merge。git pull
命令是这个过程的快捷方式。