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