远程跟踪分支
远程仓库中的分支,都会在本地建立一个对应的远程跟踪分支。
远程跟踪分支以
remote/branch
形式命名。远程跟踪分支是不可变的,只有当发生任何网络通信操作时,它才会自动移动。
只要不与远程服务器连接,你的 远程跟踪分支 就不会移动。例如当使用
git fetch origin
时,才会更新 origin 的所有远程跟踪分支的指向。每一次运行 commit 时,只是更新了本地分支的指向,并不会影响远程跟踪分支。
远程跟踪分支跟普通的分支一样,只不过它的指向是自动修改的。其位于 .git/refs/remotes/<remote>/ 目录下。而普通的本地分支位于 .git/refs/heads 目录下。
跟踪分支
跟踪分支是与远程分支有直接关系的本地分支。如果在一个跟踪分支上输入 git pull,Git 能自动地识别去哪个服务器上抓取、合并到哪个分支。
创建
-
使用
git checkout --track <remote>/<branch>
创建一个与远程分支同名的本地跟踪分支。该命令会自动切换到新建的分支上。$ git checkout --track origin/tra Branch tra set up to track remote branch tra from origin. Switched to a new branch 'tra' $ git branch dev master re * tra
此时再使用 git push 命令时,它会将 tra 分支上的修改推到远程的 tra 分支上。不需要写成
git push origin tra:tra
。 -
使用
git checkout -b <branch> <remote>/<branch>
创建一个指定名字的跟踪分支。由于远程跟踪分支也指向了一个提交结点,所以可以在在该结点上建立分支。$ git checkout -b tra2 origin/tra Branch tra2 set up to track remote branch tra from origin. Switched to a new branch 'tra2'
上述操作会新建立一个 tra2 分支用于跟踪 origin/tra 分支。
当分支名不相同时,如果直接使用
git push
会报如下错误:$ git push fatal: The upstream branch of your current branch does not match the name of your current branch. To push to the upstream branch on the remote, use git push origin HEAD:tra To push to the branch of the same name on the remote, use git push origin tra2
这是因为本地分支名与远程分支名不相同,无法直接提交。可以将 push.default 设置为 upstream 解决该问题。参考
$ git config --global push.default upstream
删除
删除远程分支
使用 git push <remote> --delete <branch>
删除远程分支。
撤销本地跟踪分支
使用git branch --unset-upstream
可以撤销跟踪分支。`
$ git branch -vv
* dev 465413b [origin/tra: ahead 20, behind 5] update from local
$ git branch --unset-upstream
$ git branch -vv
* dev 465413b update from local
开始时 dev 跟踪的是 origin/tra 分支,通过 --unset-upstream 后, dev 没有跟踪任何分支。
修改
修改主要有两种操作:设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支(upstream)。
修改主要通过 git branch -u <remotebranch>
或 git branch --set-upstream-to <remotebranch>
。
$ git branch -vv
* dev 465413b update from local
master c5c9b73 [origin/master: ahead 2] c2
$ git branch -u origin/re
Branch dev set up to track remote branch re from origin.
$ git branch -vv
* dev 465413b [origin/re: ahead 20, behind 1] update from local
master c5c9b73 [origin/master: ahead 2] c2
可以看出,dev 分支起初并没有关联远程分支;通过 git branch -u 命令后,其上游(upstream) 分支变成了 origin/re。
下面操作接上面命令:
$ git branch --set-upstream-to origin/tra
Branch dev set up to track remote branch tra from origin.
$ git branch -vv
* dev 465413b [origin/tra: ahead 20, behind 5] update from local
master c5c9b73 [origin/master: ahead 2] c2
查看
使用 git branch -vv
查看设置的所有跟踪分支。
$ git branch -vv
dev a6816c6 merge master
master c5c9b73 [origin/master: ahead 2] c2
* tra2 3f95421 [origin/tra: ahead 2, behind 1] -vv
可以看出,dev 没有跟踪的远程分支;master 跟踪的是远程的 master 分支;tra2 跟踪的是远程的 tra 分支。
tra2 分支中, ahead 值为 2,表示本地尚有 2 个提交没有推送到远程仓库中。behind 值为 1,表示远程仓库中尚有 1 次提交未进行合并。
注意:该操作并不会执行网络请求,它的所有数据都是来源于上一次从远程仓库中抓取的数据。
如:
$ git branch -vv
dev a6816c6 merge master
master c5c9b73 [origin/master: ahead 2] c2
* tra2 7872297 [origin/tra: ahead 2, behind 1] update a2
$ git fetch origin
$ git branch -vv
dev a6816c6 merge master
master c5c9b73 [origin/master: ahead 2] c2
* tra2 7872297 [origin/tra: ahead 2, behind 2] update a2
在拉取之前 behind 值为 1,拉取之后值为 2。这是因为在拉取之前,远程仓库中已有两次提交,但 fetch 并不进行网络操作,所以其显示的 behind 只是 1(本地的)。拉取之后,将远程仓库的两次提交都拉取到本地,所以 behind 值变成了 2。