git fetch和git pull之間的區別

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

每一個本地庫下都有一個.git的隱藏文件夾,文件夾中的文件保存着跟這個本地庫相關的信息

首先來看下其中的config文件

[plain] view plain copy
  1. [core]  
  2.     repositoryformatversion = 0  
  3.     filemode = false  
  4.     bare = false  
  5.     logallrefupdates = true  
  6.     symlinks = false  
  7.     ignorecase = true  
  8.     hideDotFiles = dotGitOnly  
  9. [remote "origin"]  
  10.     url = [email protected]:seanzou88/fetch.git  
  11.     fetch = +refs/heads/*:refs/remotes/origin/*  
  12. [branch "master"]  
  13.     remote = origin  
  14.     merge = refs/heads/master  

從這個文件中我們可以瞭解到:

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

2,遠程庫origin所在的位置爲(URL):[email protected]:seanzou88/fetch.git

然後可以查看.git文件夾下的HEAD文件:

[plain] view plain copy
  1. ref: refs/heads/master  

其指向.git\refs\heads\master文件

[plain] view plain copy
  1. 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

[plain] view plain copy
  1. ce71505b3626a3648b2c32ea2081d65049cad300  

.git\refs\remotes\origin\master

[plain] view plain copy
  1. ce71505b3626a3648b2c32ea2081d65049cad300  

.git\logs\refs\heads\master

[plain] view plain copy
  1. 0000000000000000000000000000000000000000   
  2.         ce71505b3626a3648b2c32ea2081d65049cad300   
  3.         ......    
  4.         commit (initial): first commit   

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

[plain] view plain copy
  1. 0000000000000000000000000000000000000000   
  2.         ce71505b3626a3648b2c32ea2081d65049cad300   
  3.         ......    
  4.         update by push  

after:

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

.git\refs\remotes\origin\master

[plain] view plain copy
  1. ab8cd391f978fe5384a78c92001ef8ae861046f0  

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

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

[plain] view plain copy
  1. 0000000000000000000000000000000000000000   
  2.         ce71505b3626a3648b2c32ea2081d65049cad300   
  3.         ......        
  4.         update by push  
  5. ce71505b3626a3648b2c32ea2081d65049cad300   
  6.         ab8cd391f978fe5384a78c92001ef8ae861046f0   
  7.         ......    
  8.         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

[plain] view plain copy
  1. 3643a1a65fc88ae0e9f28f12168629758d027415  

.git\refs\remotes\origin\master

[plain] view plain copy
  1. 3643a1a65fc88ae0e9f28f12168629758d027415  

.git\logs\refs\heads\master

[plain] view plain copy
  1. 0000000000000000000000000000000000000000   
  2.         3643a1a65fc88ae0e9f28f12168629758d027415   
  3.         ......    
  4.         commit (initial): first commit  

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

[plain] view plain copy
  1. 0000000000000000000000000000000000000000   
  2.         3643a1a65fc88ae0e9f28f12168629758d027415   
  3.         ......    
  4.         update by push  

after:

.git\refs\heads\master

[plain] view plain copy
  1. 64df093f73294d82a3adce9694871b9fac2aecfb  

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

.git\logs\refs\heads\master

[plain] view plain copy
  1. 0000000000000000000000000000000000000000   
  2.         3643a1a65fc88ae0e9f28f12168629758d027415   
  3.         ......    
  4.         commit (initial): first commit  
  5. 3643a1a65fc88ae0e9f28f12168629758d027415   
  6.         64df093f73294d82a3adce9694871b9fac2aecfb   
  7.         ......    
  8.         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來看,實現上不是這樣實現的

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


文章轉自:https://blog.csdn.net/a19881029/article/details/42245955

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章