侧边栏壁纸
  • 累计撰写 94 篇文章
  • 累计创建 100 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录
Git

Git分支跟踪-建立映射关系

汤圆学Java
2022-07-30 / 0 评论 / 3 点赞 / 291 阅读 / 4,037 字
温馨提示:
本文最后更新于 2022-09-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

分支跟踪指的是本地分支跟踪远程分支,即两者建立一个映射关系,这样后续执行git pull或者git push时,就不需要指定远程仓库名和远程分支名;

我们在克隆一个新的仓库到本地时,默认会将本地master和origin/master建议映射;

这里需要注意一点,所谓的远程分支(比如origin/master),指的是对远程仓库(origin)中的分支(master)的引用,它是保存在本地的,并非是远程仓库的那个真实分支(就像Java中的对象引用和对象的关系);

这些远程分支可以通过git fetch 远程仓库名 来拉取更新,然后保存在本地,我们可以把这些远程分支想象成书签,它记录了我们上一次git fetch/pull的位置 ;

我们平时所用的git pull ,其实内部就是先通过git fetch将远程仓库的分支拉取到本地的远程分支引用,然后再通过git merge将其合并到本地分支;

分支跟踪的相关命令,可直接跳到末尾总结处;

目录

  1. 拉取远程分支到本地分支
  2. 修改跟踪的远程分支
  3. 查看跟踪的远程分支
  4. 解除跟踪的远程分支
  5. 删除跟踪的远程分支

正文

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
3

评论区