-
1. 起步
-
2. Git 基础
-
3. Git 分支
-
4. 服务器上的 Git
- 4.1 协议
- 4.2 在服务器上部署 Git
- 4.3 生成 SSH 公钥
- 4.4 架设服务器
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管服务
- 4.10 小结
-
5. 分布式 Git
-
A1. 附录 A: Git 在其他环境
- A1.1 图形界面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 小结
-
A2. 附录 B: 在应用程序中嵌入 Git
-
A3. 附录 C: Git 命令
2.5 Git 基础 - 使用远程仓库
使用远程仓库
为了能够与他人协作,你需要知道如何管理远程仓库。远程仓库是指托管在互联网或其他网络中的项目版本。你可以拥有多个远程仓库,通常其中一些对你来说是只读的,另一些则支持读写。与他人协作涉及到管理这些远程仓库,并在需要共享工作成果时向它们推送或拉取数据。管理远程仓库包括添加远程仓库、移除不再有效的远程仓库、管理各种远程分支并定义它们是否被跟踪等。在本节中,我们将介绍一些远程仓库的管理技巧。
|
注意
|
远程仓库可以位于本地机器上。
你完全可能正在使用一个实际上位于同一台主机上的“远程”仓库。“远程”这个词并不一定意味着仓库位于网络或互联网上的其他地方,它只表示该仓库位于其他位置。使用这样的远程仓库时,依然涉及到与任何其他远程仓库相同的标准推送(push)、拉取(pull)和获取(fetch)操作。 |
查看远程仓库
要查看你配置了哪些远程服务器,可以运行 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 git@github.com:mojombo/grit.git (fetch)
origin git@github.com: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 的形式访问——你可以将其合并到你的某个分支中,或者如果你想检查它,也可以在那一点检出(checkout)一个本地分支。我们将在 Git 分支 中更详细地介绍什么是分支以及如何使用它们。
从远程仓库获取和拉取数据
正如你刚才看到的,要从远程项目中获取数据,可以运行:
$ git fetch <remote>
该命令会访问远程项目,并拉取所有你尚没有的远程项目数据。完成此操作后,你应该会拥有该远程仓库中所有分支的引用,你可以随时将它们合并或进行检查。
如果你克隆了一个仓库,该命令会自动以“origin”为名称添加该远程仓库。因此,git fetch origin 会抓取自你克隆(或上次获取)以来推送到该服务器上的任何新工作。需要特别注意的是,git fetch 命令只会将数据下载到你的本地仓库——它不会自动将其与你的任何工作合并,也不会修改你当前正在进行的工作。当你准备好时,必须手动将其合并到你的工作中。
如果你的当前分支设置为跟踪某个远程分支(见下一节及 Git 分支 获取更多信息),你可以使用 git pull 命令自动获取并合并该远程分支到你的当前分支。这对你来说可能是一种更轻松、更舒适的工作流;默认情况下,git clone 命令会自动设置你的本地 master 分支去跟踪克隆来源服务器上的远程 master 分支(或默认分支名称)。运行 git pull 通常会从你最初克隆的服务器获取数据,并自动尝试将其合并到你当前工作的代码中。
|
注意
|
从 Git 2.27 版本开始,如果未设置 如果你想要 Git 的默认行为(如果可能则快进,否则创建一个合并提交): 如果你想在拉取时进行变基(rebase): |
推送到远程仓库
当你的项目达到想要分享的状态时,你必须将它推送到上游。该命令很简单: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 remove 或 git remote rm。
$ git remote remove paul
$ git remote
origin
一旦你通过这种方式删除了远程仓库的引用,所有与该远程仓库关联的远程跟踪分支和配置设置也都会被删除。