Git
章节 ▾ 第二版

2.5 Git 基础 - 使用远程仓库

使用远程仓库

为了能够协作处理任何 Git 项目,您需要了解如何管理远程仓库。远程仓库是您的项目托管在互联网或某个网络上的版本。您可以拥有多个远程仓库,每个远程仓库通常对您而言要么是只读的,要么是可读写的。与他人协作涉及管理这些远程仓库,并在需要共享工作时向其推送和拉取数据。管理远程仓库包括了解如何添加远程仓库、删除不再有效的远程仓库、管理各种远程分支并将它们定义为跟踪或不跟踪等。在本节中,我们将介绍一些远程管理技能。

注意
远程仓库可以位于您的本地机器上。

您完全有可能正在使用一个“远程”仓库,而它实际上位于与您相同的宿主机上。“远程”一词并不一定意味着仓库位于网络或互联网上的其他位置,而仅仅意味着它位于其他地方。处理此类远程仓库仍然需要执行与任何其他远程仓库相同的标准推送、拉取和获取操作。

显示您的远程仓库

要查看您配置了哪些远程服务器,您可以运行 git remote 命令。它列出您指定的每个远程句柄的简称。如果您克隆了您的仓库,您应该至少看到 origin——这是 Git 为您克隆的服务器提供的默认名称。

$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin

您还可以指定 -v,它会显示 Git 为简称存储的 URL,用于读取和写入该远程仓库。

$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)

如果您有多个远程仓库,该命令会列出所有远程仓库。例如,一个与多个协作者一起工作的仓库可能如下所示。

$ cd grit
$ git remote -v
bakkdoor  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    [email protected]:mojombo/grit.git (fetch)
origin    [email protected]:mojombo/grit.git (push)

这意味着我们可以很容易地从这些用户中的任何一个拉取贡献。我们可能还被授权向其中一个或多个推送,尽管我们在这里无法得知。

请注意,这些远程仓库使用了各种协议;我们将在 在服务器上安装 Git 中详细介绍。

添加远程仓库

我们已经提到并演示了 git clone 命令如何为您隐式添加 origin 远程仓库。以下是显式添加新远程仓库的方法。要将新的 Git 远程仓库添加为一个易于引用的简称,请运行 git remote add <shortname> <url>

$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin	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

$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
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 分支 中更详细地介绍什么是分支以及如何使用它们。

从远程仓库获取和拉取

正如你所看到的,要从远程项目获取数据,你可以运行

$ git fetch <remote>

该命令会连接到那个远程项目,并下载你还没有的所有数据。执行此操作后,你应该能够看到所有来自该远程项目的引用分支,你可以随时合并或检查它们。

如果你克隆了一个仓库,该命令会自动在名为“origin”下添加该远程仓库。所以,git fetch origin 会获取自你克隆(或上次获取)以来推送到该服务器上的任何新工作。需要注意的是,git fetch 命令只会将数据下载到你的本地仓库,不会自动将其与你的任何工作合并或修改你当前正在处理的内容。当你准备好时,必须手动将其合并到你的工作中。

如果你的当前分支被设置为跟踪一个远程分支(请参阅下一节和Git 分支以获取更多信息),你可以使用git pull命令自动获取并将其合并到你的当前分支中。这可能对你来说是一个更简单或更舒适的工作流程;默认情况下,git clone命令会自动设置你的本地master分支以跟踪你克隆的服务器上的远程master分支(或任何默认分支名称)。运行git pull通常会从你最初克隆的服务器获取数据,并尝试将其自动合并到你当前正在处理的代码中。

注意

从 Git 2.27 版本开始,如果未设置pull.rebase变量,git pull将发出警告。Git 将持续警告你,直到你设置该变量。

如果你希望使用 Git 的默认行为(如果可能则快进,否则创建合并提交):git config --global pull.rebase "false"

如果你希望在拉取时进行变基:git config --global pull.rebase "true"

推送到远程仓库

当你将项目发展到想要分享的阶段时,你需要将其推送到上游。此命令很简单:git push <remote> <branch>。如果你想将你的master分支推送到你的origin服务器(再次强调,克隆通常会自动为你设置这两个名称),那么你可以运行此命令将你所做的任何提交都推送到服务器上。

$ git push origin master

此命令仅在你从具有写入权限的服务器克隆并且在此期间没有人推送的情况下才有效。如果你和其他人同时克隆,并且他们推送到上游,然后你再推送到上游,你的推送将被拒绝。你必须先获取他们的工作并将其合并到你的工作中,然后才能被允许推送。请参阅Git 分支以获取有关如何推送到远程服务器的更多详细信息。

检查远程仓库

如果你想查看有关特定远程仓库的更多信息,可以使用git remote show <remote>命令。如果你使用特定的简称(如origin)运行此命令,则会得到如下所示的内容

$ git remote 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 configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

它列出了远程仓库的 URL 以及跟踪分支信息。该命令会帮助你了解,如果你在master分支上并运行git pull,它将在获取远程master分支后将其自动合并到本地分支中。它还列出了它已下载的所有远程引用。

这是一个你可能遇到的简单示例。但是,当你更深入地使用 Git 时,你可能会从git remote show中看到更多信息。

$ git remote 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 store in remotes/origin)
    issue-45                         new (next fetch will store in remotes/origin)
    refs/remotes/origin/issue-11     stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    dev-branch merges with remote dev-branch
    master     merges with remote master
  Local refs configured for 'git push':
    dev-branch                     pushes to dev-branch                     (up to date)
    markdown-strip                 pushes to markdown-strip                 (up to date)
    master                         pushes to master                         (up to date)

此命令显示在某些分支上运行git push时自动推送到哪个分支。它还显示了你还没有的服务器上的哪些远程分支,你拥有的哪些远程分支已从服务器中删除,以及多个本地分支在运行git pull时能够自动与其远程跟踪分支合并。

重命名和删除远程仓库

你可以运行git remote rename来更改远程仓库的简称。例如,如果你想将pb重命名为paul,你可以使用git remote rename

$ git remote rename pb paul
$ git remote
origin
paul

值得一提的是,这也会更改你所有的远程跟踪分支名称。以前在pb/master中引用的内容现在位于paul/master中。

如果你由于某种原因想要删除一个远程仓库——你已移动服务器或不再使用特定的镜像,或者可能某个贡献者不再贡献——你可以使用git remote removegit remote rm

$ git remote remove paul
$ git remote
origin

通过这种方式删除对远程仓库的引用后,与该远程仓库关联的所有远程跟踪分支和配置设置也将被删除。

scroll-to-top