git本地分支,远程分支,远程跟踪分支的关系
一、我的理解
其实概念很简单,本地分支就是在本地机器上的分支;远程分支就是远程机器上的分支;远程跟踪分支就是跟踪远程分支的分支,这个远程跟踪分支也是在本地上的,但是你不能切换到该分支上,也不能修改它的数据。
随着你进一步开发:
可以看到远程跟踪分支一直指向d5a22c,而本地分支一直向前移动,所以远程跟踪分支只是用来标识本地电脑上一次与远程服务器通信时的远程分支状态而已。
二、设置远程跟踪分支
(1)新建分支并跟踪远程分支
假如你有一个远程分支new1,本地还没有该分支:你可以使用以下语法创建一个本地分支,并对远程分支进行跟踪。也就是创建一个本地分支和一个远程跟踪分支。
git checkout -b <新建的本地分支> <远程服务器名称>/<远程分支名称>
以new1为例:新建new1本地分支跟踪远程服务器new1分支。
git checkout -b new1 origin/new1
你也可以随便命名:新建sbsb分支,跟踪远程服务器new1分支
git checkout -b sbsb origin/new1
但是通常情况下,本地分支如果跟踪远程分支,应该名称一样,才不易混淆。
以下命令也可以新建分支跟踪远程分支:
git checkout --track <远程服务器名称>/<远程分支名称>
同样以new1为例子:
git checkout --track origin/new1
可以看到 git checkout --track 省去了命名本地分支,因为它默认新建的分支与远程分支同名。
(2)指定已有的分支跟踪远程分支
语法:-u其实是 --set-upstream-to,即设置上游分支,(一些书中也称远程分支为上游分支,两者等价)
git branch <已有分支的名称> -u <远程服务器名称>/<远程分支名称>
假如你有一个本地分支test,你就想用这个test分支跟踪远程分支new1。
假设你现在处于分支test下,那么直接使用:
git branch -u origin/new1
假设你在其他分支下。你需要显示的指明出来:
git branch test -u origin/new1
如果你现在就想直接推送,并且设置远程分支,你可以使用以下语法:
git push -u <远程服务器名称>/<远程分支名称>
例子:当前在test分支上,我们想把test的内容推送到new1上,并设置new1为远程分支,进行跟踪
git push -u origin/new1
(3) 设置远程跟踪分支的好处
1. 一旦设置了远程分支,那么你直接使用git push, git fetch, git pull等命令就可以直接达到目的,而不用像原来一样再git push <远程服务器名称> <远程分支名称>。
2.设置了远程跟踪分支,我们可以知道我们上一次和远程服务器通信时,远程分支的进度在哪里。
例子:假设test分支已经对new1设置了远程跟踪,那么当前我们可以在test直接执行以下命令。
git push
git fetch
git pull
由于设置了远程跟踪分支,git直接知道从哪里拉取或推送代码,省略了之前的远程服务器名和远程分支名。
(4)查看远程分支与本地分支的跟踪情况
git branch -vv
以我电脑的某个仓库运行结果为例子:
上面有四行四列,第一列为本地分支名,第二列对应的hash值,第三列对应的远程分支,第四列git commit提交的注释。
可以看到有四个分支对远程服务器的分支进行跟踪,其中,new2 和 newkk 分支跟踪的远程分支都是new2。
(5)删除远程分支
1.删除远程分支:
git push <远程服务器名> --delete <远程分支名>
2.查找仍然在远程跟踪,但是远程已删除的无用分支(什么时候会出现这种情况?1.直接在代码托管平台删除该远程分支;2.同事运行了git push <远程服务器名> --delete <远程分支名>;这两种情况都不是在你本地上的操作,那么你本地依然会远程跟踪这些已删除的无用分支)
git remote prune <远程服务器名> --dry-run
3.清除仍然在远程跟踪,但是远程已删除的无用分支
git remote prune <远程服务器名>