1、用途:git fetch&git merge git pull這兩條語句的作用是從遠程倉庫同步文件到本地;
2、區別:
首先假設我們本地倉庫的 master 分支上 commit ID =1 ,orign/mastter中的commit ID =1 ;這時候遠程倉庫有人更新了github ogirn庫中master分支上的代碼,新的代碼版本號commit ID =2 ,那么在github上 orign/master的commitID=2,然后我們要更新代碼。
1. git fetch
- 使用git fetch更新代碼,本地的庫中master的commitID不變,還是等於1。但是與git上面關聯的那個orign/master的commit ID變成了2。這時候我們本地相當於存儲了兩個代碼的版本號,我們還要通過merge去合並這兩個不同的代碼版本,如果這兩個版本都修改了同一處的代碼,這時候merge就會出現沖突,然后我們解決沖突之后就生成了一個新的代碼版本。
- 這時候本地的代碼版本可能就變成了commit ID=3,即生成了一個新的代碼版本。
相當於fetch的時候本地的master沒有變化,但是與遠程倉關聯的那個版本號被更新了,我們接下來就是在本地合並這兩個版本號的代碼。
2. git pull
- 是用git pull更新代碼的話就比較簡單暴力了,看下圖。
使用git pull的會將本地的代碼更新至遠程倉庫里面最新的代碼版本。
總結:
不要用git pull,用git fetch和git merge代替它。
git pull的問題是它把過程的細節都隱藏了起來,以至於你不用去了解git中各種類型分支的區別和使用方法。當然,多數時候這是沒問題的,但一旦代碼有問題,你很難找到出錯的地方。看起來git pull的用法會使你吃驚,簡單看一下git的使用文檔應該就能說服你。
將下載(fetch)和合並(merge)放到一個命令里的另外一個弊端是,你的本地工作目錄在未經確認的情況下就會被遠程分支更新。當然,除非你關閉所有的安全選項,否則git pull在你本地工作目錄還不至於造成不可挽回的損失,但很多時候我們寧願做的慢一些,也不願意返工重來 。
3、實例:
(1) git pull
git pull <遠程主機名> <遠程分支名>:<本地分支名> //取回遠程主機某個分支的更新,再與本地的指定分支合並。
(2) git fetch & git merge
git fetch origin master:tmp //在本地新建一個temp分支,並將遠程origin倉庫的master分支代碼下載到本地temp分支 git diff tmp //來比較本地代碼與剛剛從遠程下載下來的代碼的區別 git merge tmp //合並temp分支到本地的master分支 git branch -d temp //如果不想保留temp分支 可以用這步刪除
如果直接使用git fetch,則步驟如下:
1.創建並更新本 地遠程分支。即創建並更新origin/xxx 分支,拉取代碼到origin/xxx分支上。
2.在FETCH_HEAD中設定當前分支-origin/當前分支對應,如直接到時候git merge就可以將origin/abc合並到abc分支上。
git fetch origin
只是手動指定了要fetch的remote。在不指定分支時通常默認為master
git fetch origin dev
指定遠程remote和FETCH_HEAD,並且只拉取該分支的提交。