为了能在任意 Git 项目上协作,我们需要知道如何管理自己的远程仓库。 远程仓库是指托管在因特网或其他网络中我们项目的版本库。 我们可以有好几个远程仓库,通常有些仓库对我们只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。 管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。
Note | 远程仓库可以在我们的本地主机上 我们完全可以在一个“远程”仓库上工作,而实际上它在我们本地的主机上。 词语“远程”未必表示仓库在网络或互联网上的其它位置,而只是表示它在别处。 在这样的远程仓库上工作,仍然需要和其它远程仓库上一样的标准推送、拉取和抓取操作。 |
---|
如果想查看我们已经配置的远程仓库服务器,可以运行 git remote
命令。 它会列出我们指定的每一个远程服务器的简写。 如果我们已经克隆了自己的仓库,那么至少应该能看到 origin ——这是 Git 给你克隆的仓库服务器的默认名字:
$ git clone https://github.com/schacon/ticgit
$ cd ticgit
$ git remote
我们也可以指定选项 -v
,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
$ git remote -v
如果我们的远程仓库不止一个,该命令会将它们全部列出。
运行 git remote add <shortname> <url>
添加一个新的远程 Git 仓库,同时指定一个方便使用的简写:
$ git remote
$ git remote add pd https://github.com/paulboone/ticgit
$ git remote -v
现在我们可以在命令行中使用字符串 pb
来代替整个 URL。 例如,如果我们想拉取 Paul 的仓库中有但我们没有的信息,可以运行 git fetch pb
:
$ git fetch pd
从远程仓库中获得数据,可以执行:
$ git fetch <remote>
如果我们使用 clone
命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin
会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch
命令只会将数据下载到我们的本地仓库——它并不会自动合并或修改我们当前的工作。 当准备好时我们必须手动将其合并入我们的工作。
如果我们的当前分支设置了跟踪远程分支, 那么可以用 git pull
命令来自动抓取后合并该远程分支到当前分支。 这或许是个更加简单舒服的工作流程。默认情况下,git clone
命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master
分支(或其它名字的默认分支)。 运行 git pull
通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
当我们想分享我们的项目时,必须将其推送到上游。 这个命令很简单:git push <remote> <branch>
。 当我们想要将 master
分支推送到 origin
服务器时(再次说明,克隆时通常会自动帮我们设置好那两个名字), 那么运行这个命令就可以将我们所做的备份到服务器:
$ git push origin master
只有当我们有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当我们和其他人在同一时间克隆,他们先推送到上游然后我们再推送到上游,我们的推送就会毫无疑问地被拒绝。 我们必须先抓取他们的工作并将其合并进我们的工作后才能推送。
如果想要查看某一个远程仓库的更多信息,可以使用 git remote show <remote>
命令。 如果想以一个特定的缩写名运行这个命令,例如 origin
,会得到像下面类似的信息:
$ git remote show origin
我们可以运行 git remote rename
来修改一个远程仓库的简写名。 例如,想要将 pb
重命名为 paul
,可以用 git remote rename
这样做:
$ git remote rename pd paul
$ git remote
注意: 这同样也会修改我们所有远程跟踪的分支名字。 那些过去引用 pb/master
的现在会引用 paul/master
。
如果因为一些原因想要移除一个远程仓库——我们已经从服务器上搬走了或不再想使用某一个特定的镜像了, 又或者某一个贡献者不再贡献了——可以使用 git remote remove
或 git remote rm
:
$ git remote remove paul
$ git remote
注意: 一旦使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。