Git命令_git fetch、git merge、git pull、FETCH_HEAD、HEAD


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

========================================================================

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM