远程仓库的使用为了能在任意 Git 项目上协作你需要知道如何管理自己的远程仓库。远程仓库是指托管在因特网或其他网络中的你的项目的版本库。你可以有好几个远程仓库通常有些仓库对你只读有些则可以读写。与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。在本节中我们将介绍一部分远程管理的技能。Note远程仓库可以在你的本地主机上你完全可以在一个远程仓库上工作而实际上它在你本地的主机上。词语远程未必表示仓库在网络或互联网上的其它位置而只是表示它在别处。在这样的远程仓库上工作仍然需要和其它远程仓库上一样的标准推送、拉取和抓取操作。查看远程仓库如果想查看你已经配置的远程仓库服务器可以运行git remote命令。它会列出你指定的每一个远程服务器的简写。如果你已经克隆了自己的仓库那么至少应该能看到origin——这是 Git 给你克隆的仓库服务器的默认名字$gitclone https://github.com/schacon/ticgit Cloning intoticgit... remote: Reusing existing pack:1857, done. remote: Total1857(delta0), reused0(delta0)Receiving objects:100%(1857/1857),374.35KiB|268.00KiB/s, done. Resolving deltas:100%(772/772), done. Checking connectivity... done. $cdticgit $gitremote origin你也可以指定选项-v会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL$gitremote-vorigin https://github.com/schacon/ticgit(fetch)origin https://github.com/schacon/ticgit(push)如果你的远程仓库不止一个该命令会将它们全部列出。例如与几个协作者合作的、拥有多个远程仓库的仓库看起来像下面这样$cdgrit $gitremote-vbakkdoor https://github.com/bakkdoor/grit(fetch)bakkdoor https://github.com/bakkdoor/grit(push)cho45 https://github.com/cho45/grit(fetch)cho45 https://github.com/cho45/grit(push)defunkt https://github.com/defunkt/grit(fetch)defunkt https://github.com/defunkt/grit(push)koke git://github.com/koke/grit.git(fetch)koke git://github.com/koke/grit.git(push)origin gitgithub.com:mojombo/grit.git(fetch)origin gitgithub.com:mojombo/grit.git(push)这表示我们能非常方便地拉取其它用户的贡献。我们还可以拥有向他们推送的权限这里暂不详述。注意这些远程仓库使用了不同的协议我们将会在在服务器上搭建 Git中了解关于它们的更多信息。添加远程仓库我们在之前的章节中已经提到并展示了git clone命令是如何自行添加远程仓库的不过这里将告诉你如何自己来添加它。运行git remote add shortname url添加一个新的远程 Git 仓库同时指定一个方便使用的简写$gitremote origin $gitremoteaddpb https://github.com/paulboone/ticgit $gitremote-vorigin https://github.com/schacon/ticgit(fetch)origin https://github.com/schacon/ticgit(push)pb https://github.com/paulboone/ticgit(fetch)pb https://github.com/paulboone/ticgit(push)现在你可以在命令行中使用字符串pb来代替整个 URL。例如如果你想拉取 Paul 的仓库中有但你没有的信息可以运行git fetch pb$gitfetch pb remote: Counting objects:43, done. remote: Compressing objects:100%(36/36), done. remote: Total43(delta10), reused31(delta5)Unpacking objects:100%(43/43), done. From https://github.com/paulboone/ticgit *[new branch]master -pb/master *[new branch]ticgit -pb/ticgit现在 Paul 的master分支可以在本地通过pb/master访问到——你可以将它合并到自己的某个分支中或者如果你想要查看它的话可以检出一个指向该点的本地分支我们将会在Git 分支中详细介绍什么是分支以及如何使用分支。从远程仓库中抓取与拉取就如刚才所见从远程仓库中获得数据可以执行$gitfetchremote这个命令会访问远程仓库从中拉取所有你还没有的数据。执行完成后你将会拥有那个远程仓库中所有分支的引用可以随时合并或查看。如果你使用clone命令克隆了一个仓库命令会自动将其添加为远程仓库并默认以origin为简写。所以git fetch origin会抓取克隆或上一次抓取后新推送的所有工作。必须注意git fetch命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。当准备好时你必须手动将其合并入你的工作。如果你的当前分支设置了跟踪远程分支阅读下一节和Git 分支了解更多信息那么可以用git pull命令来自动抓取后合并该远程分支到当前分支。这或许是个更加简单舒服的工作流程。默认情况下git clone命令会自动设置本地master分支跟踪克隆的远程仓库的master分支或其它名字的默认分支。运行git pull通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。推送到远程仓库当你想分享你的项目时必须将其推送到上游。这个命令很简单git push remote branch。当你想要将master分支推送到origin服务器时再次说明克隆时通常会自动帮你设置好那两个名字那么运行这个命令就可以将你所做的备份到服务器$gitpush origin master只有当你有所克隆服务器的写入权限并且之前没有人推送过时这条命令才能生效。当你和其他人在同一时间克隆他们先推送到上游然后你再推送到上游你的推送就会毫无疑问地被拒绝。你必须先抓取他们的工作并将其合并进你的工作后才能推送。阅读Git 分支了解如何推送到远程仓库服务器的详细信息。查看某个远程仓库如果想要查看某一个远程仓库的更多信息可以使用git remote show remote命令。如果想以一个特定的缩写名运行这个命令例如origin会得到像下面类似的信息$gitremote show origin * remote origin Fetch URL: https://github.com/schacon/ticgit Push URL: https://github.com/schacon/ticgit HEAD branch: master Remote branches: master tracked dev-branch tracked Local branch configuredforgit pull:master merges with remote master Local ref configuredforgit push:master pushes to master(up todate)它同样会列出远程仓库的 URL 与跟踪分支的信息。这些信息非常有用它告诉你正处于master分支并且如果运行git pull就会抓取所有的远程引用然后将远程master分支合并到本地master分支。它也会列出拉取到的所有远程引用。这是一个经常遇到的简单例子。如果你是 Git 的重度使用者那么还可以通过git remote show看到更多的信息$gitremote show origin * remote origin URL: https://github.com/my-org/complex-project Fetch URL: https://github.com/my-org/complex-project Push URL: https://github.com/my-org/complex-project HEAD branch: master Remote branches: master tracked dev-branch tracked markdown-strip tracked issue-43 new(next fetch will storeinremotes/origin)issue-45 new(next fetch will storeinremotes/origin)refs/remotes/origin/issue-11 stale(usegit remote pruneto remove)Local branches configuredforgit pull:dev-branch merges with remote dev-branch master merges with remote master Local refs configuredforgit push:dev-branch pushes to dev-branch(up todate)markdown-strip pushes to markdown-strip(up todate)master pushes to master(up todate)这个命令列出了当你在特定的分支上执行git push会自动地推送到哪一个远程分支。它也同样地列出了哪些远程分支不在你的本地哪些远程分支已经从服务器上移除了还有当你执行git pull时哪些本地分支可以与它跟踪的远程分支自动合并。远程仓库的重命名与移除你可以运行git remote rename来修改一个远程仓库的简写名。例如想要将pb重命名为paul可以用git remote rename这样做$gitremoterenamepb paul $gitremote origin paul值得注意的是这同样也会修改你所有远程跟踪的分支名字。那些过去引用pb/master的现在会引用paul/master。如果因为一些原因想要移除一个远程仓库——你已经从服务器上搬走了或不再想使用某一个特定的镜像了又或者某一个贡献者不再贡献了——可以使用git remote remove或git remote rm$gitremote remove paul $gitremote origin一旦你使用这种方式删除了一个远程仓库那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。命令速查命令用途git remote列出所有远程仓库的简写名git remote -v列出所有远程仓库的简写名及对应 URLgit remote add name url添加一个新的远程仓库git fetch remote从远程仓库拉取数据不自动合并git pull remote branch从远程仓库拉取数据并自动合并到当前分支git push remote branch将本地分支推送到远程仓库git remote show remote查看某个远程仓库的详细信息git remote rename old new重命名远程仓库的简写名git remote remove remote移除远程仓库