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