| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发工具 -> 彻底理解git 本地分支与远程分支,以及git pull与git fetch的区别 以及git status输出的“Your branch is behind xxx” -> 正文阅读 |
|
[开发工具]彻底理解git 本地分支与远程分支,以及git pull与git fetch的区别 以及git status输出的“Your branch is behind xxx” |
git 本地分支:当clone一个远程repo之后,默认会新建一个master或main的本地分支。 比如:
可以看到本地默认只建了一个main分支,剩下的都是远程分支。 可以在远程分支基础上checkout出一个本地分支来,比如执行命令:
?这是一个本地分支develop被创建出来。 Git远程分支:就是上边输出的名字以remotes/origin/开始的分支。虽然叫远程分支,但是这些分支所对应的commits也是在我们本地的,严格来说应该叫本地的远程分支(有些别扭)。下文说的远程分支都是指这种分支,而不是指远程仓库上的分支。 同时我们也可以将远程分支checkout出来,只不过这个远程分支是只读的,也即我们处于'detached HEAD'状态。
我们想在本地修改,提交然后同步到远程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将远程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 ?
?这时,我们可以通过两种方式让该消息出现: 方式一:可以在别的分支下,比如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 status就会报告你的本地分支落后于远程分支。而是只有当远程仓库的数据同步到本地的名字以origin/开始的分支之后,git status才会比较本地与远程分支的差异。这个比较过程都是在本地完成的,不存在网络通信过程。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 1:37:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |