前言
分支跟踪指的是本地分支跟踪远程分支,即两者建立一个映射关系,这样后续执行git pull
或者git push
时,就不需要指定远程仓库名和远程分支名;
我们在克隆一个新的仓库到本地时,默认会将本地master和origin/master建议映射;
这里需要注意一点,所谓的远程分支(比如origin/master),指的是对远程仓库(origin)中的分支(master)的引用,它是保存在本地的,并非是远程仓库的那个真实分支(就像Java中的对象引用和对象的关系);
这些远程分支可以通过
git fetch 远程仓库名
来拉取更新,然后保存在本地,我们可以把这些远程分支想象成书签,它记录了我们上一次git fetch/pull的位置 ;我们平时所用的
git pull
,其实内部就是先通过git fetch
将远程仓库的分支拉取到本地的远程分支引用,然后再通过git merge
将其合并到本地分支;
分支跟踪的相关命令,可直接跳到末尾总结处;
目录
- 拉取远程分支到本地分支
- 修改跟踪的远程分支
- 查看跟踪的远程分支
- 解除跟踪的远程分支
- 删除跟踪的远程分支
正文
1. 拉取远程分支到本地分支
如果想在本地新建一个分支,使其指向远程仓库的某个分支,那么就可以通过
git checkout -b branch origin/branch
来实现;同理,如果想在远程创建一个远程分支,跟本地分支提交一致,则可以通过
git push origin branch
来实现;
多人协作时,如果别人往远程推送了一个新的分支jalon,那么我们就可以直接将远程分支origin/jalon拉取到本地,并在本地创建一个新的分支jalon,此时这个本地分支jalon就会跟踪拉取的远程分支origin/jalon;
这里的远程分支origin/jalon,也叫做上游分支(upstream branch);
拉取远程分支的命令如下:git checkout -b branch origin/branch
PS E:\Project\JavaProject\JavaBasicDemo> git checkout -b jalon origin/jalon
Switched to a new branch 'jalon'
Branch 'jalon' set up to track remote branch 'jalon' from 'origin'.
根据提示可以看出,本地分支jalon现在跟踪的是远程分支origin/jalon
如果提示
fatal: 'origin/jalon' is not a commit and a branch 'jalon' cannot be created from it
,那是因为远程分支没有拉取到本地,需先执行git fetch --all
拉取远程仓库的远程分支到本地即可;
这里本地分支的名字可以跟远程不一样,比如下面的例子:git checkout -b new-branch origin/branch
PS E:\Project\JavaProject\JavaBasicDemo> git checkout -b new-branch origin/jalon
Switched to a new branch 'new-branch'
Branch 'new-branch' set up to track remote branch 'jalon' from 'origin'.
优化1:如果新建的本地分支跟拉取的远程分支名字一样,那么上面的命令还可以简化,如下所示:git checkout --track origin/branch
PS E:\Project\JavaProject\JavaBasicDemo> git checkout --track origin/jalon
Switched to a new branch 'jalon'
Branch 'jalon' set up to track remote branch 'jalon' from 'origin'.
这里拉取的远程仓库可以是其他的地址,不一定都是默认的origin,比如下面的例子:
PS E:\Project\JavaProject\JavaBasicDemo> git checkout --track gitee/jalon
Switched to a new branch 'jalon'
Branch 'jalon' set up to track remote branch 'jalon' from 'gitee'.
优化2:如果拉取的远程仓库是默认的origin,且本地分支不存在和远程分支一样的分支名字,那么还可以简化,如下所示:git checkout jalon
PS E:\Project\JavaProject\JavaBasicDemo> git checkout jalon
Switched to a new branch 'jalon'
Branch 'jalon' set up to track remote branch 'jalon' from 'origin'.
2. 修改跟踪的远程分支
上面介绍的是当本地分支不存在时,直接从远程分支拉取,来新建一个本地分支进行跟踪映射;
如果本地分支已经存在,那么可以通过下面的命令进行修改跟踪的远程分支:git branch -u origin/branch
PS E:\Project\JavaProject\JavaBasicDemo> git branch -u origin/master
Branch 'jalon' set up to track remote branch 'master' from 'origin'.
这里的远程仓库名字origin和分支名branch是可以任意指定的;
3. 查看跟踪的远程分支
可以通过下面的命令来查看跟踪的远程分支:git branch -vv
PS E:\Project\JavaProject\JavaBasicDemo> git branch -vv
* jalon 70cd8fa [origin/master: ahead 1] 4-2
master 70cd8fa 4-2
这个命令不仅可以看到远程分支是哪个,还可以看到本地分支和远程分支的提交记录是否同步;
上面的[origin/master: ahead 1]
:表示远程分支是origin/master,且本地分支jalon领先远程分支origin/master一个提交,即本地有一个提交未推送到远程;
如果是behind 1,且本地分支jalon落后远程分支origin/master一个提交,即远程有一个提交未拉取到远程;
这里有两个点需要注意:
- ahead 和 behind 可以同时存在,即本地没有推送到远程的,远程也没有拉取到本地的;这个在多人协作时很常见
- 这里的ahead和behind并不是实时跟远程仓库进行比对的,而是根据上一次fetch或者pull的远程仓库数据来比对的;如果想要跟最新的远程仓库数据作比对,则需要先通过
git fetch --all
来拉取所有最新的远程仓库数据,再比对;
我们平时用的
git pull
命令就是git fetch
+git merge
的简化版;
4. 解除跟踪的远程分支
解除只是解除映射关系,不会删除远程分支;
可以通过下面的命令来解除跟踪的远程分支:git branch --unset-upstream
PS E:\Project\JavaProject\JavaBasicDemo> git branch --unset-upstream
解除后,再次查看跟踪的远程分支发现为空,说明解除成功:git branch -vv
PS E:\Project\JavaProject\JavaBasicDemo> git branch -vv
* jalon 70cd8fa 4-2
master 70cd8fa 4-2
5. 删除远程分支
删除远程分支跟删除本地很像,都是通过-d
命令,如下所示:git push origin -d branch
PS E:\Project\JavaProject\JavaBasicDemo> git push origin -d jalon
To github.com:Jalon2015/java-basic-demo.git
- [deleted] jalon
此时我们再去查看跟踪的远程分支,会发现提示为gone,如下所示:git branch -vv
PS E:\Project\JavaProject\JavaBasicDemo> git branch -vv
* jalon 70cd8fa [origin/jalon: gone] 4-2
master 70cd8fa 4-2
所以如果想要删除某个远程分支,需要先看下有没有存在映射关系,如果有,则建议先解除git branch --unset-upstream
,然后再删除;
不然删除后,再去执行git pull
,会提示找不到对应的远程分支:
PS E:\Project\JavaProject\JavaBasicDemo> git pull
Your configuration specifies to merge with the ref 'refs/heads/jalon'
from the remote, but no such ref was fetched.
总结
- 拉取远程分支到本地分支:
git checkout -b branch origin/branch
- 修改跟踪的远程分支:
git branch -u origin/branch
- 查看跟踪的远程分支:
git branch -vv
- 解除跟踪的远程分支:
git branch --unset-upstream
- 删除远程分支:
git push origin -d branch
评论区