在.git目录中会有一个名为FETCH_HEAD的文件;
每一个执行过fetch操作的项目都会存在一个FETCH_HEAD列表,其中每一行对应于远程服务器的一个分支。
也就是说这个文件保存了远程仓库中每个分支的FETCH_HEAD。这个FETCH_HEAD指向了该分支最近的一次commit;
其实跟HEAD是一回事,只是这个HEAD是指向的远程仓库某个分支的最新的一个commit;
这样我们就知道了执行git fetch的本质就是更新远程仓库分支的commit记录,并且更新FETCH_HEAD,保证其指向该分支最近的一次commit;
git fetch origin branch1 //如果指定了某个远程分支,那就更新这个分支的commit记录及FETCH_HEAD;
//如果不加分支名的话,更新该仓库的所有分支的commit记录以及FETCH_HEAD;
====================================================================
顺便说一下HEAD的概念:
HEAD实际上就是一个指向某个commit的引用;表示的是你当前指向的记录;
默认情况下HEAD指向的是这个分支名,分支名永远指向该分支的最近一次commit;
也就是说默认情况下HEAD指向分支的最近一次提交;
HEAD -> master -> C1
当你进行一次新的commit时,HEAD就会从此前指向的commit往后产生该新的commit,并指向该新的commit;
这里引入一个新的概念DETACHED_HEAD,即分离的HEAD:
分离的HEAD指向的是一个commit,而不是指向分支名;
Git学习系列15 HEAD ORIG_HEAD FETCH_HEAD detached HEAD:https://blog.csdn.net/luoshabugui/article/details/85256509 //这几个head讲解得很好
HEAD、master 与 branch: //对于HEAD和分支的解释很详细:https://www.jianshu.com/p/4219b6f62ce3
git fetch、git pull和FETCH_HEAD:https://www.cnblogs.com/Venom/p/5477367.html
======================================================================
git merge :
假设你当前所处的分支是master分支;
输入 git merge branch1 //表示的是将branch1合并进当前的master分支。实际上就是把branch1的记录加到master分支上了;是的这个master吸收了branch1分支的commit;
不过要注意的是此时对于branch1可没有什么影响,branch1没有任何改变,改变的是当前分支master;
merge的话就有可能产生merge冲突;
merge冲突后续将会结合一些场景进行分析,这样理解更加深刻;当然这里讲得内容理解后,再去分析merge冲突就好理解得多了,同时也知道如何去解决merge冲突;
https://www.cnblogs.com/grooovvve/p/12897770.html
======================================================================
git pull:
git pull 的作用是拉取远程仓库的更新到本地;而且很多情况下如果远程和你本地修改了同一行内容,这就会导致pull失败,一般会提示merge冲突;
如果git pull 有指定某个远程分支的话,表示拉取远程分支的更新到本地;
例如:git pull origin master
git pull origin master实际上是分成两个部分:
git fetch origin master
git merge FETCH_HEAD
在理解了上面的介绍,实际上我们也就理解了git pull的本质就是先更新远程分支的commit记录,并更新FETCH_HEAD;
然后再将远程分支merge到当前分支上(就是*所指的分支);
所以一般来说建议不用git pull,而是采用两步走,养成好习惯先fetch,更新远程分支的commit记录
然后可以使用
git log origin/master //查看远程的提交记录,fetch的一大好处就是不改变本地仓库,就可以查看远程的修改情况;
git diff 命令 查看差异,具体怎么使用留到专门的讲git diff的文章中来讨论;反正通过git diff可以查看差异,提前发现有没有可能存在merge冲突;
检查无误了之后再输入 git merge FETCH_HEAD,就可以把远程分支合并进当前分支;
相比起来,git fetch更安全也更符合实际要求,因为可以在merge前,可以查看更新情况,根据实际情况再决定是否合并。
fetch+merge与pull效果一样。但是要多用fetch+merge,这样可以检查fetch下来的更新是否合适。
pull直接包含了这两步操作,如果你觉得网上的更新没有问题,那直接pull也是可以的。
========================================================================