git pull原理
1. git fetch
如果遠程倉庫新建分支,或者有新的commit,使用git fetch 會把本地對應的遠程分支信息進行更新
在遠程倉庫新建一個dev 分支,并在遠程dev分支上進行一次commit然后本地執行git fetch
可以發現本地倉庫會有如下變化:
①是 objects文件夾下會多出3個目錄,3個文件夾(對應遠程dev分支的一次commit)
一個是blob對象, 一個是tree對象, 一個是commit對象
②同時本地會在refs/remotes下多出dev文件
③在logs下也會有dev文件
④關鍵地方是會生成FETCH_HEAD文件
FETCH_HEAD文件中存儲的是遠程倉庫分支的最新信息
此時我們是在master分支上進行的git fetch,
那么FETCH_HEAD文件中第一行就是顯示master分支的最新信息
如果此時我們切換到dev分支,那么那么FETCH_HEAD文件中第一行就是顯示dev分支的最新信息
2. git pull = git fetch + git merge
我們在遠程倉庫的dev分支進行一次commit
到本地執行一次tree .git/ 查看git文件夾狀態 ,此時是有19個文件夾,22個文件
為了更好演示git pull,我們本地切換到dev 分支進行git pull -v
(加上 -v 參數,可以查看更多信息)
git pull時 首先會執行git fetch, 先把本地的遠程分支信息壓縮到git-upload-pack文件然后post到遠程倉庫
這樣git 把本地的遠程分支與 遠程倉庫分支進行比較,才知道需要更新哪些信息
可以發現,這里git fetch 更新了本地的dev遠程分支(因為我們在github上對dev分支進行了一次commit)
git fetch后, 執行了一次git merge(這里是fast - forward模式)
因此我們本地的dev 分支此時是落后于遠程dev分支一個commit,所以這里是fast-forward模式
執行git pull后,本地的git文件夾數量也發送了變化,由之前的19個目錄,22個文件變成了22個目錄,26個文件
這里新增的目錄和文件主要是執行了一次git fetch
本地會增加這一次commit對應的3個目錄,3個文件;
同時還多了一個ORIGIN_HEAD文件
可以發現ORIGIN_HEAD文件中存儲的是一個commit對象的hash值,而這個hash值正好是本地的dev分支合并之前所指的commit對象
這個ORIGIN_HEAD文件有什么用處呢??
可以用來回滾
比如,我們想撤銷這一次git pull,想回到pull之前的狀態,那我們可以執行
執行git branch -vv進行查看 ( 可以查看到本地分支與遠程分支的同步關系)
可以發現本地dev分支已經回退,此時落后于遠程dev分支一次commit
此時如果我們又想回到回到dev分支最新狀態,可以在dev分支上于origin/dev進行merge
發現本地dev分支和遠程dev分支保持同步!!
總結
以上是生活随笔為你收集整理的git pull原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 毕设-基于SpringBoot后勤报修系
- 下一篇: 带你深入了解拓扑排序