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...