在.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也是可以的。
========================================================================