git fetch, git pull 以及 FETCH_HEAD

git FETCH_HEAD 是什麼? 

 

自己測試

打開本地文件:

 

 

切換本地分支之後, 然後執行 git pull,本地的FETCH_HEAD 發送改變:

 

 

 

注意需要執行 git pull, FETCH_HEAD 纔會發送變化。 否則不變。 第一行是 當前分支的真正的 FETCHHEAD, 其中of 後面的是 遠程的倉庫地址。

 

not-for-merge 是什麼? not-for-merge 表明了 默認情況下 git merge不會 對其分支自動進行 merge, 如果有需要, 必須手動知道分支。

 

 

 

參考 https://stackoverflow.com/questions/18262670/egit-not-for-merge

 

git FETCH_HEAD 是什麼?  可見, 他就是一個 默認的 fetch 或說 merge  的指針, 同時包括了其他的 非默認的分支。

 

 轉載 

 下面是轉載 https://www.cnblogs.com/Venom/p/5477367.html  +++++++++

git push.


這個很簡單, 其實和後面的差不多, 這裏就不講了.

唯一需要注意的地方是:

git push origin :branch2, 表示將一個內容爲空的同名分支推送到遠程的分支.(說白了, 即刪除遠程主機的branch2分支), 但是這並不會消除之前的comment內容, 而且你一旦提交了一些大的文件(例如: 圖片之類的), 通過這個操作, 是不會將這些文件佔用的空間消除的. 如果要真正的刪除一個文件, 除了刪除整個項目, Github網站也有提供辦法, 不過還沒看懂.

git fetch, 理解fetch的含義, 是遠程協作的關鍵.


而理解 fetch 的關鍵, 是理解 FETCH_HEAD.

這裏需要解釋下什麼是FETCH_HEAD??

FETCH_HEAD指的是: 某個branch在服務器上的最新狀態'.
每一個
執行過fetch操作的項目'都會存在一個FETCH_HEAD列表, 
這個列表保存在 .git/FETCH_HEAD 文件中, 其中每一行對應於遠程服務器的一個分支.
當前分支指向的FETCH_HEAD, 就是這個文件第一行對應的那個分支.

一般來說, 存在兩種情況:

  • 如果沒有顯式的指定遠程分支, 則遠程分支的master將作爲默認的FETCH_HEAD.

  • 如果指定了遠程分支, 就將這個遠程分支作爲FETCH_HEAD.

常見的git fetch 使用方式包含以下四種:

  • git fetch

這一步其實是執行了兩個關鍵操作:
創建並更新所有遠程分支的本地遠程分支.
- 設定當前分支的FETCH_HEAD遠程服務器的master分支 (上面說的第一種情況)

需要注意的是: 和push不同, fetch會自動獲取遠程`新加入'的分支.

  • git fetch origin

同上, 只不過手動指定了remote.

  • git fetch origin branch1

設定當前分支的 FETCH_HEAD' 爲遠程服務器的branch1分支`.

注意: 在這種情況下, 不會在本地創建本地遠程分支, 這是因爲:

這個操作是git pull origin branch1的第一步, 而對應的pull操作,並不會在本地創建新的branch.

一個附加效果是:

這個命令可以用來測試遠程主機的遠程分支branch1是否存在, 如果存在, 返回0, 如果不存在, 返回128, 拋出一個異常.

  • git fetch origin branch1:branch2

只要明白了上面的含義, 這個就很簡單了,

  • 首先執行上面的fetch操作
  • 使用遠程branch1分支在本地創建branch2(但不會切換到該分支), 
    如果本地不存在branch2分支, 則會自動創建一個新的branch2分支, 
    如果本地存在branch2分支, 並且是`fast forward', 則自動合併兩個分支, 否則, 會阻止以上操作.

  • git fetch origin :branch2

等價於: git fetch origin master:branch2

git pull


只要理解了git fetch, git pull就太簡單了.

git pull 等價於以下兩步:

  • 經命令中的pull換成fetch, 執行之...
  • git merge FETCH_HEAD

唯一需要提及的一點是:

我認爲pull操作, 不應該涉及三方合併 或 衍合 操作 換個說法: pull 應該總是 fast forward 的. 爲了達到這樣一個效果, 在真正push操作之前, 我傾向於使用衍合, 在本地對代碼執行合併操作.

 

https://www.cnblogs.com/Venom/p/5477367.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章