-
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 基础 - 使用远程仓库
使用远程仓库
为了能够在任何 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 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 — 你可以将其合并到你的一个分支中,或者如果你想检查它,可以在那个点检出一个本地分支。我们将在Git 分支中更详细地介绍分支是什么以及如何使用它们。
从你的远程仓库抓取和拉取
正如你刚才看到的,要从你的远程项目获取数据,你可以运行
$ git fetch <remote>
该命令会访问那个远程项目,并抓取所有你还没有的来自该远程项目的数据。完成此操作后,你应该会拥有对该远程仓库所有分支的引用,你可以随时合并或检查它们。
如果你克隆一个仓库,该命令会自动以“origin”的名称添加该远程仓库。因此,git fetch origin 会抓取自你克隆(或上次抓取)以来推送到该服务器的任何新工作。需要注意的是,git fetch 命令只将数据下载到你的本地仓库 — 它不会自动将其与你的任何工作合并或修改你当前正在进行的工作。你必须在准备好时手动将其合并到你的工作中。
如果你的当前分支设置为跟踪一个远程分支(更多信息请参阅下一节和Git 分支),你可以使用 git pull 命令自动抓取并将该远程分支合并到你的当前分支。这可能对你来说是一种更简单或更舒适的工作流程;默认情况下,git clone 命令会自动设置你的本地 master 分支来跟踪你克隆来源服务器上的远程 master 分支(或任何默认分支的名称)。运行 git pull 通常会从你最初克隆的服务器抓取数据,并自动尝试将其合并到你当前正在处理的代码中。
|
注意
|
从 Git 2.27 版本开始,如果未设置 如果你想要 Git 的默认行为(如果可能则快进,否则创建合并提交): 如果你想在拉取时变基: |
推送到你的远程仓库
当你的项目达到你想要分享的某个点时,你必须将其推送到上游。该命令很简单: 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
一旦你通过这种方式删除对远程仓库的引用,所有与该远程仓库关联的远程跟踪分支和配置设置也将被删除。