1、簡單概括
先用一張圖來理一下
git fetch
和
git pull
的概念:

可以簡單的概括為:
git fetch
是将遠端主機的最新内容拉到本地,使用者在檢查了以後決定是否合并到工作本機分支中。
而
git pull
則是将遠端主機的最新内容拉下來後直接合并,即:
git pull = git fetch + git merge
,這樣可能會産生沖突,需要手動解決。
下面我們來詳細了解一下
git fetch
和
git pull
的用法。
2、分支的概念
在介紹兩種方法之前,我們需要先了解一下分支的概念:
分支是用來标記特定代碼的送出,每一個分支通過SHA1sum值來辨別,是以對分支的操作是輕量級的,你改變的僅僅是SHA1sum值。
如下圖所示,目前有2個分支,A,C,E屬于master分支,而A,B,D,F屬于dev分支。
A----C----E(master)
\
B---D---F(dev)
它們的head指針分别指向E和F,對上述做如下操作:
git checkout master //選擇or切換到master分支
git merge dev //将dev分支合并到目前分支(master)中
合并完成後:
A---C---E---G(master)
\ /
B---D---F(dev)
現在ABCDEFG屬于master,G是一次合并後的結果,是将E和F的代碼合并後的結果,可能會出現沖突。而ABDF依然屬于dev分支。可以繼續在dev的分支上進行開發:
A---C---E---G---H(master)
\ /
B---D---F---I(dev)
分支(branch)的基本操作:
git branch //檢視本地所有分支
git branch -r //檢視遠端所有分支
git branch -a //檢視本地和遠端的所有分支
git branch <branchname> //建立分支
git branch -d <branchname> //删除本地分支
git branch -d -r <branchname> //删除遠端分支,删除後還需推送到伺服器
git push origin:<branchname> //删除後推送至伺服器 git push origin --delete <branchname> //删除遠端分支
要想建立一個遠端分支,不需要特殊指令,直接push到想設定的branch即可
git push origin <newbranchname>
git branch -m <oldbranch> <newbranch> //重命名本地分支
/**
*重命名遠端分支:
*1、删除遠端待修改分支
*2、push本地新分支到遠端伺服器
*/
//git中一些選項解釋:
-d
--delete:删除
-D
--delete --force的快捷鍵
-f
--force:強制
-m
--move:移動或重命名
-M
--move --force的快捷鍵
-r
--remote:遠端
-a
--all:所有
3、git fetch 用法
git fetch 指令:
$ git fetch <遠端主機名> //這個指令将某個遠端主機的更新全部取回本地
如果隻想取回特定分支的更新,可以指定分支名:
$ git fetch <遠端主機名> <分支名> //注意之間有空格
最常見的指令如取回
origin
主機的
master
分支:
$ git fetch origin master
取回更新後,會傳回一個
FETCH_HEAD
,指的是某個branch在伺服器上的最新狀态,我們可以在本地通過它檢視剛取回的更新資訊:
$ git log -p FETCH_HEAD
如圖:
可以看到傳回的資訊包括更新的檔案名,更新的作者和時間,以及更新的代碼(19行紅色[删除]和綠色[新增]部分)。
我們可以通過這些資訊來判斷是否産生沖突,以确定是否将更新merge到目前分支。
4、git pull 用法
前面提到,
git pull
的過程可以了解為:
git fetch origin master //從遠端主機的master分支拉取最新内容
git merge FETCH_HEAD //将拉取下來的最新内容合并到目前所在的分支中
- 1
- 2
即将遠端主機的某個分支的更新取回,并與本地指定的分支合并,完整格式可表示為:
$ git pull <遠端主機名> <遠端分支名>:<本地分支名>
- 1
如果遠端分支是與目前分支合并,則冒号後面的部分可以省略:
$ git pull origin next
- 1
5、參考文章
阮一峰老師部落格: Git遠端操作詳解
簡書: git中fetch和pull的差別
CSDN: git branch用法總結,檢視、建立、删除、重命名
部落格園: Git中pull對比fetch和merge