詳解git pull和git fetch的區別

2021-10-22 16:55:27 字數 1401 閱讀 9826

前言

在我們使用git的時候用的更新**是git fetch,git pull這兩條指令。但是有沒有小夥伴去思考過這兩者的區別呢?有經驗的人總是說最好用git fetch+git merge,不建議用git pull。也有人說git pull=git fetch+git merge,真的是這樣嗎?為什麼呢?既然如此為什麼git還要提供這兩種方式呢?

1. 相同點

首先在作用上他們的功能是大致相同的,都是起到了更新**的作用。

2. 不同點

先補充一些git裡面相關的一些知識:

首先我們要說簡單說git的執行機制。git分為本地倉庫和遠端倉庫,我們一般情況都是寫完**,commit到本地倉庫(生成本地倉的commit id,代表當前提交**的版本號),然後push到遠端倉庫(記錄這個版本號),這個流程大家都熟悉。

我們本地的git資料夾裡面對應也儲存了git本地倉庫master分支的commit id 和 跟蹤的遠端分支orign/master的commit id(可以有多個遠端倉庫)。那什麼是跟蹤的遠端分支呢,開啟git資料夾可以看到如下檔案:

.git/refs/head/[本地分支]

.git/refs/remotes/[正在跟蹤的分支]

其中head就是本地分支,remotes是跟蹤的遠端分支,這個型別的分支在某種型別上是十分相似的,他們都是表示提交的sha1校驗和(就是commitid)。

但是,不管他們是如何的相似,他們還是有乙個重大的區別:

更改遠端跟蹤分支只能用git fetch,或者是git push後作為副產品(side-effect)來改變。我們無法直接對遠端跟蹤分支操作,我們必須先切回本地分支然後建立乙個新的commit提交。

首先假設我們本地倉庫的 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 fetch的區別

前言在我們使用git的時候用的更新 是git fetch,git pull這兩條指令。但是有沒有小夥伴去思考過這兩者的區別呢?有經驗的人總是說最好用git fetch git merge,不建議用git pull。也有人說git pull git fetch git merge,真的是這樣嗎?為什麼...

詳解git pull和git fetch的區別

前言 在我們使用git的時候用的更新 是git fetch,git pull這兩條指令。但是有沒有小夥伴去思考過這兩者的區別呢?有經驗的人總是說最好用git fetch git merge,不建議用git pull。也有人說git pull git fetch git merge,真的是這樣嗎?為什...

詳解git fetch與git pull的區別

git fetch和git pull都可以將遠端倉庫更新至本地那麼他們之間有何區別?想要弄清楚這個問題有有幾個概念不得不提。fetch head 是乙個版本鏈結,記錄在本地的乙個檔案中,指向著目前已經從遠端倉庫取下來的分支的末端版本。commit id 在每次本地工作完成後,都會做乙個git com...