Git中pull對比fetch和merge

2022-08-27 07:24:09 字數 2703 閱讀 8432

使用git fetch和git pull都可以更新遠端倉庫的**到本地,但是它們之間還是有區別。今天搜了一下git pull和fetch,發現資訊量很大,牽扯到git中很多概念,以我這種智商估計要完全理解很困難,所以先宣告一下,下面的內容是我綜合了網上的資料後,自己的理解,如有誤導,敬請諒解。

首先,我搜尋了git pull和git fetch的區別,網上的帖子很多,我主要參考了這個帖子,我摘抄下主要內容。

git fetch origin master

git log -p master..origin/master

git merge origin/master

從遠端的origin倉庫的master主分支更新最新的版本到origin/master分支上

比較本地的master分支和origin/master分支的差別

合併內容到本地master分支

另外一種fetch使用方式參考我之前的文章git更新遠端倉庫**到本地。

git pull origin master
相當於git fetch 和 git merge,即更新遠端倉庫的**到本地倉庫,然後將內容合併到當前分支。

所以,簡單的說git pull相當於git fetch後再做乙個git merge。那麼它們具體的區別如何分析呢,這就需要我們再認識下git了,先看看下面這張圖:

我們知道,git其實有好幾個區,工作區(workspace)、暫存區(index)、本地倉庫(local repository),當然還有遠端倉庫(remote repository)。遠端倉庫為我們儲存乙份**拷貝,如github,而工作區、暫存區和本地倉庫都在本地,這就是為什麼沒有網路我們也照樣使用git提交(commit)**更新,因為提交僅是提交到本地倉庫,待有網路之後可以再推送(push)到遠端倉庫。

正如上圖所示,git fetch是將遠端倉庫的更新獲取到本地倉庫,不影響其他區域。而git pull則是一次性將遠端倉庫的**更新到工作區(同時也會更新本地倉庫)。

通常來說,git fetch和merge與git pull的區別已經很明顯了,但是如果想再了解下git是如何操作的,則需要我們了解下分支這個git的強大特性(分支的概念確實太牛逼了,我不確定我的理解是否是正確的)。

分支(branches)是用來標記特定的**提交,每乙個分支通過sha1sum值來標識,所以對分支進行的操作是輕量級的——你改變的僅僅是sha1sum值。所以為什麼git提倡大家多使用分支,因為它即輕量級又靈活。簡單的說,分支有兩種:

本地分支(local branches)」 ,當你輸入「git branch」時顯示的:

$ git branch

* master

遠端分支(remote branches)」 ,當你輸入「git branch -r」是顯示的:

$ git branch -r

origin/master

如果你對分支在本地是如何儲存感興趣的話,看看專案中的下面檔案,檔案裡面存的就是乙個sha1sum值:

我們來看看遠端分支,pro git這本書描述的非常好。遠端分支(remote branch)是對遠端倉庫中的分支的索引。它們是一些無法移動的本地分支;只有在 git 進行網路互動時才會更新。遠端分支就像是書籤,提醒著你上次連線遠端倉庫時上面各分支的位置。

我們用 (遠端倉庫名)/(分支名) 這樣的形式表示遠端分支。比如我們想看看上次同 origin 倉庫通訊時 master 分支的樣子,就應該檢視 origin/master 分支。如果你和同伴一起修復某個問題,但他們先推送了乙個 iss53 分支到遠端倉庫,雖然你可能也有乙個本地的 iss53 分支,但指向伺服器上最新更新的卻應該是 origin/iss53 分支。

這樣,我們在本地倉庫的本地分支和遠端分支都有了,並且起始於同一位置。

如果你在本地 master 分支做了些改動(在本地工作區commit了**到本地倉庫),與此同時,其他人向 git.ourcompany.com 推送了他們的更新,那麼伺服器上的 master 分支就會向前推進,而與此同時,你在本地的提交歷史正朝向不同方向發展。不過只要你不和伺服器通訊,你的 origin/master 指標仍然保持原位不會移動:

注意這裡的本地分支已經前移,而遠端分支還保持不動,而遠端倉庫的master其實也已經前移,所以可以說本地的遠端分支origin/master是過時的。

可以執行 git fetch origin 來同步遠端伺服器上的資料到本地。該命令首先找到 origin 是哪個伺服器(本例為 git.ourcompany.com),從上面獲取你尚未擁有的資料,更新你本地的資料庫(倉庫),然後把 origin/master 的指標移到它最新的位置上:

現在大家能看到git fetch的作用了嗎?

接下來還沒完,我們來看看git的高階玩兒法。為了演示擁有多個遠端分支(在不同的遠端伺服器上)的專案是如何工作的,我們假設你還有另乙個僅供你的敏捷開發小組使用的內部伺服器 git.team1.ourcompany.com。可以用第二章中提到的 git remote add 命令把它加為當前專案的遠端分支之一。我們把它命名為 teamone,以便代替完整的 git url 以方便使用:

注意這裡是多個遠端分支,不同的遠端伺服器。

由此你在本地就有了兩個遠端分支,作為指向兩個遠端伺服器上 master 分支的索引。

好了,不扯遠了,總結下git fetch和git pull:

國外友人提供的pdf文件:git cheat sheet

參考:

git 的fetch和pull的區別

git中從遠端的分支獲取最新的版本到本地有這樣2個命令 1.git fetch 相當於是從遠端獲取最新版本到本地,不會自動merge git fetch origin master git log p master.origin master git merge origin master 上述過程...

git 刪除非當前分支,fetch 和 pull

git 賬號密碼錯誤 git config system unset credential.helpergit 刪除非當前分支 git branch d git在本地會儲存兩個版本的倉庫,分為本地倉庫和遠端倉庫。1 本地倉庫就是我們平時 add commit 的那個倉庫。2 遠端倉庫可以用git r...

iOS Git中的fetch和pull的區別

git中從遠端的分支獲取最新的版本到本地有這樣2個命令 1.git fetch 相當於是從遠端獲取最新版本到本地,不會自動merge git fetch origin master git log p master.origin master git merge origin master 上述過程...