Git 分支 - 远程分支
- push远程分支
- 跟踪分支
- pull远程分支
- 删除远程分支
远程引用是远程存储库中的引用(指针),包括分支、标记等。您可以使用 或 远程分支 显式获取远程引用的完整列表以及更多信息。但是,更常见的方法是利用远程跟踪分支。git ls-remote git remote show
远程跟踪分支是对远程分支状态的引用。它们是您无法移动的本地引用;每当您进行任何网络通信时,Git 都会为您移动它们,以确保它们准确地表示远程存储库的状态。将它们视为书签,以提醒您上次连接到远程存储库中的分支的位置。
远程跟踪分支名称采用 的形式。例如,如果您想查看遥控器上的分支在您上次与其通信时的样子,则可以检查分支。如果您正在与合作伙伴一起处理问题,并且他们推送了分支,则您可能拥有自己的本地分支,但服务器上的分支将由远程跟踪分支表示。/masteroriginorigin/masteriss53iss53origin/iss53
这可能有点令人困惑,所以让我们看一个例子。假设您的网络上有一台 Git 服务器,地址为 。如果您从中克隆,Git 的命令会自动为您命名它,拉取其所有数据,创建一个指向其分支所在位置的指针,并在本地命名。Git 还为您提供了自己的本地分支,从 origin 的分支所在的同一位置开始,因此您有一些工作要做。git.ourcompany.comcloneoriginmasterorigin/mastermastermaster
如果您在本地分支上执行一些工作,同时其他人推送并更新其分支,则您的历史记录将以不同的方式向前发展。此外,只要您与服务器保持接触,指针就不会移动。mastergit.ourcompany.commasteroriginorigin/master
要将工作与给定的遥控器同步,请运行一个命令(在本例中为 )。此命令查找哪个服务器“origin”是哪个服务器(在本例中是 ),从中获取您尚未拥有的任何数据,并更新本地数据库,将指针移动到其新的、更新的位置。git fetch git fetch origingit.ourcompany.comorigin/master
为了演示拥有多个远程服务器以及这些远程项目的远程分支是什么样子的,让我们假设您有另一个内部 Git 服务器,该服务器仅由您的一个 sprint 团队用于开发。此服务器位于 。您可以通过运行 Git Basics 中介绍的命令,将其作为新的远程引用添加到当前正在处理的项目。将此遥控器命名为 ,这将是整个URL的缩写。git.team1.ourcompany.comgit remote addteamone
现在,您可以运行以获取远程服务器尚未拥有的所有内容。由于该服务器具有服务器当前拥有的数据的子集,因此 Git 不会提取任何数据,而是设置一个名为的远程跟踪分支,以指向作为其分支的提交。git fetch teamoneteamoneoriginteamone/masterteamonemaster
push远程分支
当您想与全世界共享分支时,您需要将其推送到您具有写入权限的远程数据库。您的本地分支不会自动同步到您写入的远程数据库 - 您必须显式推送要共享的分支。这样,您就可以将私有分支用于您不想共享的工作,并仅推送要协作的主题分支。
如果你有一个名为要与其他人一起工作的分支,你可以像推送第一个分支一样将其向上推送。跑:serverfixgit push
$ git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
* [new branch] serverfix ->
这有点像捷径。Git 会自动将分支名称扩展到 ,这意味着“获取我的本地分支并推送它以更新远程分支。我们将在 Git Internals 中详细介绍该部分,但您通常可以将其关闭。你也可以做,它做同样的事情 - 它说,“拿走我的服务器修复,让它成为远程的服务器修复。您可以使用此格式将本地分支推送到名称不同的远程分支中。如果不希望在远程项目上调用它,则可以改为运行以将本地分支推送到远程项目上的分支。serverfixrefs/heads/serverfix:refs/heads/serverfixserverfixserverfixrefs/heads/git push origin serverfix:serverfixserverfixgit push origin serverfix:awesomebranchserverfixawesomebranch
下次您的某个协作者从服务器获取时,他们将获得对服务器版本在远程分支下的位置的引用:serverfixorigin/serverfix
$ git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
* [new branch] serverfix ->
请务必注意,当您执行导致新的远程跟踪分支关闭的提取时,您不会自动拥有它们的本地可编辑副本。换句话说,在这种情况下,你没有一个新的分支 - 你只有一个你无法修改的指针。serverfixorigin/serverfix
要将此工作合并到当前工作分支中,可以运行 。如果您想要自己的分支,则可以基于远程跟踪分支:git merge origin/serverfixserverfix
$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
这为您提供了一个本地分支,您可以从哪里开始工作。origin/serverfix
跟踪分支
从远程跟踪分支签出本地分支会自动创建所谓的“跟踪分支”(它跟踪的分支称为“上游分支”)。跟踪分支是与远程分支有直接关系的本地分支。如果您在跟踪分支上并键入 ,Git 会自动知道要从哪个服务器获取以及要合并到哪个分支中。git pull
克隆存储库时,它通常会自动创建一个跟踪 的分支。但是,如果您愿意,可以设置其他跟踪分支 - 跟踪其他远程数据库上的分支或不跟踪分支的分支。简单的例子是你刚刚看到的例子,运行。这是 Git 提供的速记足够常见的操作:
masterorigin/mastermastergit checkout -b <branch> <remote>/<branch>--track
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
事实上,这很常见,甚至有一个快捷方式。如果您尝试签出的分支名称 (a) 不存在,并且 (b) 仅与一个远程数据库上的名称完全匹配,Git 将为您创建一个跟踪分支:
$ git checkout serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
要设置与远程分支名称不同的本地分支,您可以轻松地使用具有不同本地分支名称的第一个版本:
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'
现在,您的本地分支将自动从 中拉取。sforigin/serverfix
如果您已经有一个本地分支,并希望将其设置为刚刚拉下的远程分支,或者想要更改要跟踪的上游分支,则可以使用 or 选项随时显式设置它。-u–set-upstream-togit branch
$ git branch -u origin/serverfix
Branch serverfix set
如果要查看已设置的跟踪分支,可以使用以下选项。这将列出您的本地分支机构,其中包含更多信息,包括每个分支机构正在跟踪的内容以及您的本地分支机构是否领先,落后或两者兼而有之。-vvgit branch
$ git branch -vv
iss53 7e424c3 [origin/iss53: ahead 2] Add forgotten brackets
master 1ae2a45 [origin/master] Deploy index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] This should do
因此,在这里我们可以看到我们的分支正在跟踪并且“领先”了两个,这意味着我们在本地有两个提交没有被推送到服务器。我们还可以看到我们的分支机构正在跟踪并且是最新的。接下来,我们可以看到我们的分支正在跟踪我们服务器上的分支,并且领先三个,落后一个,这意味着我们尚未合并的服务器上有一个提交,以及三个本地尚未推送的提交。最后,我们可以看到我们的分支没有跟踪任何远程分支。iss53origin/iss53masterorigin/masterserverfixserver-fix-goodteamonetesting
请务必注意,这些数字仅自您上次从每个服务器获取以来。此命令不会连接到服务器,它会告诉您它从本地服务器缓存的内容。如果您想完全了解之前和后面的数字,则需要在运行此数据之前从所有遥控器中获取。你可以这样做:
$ git fetch --all; git
pull远程分支
虽然该命令将获取服务器上您尚未拥有的所有更改,但它根本不会修改您的工作目录。它将简单地为您获取数据,并让您自己合并。但是,有一个调用的命令,在大多数情况下,它基本上是紧跟在 a 之后的命令。如果您设置了跟踪分支,如上一节中所示,则通过显式设置它或通过 or 命令为您创建跟踪分支,将查找当前分支正在跟踪的服务器和分支,从该服务器获取,然后尝试合并到该远程分支中。git fetchgit pullgit fetchgit mergeclonecheckoutgit pull
通常,最好只是显式地使用 和 命令,因为 的魔力经常会令人困惑。fetchmergegit pull
删除远程分支
假设你已经完成了一个远程分支——假设你和你的协作者已经完成了一个功能,并已将其合并到远程分支(或你的稳定代码线所在的任何分支)中。您可以使用选项删除远程分支。如果要从服务器中删除分支,请运行以下命令:master–deletegit pushserverfix
$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
- [deleted]