git fetch和git pull之間的區別

2021-06-27 22:24:32 字數 4448 閱讀 7517

git fetch和git pull都可以用來更新本地庫,它們之間有什麼區別呢?

每乙個本地庫下都有乙個.git的隱藏資料夾,資料夾中的檔案儲存著跟這個本地庫相關的資訊

首先來看下其中的config檔案

[core]

repositoryformatversion = 0

filemode = false

bare = false

logallrefupdates = true

symlinks = false

ignorecase = true

hidedotfiles = dotgitonly

[remote "origin"]

url = [email protected]:seanzou88/fetch.git

fetch = +refs/heads/*:refs/remotes/origin/*

[branch "master"]

remote = origin

merge = refs/heads/master

從這個檔案中我們可以了解到:

1,本地庫的當前分支為master,其關聯的遠端庫名稱為origin(不同的名稱可以指向同乙個遠端庫,參見git remote命令)

2,遠端庫origin所在的位置為(url):[email protected]:seanzou88/fetch.git

然後可以檢視.git資料夾下的head檔案:

ref: refs/heads/master
其指向.git\refs\heads\master檔案

ce71505b3626a3648b2c32ea2081d65049cad300
這個檔案中儲存的是本地庫中最新的commit id

.git\refs資料夾很有意思,面分為3個資料夾

heads資料夾前面說過了

remotes資料夾中的每乙個資料夾代表乙個遠端庫名稱(git remote),其中的每個檔案關聯遠端庫的乙個分支,其中儲存該分支的最新commit id

.git\logs資料夾下儲存的是.git\refs資料夾下相應檔案的變更記錄

準備工作到此結束,下面可以具體看看git fetch和git pull之間的區別了

git fetch origin

本地的latest commit id為:ce71505b3626a3648b2c32ea2081d65049cad300

githup上的latest commit id為:ab8cd391f978fe5384a78c92001ef8ae861046f0

before:

.git\refs\heads\master

ce71505b3626a3648b2c32ea2081d65049cad300
.git\refs\remotes\origin\master

ce71505b3626a3648b2c32ea2081d65049cad300
.git\logs\refs\heads\master

0000000000000000000000000000000000000000 

ce71505b3626a3648b2c32ea2081d65049cad300

......

commit (initial): first commit

.git\logs\refs\remotes\origin\master

0000000000000000000000000000000000000000 

ce71505b3626a3648b2c32ea2081d65049cad300

......

update by push

after:.git\refs\heads\master(不變)

.git\refs\remotes\origin\master

ab8cd391f978fe5384a78c92001ef8ae861046f0
.git\logs\refs\heads\master(不變)

.git\logs\refs\remotes\origin\master

0000000000000000000000000000000000000000 

ce71505b3626a3648b2c32ea2081d65049cad300

......

update by push

ce71505b3626a3648b2c32ea2081d65049cad300

ab8cd391f978fe5384a78c92001ef8ae861046f0

......

fetch origin: fast-forward

本地庫並沒有變化,也就是說,git fetch只會將本地庫所關聯的遠端庫的commit id更新至最新

head沒有變化很容易理解,因為本地庫並沒有變化

git pull origin master:master

本地的latest commit id為:3643a1a65fc88ae0e9f28f12168629758d027415

githup上的latest commit id為:64df093f73294d82a3adce9694871b9fac2aecfb

before:

.git\refs\heads\master

3643a1a65fc88ae0e9f28f12168629758d027415
.git\refs\remotes\origin\master

3643a1a65fc88ae0e9f28f12168629758d027415
.git\logs\refs\heads\master

0000000000000000000000000000000000000000 

3643a1a65fc88ae0e9f28f12168629758d027415

......

commit (initial): first commit

.git\logs\refs\remotes\origin\master

0000000000000000000000000000000000000000 

3643a1a65fc88ae0e9f28f12168629758d027415

......

update by push

after:.git\refs\heads\master

64df093f73294d82a3adce9694871b9fac2aecfb
.git\refs\remotes\origin\master(不變)

.git\logs\refs\heads\master

0000000000000000000000000000000000000000 

3643a1a65fc88ae0e9f28f12168629758d027415

......

commit (initial): first commit

3643a1a65fc88ae0e9f28f12168629758d027415

64df093f73294d82a3adce9694871b9fac2aecfb

......

pull origin master:master: fast-forward

.git\logs\refs\remotes\origin\master(不變)

本地庫更新至最新,git pull會將本地庫更新至遠端庫的最新狀態

由於本地庫進行了更新,head也會相應的指向最新的commit id

所以雖然從結果上來看,git pull = git fetch + git merge,但是從檔案中儲存的commit id來看,實現上不是這樣實現的

為了更好的理解,畫了個圖:

Git fetch和git pull的區別

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

Git fetch和git pull的區別

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

Git fetch和git pull的區別

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