git fetch, git pull 以及 FETCH_HEAD


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操作之前, 我傾向於使用衍合, 在本地對代碼執行合並操作.


免責聲明!

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



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