說說對(duì)Git pull 和 Git fetch 的理解?有什么區(qū)別?
本文轉(zhuǎn)載自微信公眾號(hào)「JS每日一題」,作者灰灰。轉(zhuǎn)載本文請(qǐng)聯(lián)系JS每日一題公眾號(hào)。
一、是什么
先回顧兩個(gè)命令的定義
- git fetch 命令用于從另一個(gè)存儲(chǔ)庫下載對(duì)象和引用
- git pull 命令用于從另一個(gè)存儲(chǔ)庫或本地分支獲取并集成(整合)
再來看一次git的工作流程圖,如下所示:
可以看到,git fetch是將遠(yuǎn)程主機(jī)的最新內(nèi)容拉到本地,用戶在檢查了以后決定是否合并到工作本機(jī)分支中
而git pull 則是將遠(yuǎn)程主機(jī)的最新內(nèi)容拉下來后直接合并,即:git pull = git fetch + git merge,這樣可能會(huì)產(chǎn)生沖突,需要手動(dòng)解決
在我們本地的git文件中對(duì)應(yīng)也存儲(chǔ)了git本地倉庫分支的commit ID和 跟蹤的遠(yuǎn)程分支的commit ID,對(duì)應(yīng)文件如下:
- .git/refs/head/[本地分支]
- .git/refs/remotes/[正在跟蹤的分支]
使用 git fetch更新代碼,本地的庫中master的commitID不變
但是與git上面關(guān)聯(lián)的那個(gè)orign/master的commit ID發(fā)生改變
這時(shí)候我們本地相當(dāng)于存儲(chǔ)了兩個(gè)代碼的版本號(hào),我們還要通過merge去合并這兩個(gè)不同的代碼版本
也就是fetch的時(shí)候本地的master沒有變化,但是與遠(yuǎn)程倉關(guān)聯(lián)的那個(gè)版本號(hào)被更新了,接下來就是在本地merge合并這兩個(gè)版本號(hào)的代碼
相比之下,使用git pull就更加簡(jiǎn)單粗暴,會(huì)將本地的代碼更新至遠(yuǎn)程倉庫里面最新的代碼版本,如下圖:
二、用法
一般遠(yuǎn)端倉庫里有新的內(nèi)容更新,當(dāng)我們需要把新內(nèi)容下載的時(shí)候,就使用到git pull或者git fetch命令
fetch
用法如下:
- git fetch <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>
例如從遠(yuǎn)程的origin倉庫的master分支下載代碼到本地并新建一個(gè)temp分支
- git fetch origin master:temp
如果上述沒有冒號(hào),則表示將遠(yuǎn)程origin倉庫的master分支拉取下來到本地當(dāng)前分支
這里git fetch不會(huì)進(jìn)行合并,執(zhí)行后需要手動(dòng)執(zhí)行g(shù)it merge合并,如下:
- git merge temp
pull
兩者的用法十分相似,pull用法如下:
- git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>
例如將遠(yuǎn)程主機(jī)origin的master分支拉取過來,與本地的branchtest分支合并,命令如下:
- git pull origin master:branchtest
同樣如果上述沒有冒號(hào),則表示將遠(yuǎn)程origin倉庫的master分支拉取下來與本地當(dāng)前分支合并
三、區(qū)別
相同點(diǎn):
- 在作用上他們的功能是大致相同的,都是起到了更新代碼的作用
不同點(diǎn):
- git pull是相當(dāng)于從遠(yuǎn)程倉庫獲取最新版本,然后再與本地分支merge,即git pull = git fetch + git merge
- 相比起來,git fetch 更安全也更符合實(shí)際要求,在 merge 前,我們可以查看更新情況,根據(jù)實(shí)際情況再?zèng)Q定是否合并
參考文獻(xiàn)
- https://zhuanlan.zhihu.com/p/123370920
- https://segmentfault.com/a/1190000017030384
- https://juejin.cn/post/6844903921794859021