彻底理解git 本地分支与远程分支,以及git pull与git fetch的区别, 以及git status输出的“Your branch is behind xxx”

2023-05-16

git 本地分支:

当clone一个远程repo之后,默认会新建一个master或main的本地分支。

比如:

$ git branch -a
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/develop
  remotes/origin/main

可以看到本地默认只建了一个main分支,剩下的都是远程分支。

可以在远程分支基础上checkout出一个本地分支来,比如执行命令:

$ git checkout develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'

 这是一个本地分支develop被创建出来。

Git远程分支:

就是上边输出的名字以remotes/origin/开始的分支。虽然叫远程分支,但是这些分支所对应的commits也是在我们本地的,严格来说应该叫本地的远程分支(有些别扭)。下文说的远程分支都是指这种分支,而不是指远程仓库上的分支。

同时我们也可以将远程分支checkout出来,只不过这个远程分支是只读的,也即我们处于'detached HEAD'状态。

$ git checkout remotes/origin/develop
Note: switching to 'remotes/origin/develop'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 098c616 Create file-in-develop

我们想在本地修改,提交然后同步到远程repo,必须在本地分支上工作,而不能在远程分支操作。

我们在执行git fetch操作的时候,会将远程仓库的commits,files,ref等信息下载到本地,并保存在以remotes/origin/ 开始的分支中(这样说并不准确,严格来说是让remotes/origin/ 开始的分支指向这些新的commits),底层的原理如下图:

 我们所有的commits都是类似于一个链表似的,所有分支的commits都互相连接在一起,不管是本地的分支(上图中main指向的)还是远程分支(上图中名字以Orgin/开始的分支),他们都指向这个commits链条的某个点(没错,分支名就是指针,指向某个提交)。我们执行git fetch命令时,会将远程的commits下载下来,让名字以remotes/origin开始的分支去指向他们。但是这些remote的commits,我们是没办法直接在上边工作的(修改操作),我们可以先将这些包含新的commits的远程分支checkout来,然后在此基础上新建一个分支,然后再做修改。

或者我们可以直接将这些远程分支merge到我们的本地分支,比如:

$ git fetch origin develop
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 2 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (2/2), 609 bytes | 304.00 KiB/s, done.
From https://github.com/YiyiSmile/test06087
 * branch            develop    -> FETCH_HEAD
   90b6713..311a291  develop    -> origin/develop
$ 
$ 
$ git status
On branch develop
Your branch is behind 'origin/develop' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean
$ ls
README.md	a		file-in-develop	file2		file3		hello		world
$ git merge origin/develop
Updating 90b6713..311a291
Fast-forward
 file4 | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 file4
$ ls
README.md	file-in-develop	file3		hello
a		file2		file4		world

 我们先用git fetch将远程repo上的develop分支的新的提交(file4)下载到本地的origin/develop分支上,这时本地的develop分支完全没有受影响,工作区,stage区和提交区都没有变化。然后执行merge命令,将origin/develop分支 merge到本地分支develop。

除了用merge命令,还可以简单用git pull来完成将快进(fast forward),将origin/develop里有的commits 合并到我们本地的develop分支。

git pull操作:

 git pull与git fetch的区别具体可以参考文档:

Git Fetch | Atlassian Git Tutorial

git fetch是将远程repo数据下载到本地,但对本地仓库完全没有影响。而git pull会将远程仓库数据下载到本地,并自动完成合并,更新工作区和stage区(索引区)。 

git status输出的理解:

比如我们在远程仓库develop闻分支新建一个文件file5,然后执行命令git status,发现并没有提示消息:Your branch is behind 'origin/develop' by 1 commit

 

$ git status
On branch develop
Your branch is up to date with 'origin/develop'.

nothing to commit, working tree clean
$ ls
README.md	file-in-develop	file3		hello
a		file2		file4		world

 这时,我们可以通过两种方式让该消息出现:

方式一:可以在别的分支下,比如main分支下,执行git pull,后边不带任何参数。这时除了远程仓库的main分支数据会被下载下来,其他所有分支的数据会被拉下来,但是只有当前所在的本地分支main会自动与远程同步,完成merge、工作区、stage区的同步。而其他分支,比如这里的develop分支,他们并不会同步。但是对应的远程分支(orgin/develop)却完成了同步。

方式二:执行git fetch命令。

当orgin/develop指向了从远程下载下来的新的提交,而本地的develop还是指向老的提交,这时运行git status命令时,就会看到“Your branch is behind 'origin/develop' by 1 commit”消息。

$ git fetch
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 646 bytes | 323.00 KiB/s, done.
From https://github.com/YiyiSmile/test06087
   311a291..634ba9e  develop    -> origin/develop
$ git status
On branch develop
Your branch is behind 'origin/develop' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean

 总结:

 也就是说并不是只要远程仓库有更新了,git status就会报告你的本地分支落后于远程分支。而是只有当远程仓库的数据同步到本地的名字以origin/开始的分支之后,git status才会比较本地与远程分支的差异。这个比较过程都是在本地完成的,不存在网络通信过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

彻底理解git 本地分支与远程分支,以及git pull与git fetch的区别, 以及git status输出的“Your branch is behind xxx” 的相关文章

随机推荐

  • pixhawk硬件设计粗略解析

    文章目录 前言一 pixhawk是什么 xff1f 二 pixhawk硬件解析总结 前言 本片是个人对NFCYv5飞控的硬件设计的个人分析与笔记 为什么要这么做呢 xff1f 原因很简单 xff0c 一是对pixhawk硬件组成有更加深入的
  • Android IPC机制

    本文首发于个人博客 胖蔡叨叨叨 xff0c 更多相关信息可点击查看 Android IPC机制 IPC IPC Inter Process Communication 进程间通信 xff0c 是指系统中运行的不同进程间的信息交互过程 And
  • PX4的控制与输出

    文章目录 前言控制器部分输出部分控制组混控器混控器的启动信号输出 前言 这篇记录一下自己分析PX4从位置控制 gt 速度控制 gt 姿态控制 gt 角速度控制 gt 电机输出的源码框架的阅读与理解 xff0c 便于之后自己修改控制器 在这个
  • 悬停油门的参数估计方法

    悬停油门的参数估计方法 估计悬停油门 xff0c 实际上就是完成油门值与飞机加速度之间的映射关系 xff0c 准确的估计值可以让飞行控制更为准确 在PX4中 xff0c 对悬停油门的估计方法采用的是扩展卡尔曼滤波 xff0c Fast dr
  • D435/D435i使用技巧

    D435 D435i使用技巧 D435 D435i是目前市场上使用最为方便的双目深度相机 虽然淘宝上其价格有些让人望而却步 xff0c 但是咸鱼上成色不错的D435 D435i 价格就在1000左右 xff0c 依旧是自主无人机视觉定位和感
  • PX4 imu传感器配置

    PX4 传感器配置 坐标系定义 旋转变化 reference 在机器人中各个坐标系之间的变换是非常常见的 xff0c 而在ROS tf 工具中 xff0c 以及Eigen 中 我们常常会见到RPY的旋转表示和四元数的旋转表示 当然学航空出生
  • PX4常用sh命令

    PX4常用sh命令 基于NUTTXnsehll的设计 xff0c PX4还自定义了一些sh命令 xff0c 可以在调试飞控时起到重要作用 这些命令在PX4开发者手册中 xff0c 都有提到 但是为了方便后期使用 xff0c 这里再单独做一下
  • 强化学习介绍(RL)

    一 简介 机器学习有三大分支 xff0c 监督学习 无监督学习和强化学习 xff0c 强化学习是系统从环境学习以使得奖励最大的机器学习 人工智能中称之为强化学习 xff0c 在控制论中被称之为动态规划 xff0c 两者在概念上是等价的 也被
  • 深度学习中高斯噪声:为什么以及如何使用

    来源 xff1a DeepHub IMBA 本文约1800字 xff0c 建议阅读8分钟 高斯噪声是深度学习中用于为输入数据或权重添加随机性的一种技术 在数学上 xff0c 高斯噪声是一种通过向输入数据添加均值为零和标准差 的正态分布随机值
  • 面向算法选择的元学习研究综述

    来源 xff1a 专知 本文为综述介绍 xff0c 建议阅读5分钟本文对基于元学习的算法选择进行综述总结 xff0c 为研究人员了解相关领域的发展现状提供参考 摘要 xff1a 随着人工智能的快速发展 xff0c 从可行的算法中选择满足应用
  • tortoise git 冲突解决

    1 背景 使用tortoise git 解决conflict 2 解释 Git进行同步的时候 xff0c 经常会出现冲突 xff0c 有时候冲突的选项会有三种选项 xff1a 1 Resolved xff1a 直接把文件标识为冲突已经解决
  • win11旗舰版安装WSL子系统和环境-7搭建图形化界面和Docker容器

    搭建图形化界面和Docker容器 Win10Linux子系统 xff08 WSL xff09 图形界面的安装 https blog csdn net NovaSliver article details 83190269 utm mediu
  • 推荐几款Nodejs实现的web框架

    本文首发于个人博客 胖蔡叨叨叨 xff0c 点击可查看原文 Nodejs在近些年可以说是发展异常的迅猛 xff0c 由于同样使用的js原因 xff0c 对于前端开发人员可以说是非常的友善了 xff0c Github上有关nodejs的贡献也
  • chatgpt_academic学术优化(配置使用教学-保姆级)

    一 Anaconda 下载及安装 1 官网下载链接 xff1a www anaconda com 2 安装 xff08 1 xff09 下载完成后 xff0c 双击exe进行安装 xff08 2 xff09 安装完成后 xff0c 点击An
  • C++正则表达式regex_match,regex_search和regex_replace简单使用

    C 43 43 正则表达式 零 前言一 说明二 测试代码三 运行结果 零 前言 正则表达式是非常强大的文本处理和字符串处理工具 xff0c C 43 43 11之前一直没有引入正则表达式 xff0c 只能使用boost库中的 xff0c C
  • debian桌面启动不了的问题

    怎么发生的 xff1f 昨天安装了一堆的软件后 xff0c 发现桌面没法在桌面进行应用程序切换 xff0c 然后就重启了一下系统 xff0c 想恢复 xff0c 结果 xff0c 重启后 xff0c 开机就直接进shell了 分析 做了一些
  • Byobu 命令行终端的强大利器

    My heart is in the work xff01 工作以来接触到Linux系统的地方挺多 xff0c Android的源码下载 xff0c 服务器的连接等等 xff0c 用的越多越发现Linux的强大与方便 一次偶然间 xff0c
  • .NET下基于API封装的DirectUIHWND窗体访问

    直接切入正题 1 添加引用 项目 gt 添加引用 gt C Progmme 1 MSN Messenger msnmsgr exe 2 using MessengerAPI 声明 private MessengerAPI Messenger
  • 漫话Kubernetes的网络架构,该用NodePort还是Ingress还是load balancer?

    目录 一 基本概念 1 Kubernetes pod 2 Kubernetes service 3 Kubernetes NodePort 4 Kubernets Ingress 5 Kubernetes loadbalancer 二 从实
  • 彻底理解git 本地分支与远程分支,以及git pull与git fetch的区别, 以及git status输出的“Your branch is behind xxx”

    git 本地分支 xff1a 当clone一个远程repo之后 xff0c 默认会新建一个master或main的本地分支 比如 xff1a git branch a main remotes origin HEAD gt origin m