-
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
,它会显示每个简写名称对应的 URL。这样你可以看到 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 <简写名> <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
现在,你可以在本地通过pb/master
访问 Paul 的 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
一旦你以这种方式删除对远程仓库的引用,所有与该远程仓库关联的远程跟踪分支和配置设置也会被删除。