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