git图形化工具GitKraken的使用——创建远程分支与建立追踪关系
先前的操作都基于本地存储库和本地分叉进行;下一步将介绍一些相关内容。
远程仓库
# 增加一个新的远程仓库,并命名
git remote add <remote-name> <url>
# 下载远程仓库的所有变动
git fetch <remote-name>
# 显示所有远程仓库
git remote -v
# 显示某个远程仓库的信息
git remote show <remote-name>
创建远程分支
# 列出所有远程分支
git branch -r
# 列出所有本地分支和远程分支
git branch -a
# 列出所有本地分支
git branch
在一篇关于Git图形化工具的博客文章中提到:我们在初始化项目时曾讨论过创建远程分支的技术。本文将深入探讨如何创建分支并建立相应的追踪关系。
情景一:远端并不存在develop分支(这里假设用develop模拟)
也就是第一次创建的分支,我们可以,在本地创建分支,然后push到远端:
# 创建分支并切换
$ git checkout -b develop
Switched to a new branch 'develop'
# 推送到远端,会在远端创建同名的分支,-u参数会创建追踪关系
$ git push -u origin develop
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/wuchongzi/gitFlowTset.git
* [new branch] develop -> develop
Branch develop set up to track remote branch develop from origin.
情景二:在远程端已经有一个名为‘develop’的分支存在,在本地创建一个与之相同的分支,并与其建立追踪关系。
这种情况下假设你依次经历了第一阶段和第二阶段的情景。随后更换了另一台计算机后发现无法继续操作。或者另一名队友也进行了远程仓库复制操作发现该功能仅适用于master主分支的复制。然而在远程服务器上已经有了对应版本的开发分支存在的情况下另一位队友希望在其开发分支上进行操作则会遇到冲突的问题
现在在情景二下还得分两种情况:
1、假如另一小伙伴是第一次clone项目
# 克隆
git clone <url>
clone完成之后查看下远程的仓库信息:
$ git remote show origin
Enter passphrase for key '/c/Users/lenovo/.ssh/id_rsa':
* remote origin
Fetch URL: git@github.com:wuchongzi/test.git
Push URL: git@github.com:wuchongzi/test.git
HEAD branch: master
Remote branches:
develop tracked
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
该开发者在被跟踪后主动发起创建本地开发分支,并完成相关关联设置。
# 创建切换本地分支并与远端分支建立追踪关系(或者叫检出远程分支)
git checkout -b develop origin/develop
# 或者使用下面的命令,两个是一样的道理
git checkout --track origin/develop # --track可以简写为-t
如果其他同学在他创建 develop 分支之前下载了源代码到自己的电脑
如果其他同学在他创建 develop 分支之前下载了源代码到自己的电脑
这时候如果他执行 git checkout -b develop origin/develop,就会失败:
$ git checkout -b develop origin/develop
fatal: Cannot update paths and switch to branch 'develop' at the same time.
Did you intend to checkout 'origin/develop' which can not be resolved as commit?
为什么会失败呢?远程已经拥有了一个develop分支。此时他检查远程的分支情况。
$ git branch -r
origin/HEAD -> origin/master
origin/master
然而并没有看到远程的develop分支,然后他查看了远程仓库信息:
$ git remote show origin
Enter passphrase for key '/c/Users/lenovo/.ssh/id_rsa':
* remote origin
Fetch URL: git@github.com:wuchongzi/test.git
Push URL: git@github.com:wuchongzi/test.git
HEAD branch: master
Remote branches:
develop new (next fetch will store in remotes/origin)
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
他意识到此处的 'develop' 并未被 'tracked' ,显示出的结果是 'new'" 。另外一句代码如下:next fetch will store in remotes/origin 。这表明 'develop' 并未被 'tracked' 。由于 Git 在每次操作时并不总是从远程源获取最新的仓库状态 ,因此我们需要在项目初期就进行必要的手动同步操作:
$ git remote update
Fetching origin
Enter passphrase for key '/c/Users/lenovo/.ssh/id_rsa':
From github.com:wuchongzi/test
* [new branch] develop -> origin/develop
然后执行 git fetch 无任何输出(成功),现在再来看一下远程仓库信息:
$ git remote show origin
Enter passphrase for key '/c/Users/lenovo/.ssh/id_rsa':
* remote origin
Fetch URL: git@github.com:wuchongzi/test.git
Push URL: git@github.com:wuchongzi/test.git
HEAD branch: master
Remote branches:
develop tracked
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
OK, 目前both 'develop'和'master'都已 been marked as synced, 下一步请运行以下命令: $ git checkout -b develop origin/developer, 然后操作完成.
$ git checkout -b develop origin/develop
Switched to a new branch 'develop'
Branch develop set up to track remote branch develop from origin. # 这句话的意思就是本地的develop分支已经与远端的develop分支建立了追踪关系
在GitKraken上也可以手动更新远端仓库信息:

追踪关系
前面一直提到的建立追踪关系中涉及两个关键术语称为远程主干分支与本地主干分支起初对于这两个术语的实际意义并不清楚后来通过反复阅读这篇技术文章后才逐渐掌握了它们的本质现在我想简单阐述一下我对这些概念的理解由于经验不足可能存在误述之处恳请大家批评指正
首先是远程分支
远程仓库类似于另一台独立运行的计算机的操作系统环境,在此环境中新增的一个分支即为远程分支(remote branch)。这种设计使得可以在不同服务器之间灵活地建立代码协作关系。
官方的话是这样的:
远程引用是对远程仓库的引用(指针),包括分支、标签等等。
通过 git ls remote <remote-name> 可以显示地获取远程引用的完整列表:
$ git ls-remote origin
0f510950ffb8413ae7deada90745c707854364aa HEAD
0f510950ffb8413ae7deada90745c707854364aa refs/heads/master
之前已经介绍过,在GitHub上使用git remote show <remote-name>可以帮助您了解远程分支的相关信息。
$ git remote show origin
* remote origin
Fetch URL: https://github.com/wuchongzi/test2.git
Push URL: https://github.com/wuchongzi/test2.git
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
远程跟踪分支
远程分支引用(remote/branch)是一种用于引用远程分支状态的机制。它们是你无法移动的本地引用,在进行任何网络通信操作时会自动发生移动。远程分支引用类似于你在上一次连接到远程仓库时(pull、push等操作),那些分支所处状态的书签。
具体来说,在我们进行远程克隆操作时
从而为后续操作提供了基础
通过运行git remote show origin命令可以看出,在远程仓库中设置的主分支名称为'master'与'origin/master'之间存在差异
在上面情景二的两种情况,就是有无远程跟踪分支的区别:
情况一是远程已经存在一个origin/master及origin/develop的跟踪分支,在进行克隆操作时,在克隆时git会自动从远程源库获取完整的项目数据,并在此基础上生成新的本地主分支与开发分支。具体而言,在克隆操作中,默认会创建指向远程主分支origin/master和开发分支origin/develop的新本地分支。因此,在这种情况下可以直接通过执行命令:
即可通过执行命令 git checkout -b develop origin/develop 来切换到当前开发版本。
情况二是首先通过克隆获取仓库后又开发出一个远程分支在此时本地系统并未具备该远程跟踪分支的信息因此必须与远程服务器建立通信同步从而实现对本地 origin/ develop 远程跟踪分支的创建以便完成后续操作
跟踪分支又是什么
在版本控制系统中,术语"tracking branch"具有特定含义。具体而言,在从一个"remote tracking branch"检测到本地的一个"branch"时,则这个本地支就是所谓的"tracking branch"。对应地,在这种情况下被检测到的"remote tracking branch"则被称为"upstream branch"。进一步而言,在这种情形下,"tracking branches"与之相关的都是那些直接关联于其源远流长的那个版本库中的相应节点。
在进行仓库复制操作时,系统会自动创建一个主分支,并将其同步到指定的origin/master位置。
在场景二中使用的命令 git checkout -b develop origin/develop 是用于检测出一个跟踪分支的。
设置已有的本地分支跟踪一个刚刚拉取下来的远程分支
将现有本地分支设为一个最近刚刚从远程仓库拉取下来的分支(Branch),或者希望更改当前被跟踪的上游主干(Main Trunk),你可以在任意时间使用 -u 或 --set-upstream-to(请注意,在新版Git中已将–set-upstream改为–set-upstream-to而弃用)选项运行 git branch 来显式地设置:
# 首先要checkout到要修改的分支上,然后执行
$ git branch -u origin/feature
# 等价于:
$ git branch --set-upstream-to=origin/feature
# 或者不用切换,可以执行
$ git branch -u origin/feature feature
# 等价于:
$ git branch --set-upstream-to=origin/feature feature
可以使用 git branch 的 -vv 选项来查看设置的所有跟踪分支:
$ git branch -vv
* develop e0e8353 [origin/develop] Initial commit
feature1 e0e8353 [origin/feature1] Initial commit
feature2 e0e8353 [origin/feature2] Initial commit
feature3 e0e8353 [origin/feature3] Initial commit
master e0e8353 [origin/master] Initial commit
