git pull 和 git fetch到底什么區(qū)別?
收集整理每周優(yōu)質(zhì)開發(fā)者內(nèi)容,包括開源項目、工具資源、技術(shù)文章等方面,每周五首發(fā)于,歡迎大家Star并收藏!
Git是一款非常受歡迎,也非常強大的版本管理工具。
但是,它的工作流程相對于SVN等其他版本管理工作也復雜很多,對于剛接觸的同學會有很多操作難以理解。
例如,當我們和其他同學進行協(xié)同開發(fā)時,我們每個人都從遠程倉庫拉取了一份代碼到本地倉庫,此時每個人電腦上的本地倉庫和遠程倉庫都是一致的。
這時候,就需要先把遠程代碼的最新版本重新拉取一下到本地倉庫,這時候,就會用到git pull
和git fetch
。
在這個過程中,很多同學就有點分不清了,都是拉取遠程倉庫的代碼到本地倉庫,它們的區(qū)別是什么呢?
要想理解它們的工作愿意,首先要對Git倉庫有一個清晰的認識。
在我們開發(fā)過程中,代碼倉庫至少會有3個倉庫/副本:
本地工作目錄:也就是我們開發(fā)過程中正在編輯的工作目錄
本地倉庫:這一點是很多初學者容易忽略和搞混的,由于git是分布式的,所以每個開發(fā)者本地都會有一個本地倉庫,當我們通過git commit提交代碼時,更改就從本地工作目錄提交到了本地倉庫
遠程倉庫:這個應(yīng)該大多數(shù)同學都很清楚,顧名思義,就是在遠程服務(wù)器上存儲的倉庫,例如Github、Gitlab,當我們使用git push推送代碼時,代碼就從本地倉庫推到了遠程倉庫
在很多剛接觸Git的同學意識里,容易理解本地工作目錄和遠程目錄,認為執(zhí)行commit和push就是直接從本地工作目錄推到了遠程倉庫,容易忽略本地倉庫。
現(xiàn)在,理解了Git的工作流,接下來再解釋git pull
和git fetch
的區(qū)別就簡單多了。
就如同前面提到的,很多同事協(xié)同開發(fā)過程中并不是同步的。例如,A和B兩位開發(fā)者都從遠程倉庫拉了一份最新數(shù)據(jù)到本地倉庫,A修改了代碼之后先推送到遠程倉庫了,這時候B的本地倉庫代碼和遠程倉庫的就不一樣了。如果這時候直接push就會引起沖突。
所以,協(xié)同開發(fā)過程中,在推送代碼之前,首先需要先檢查一下本地倉庫與遠程倉庫的差異,然后把最新的代碼拉到本地,然后再提交、推送。
這時候就會用到git pull
和git fetch
,它們在完成相同的工作,只是處理方式不同。

git fetch
在拉取代碼過程中,git fetch會首先檢查本地倉庫和遠程倉庫的差異,檢查哪些不存在于本地倉庫,然后將這些變動的提交拉取到本地。
但是,這里請注意,它是把遠程提交拉取到本地倉庫,而不是本地工作目錄,它不會自行將這些新數(shù)據(jù)合并到當前工作目錄中,我們需要繼續(xù)執(zhí)行g(shù)it merge才會把這些變動合并到當前工作目錄。
git pull
git pull和git fetch剛好相反,它直接獲取遠程的最新提交,直接拉取并合并到本地工作目錄,而且在合并過程中不會經(jīng)過我們的審查,如果不仔細檢查,這樣很容易遇到?jīng)_突。
理解了git pull和git fetch的區(qū)別,那么該用哪種方式呢?
相比之下,git fetch是一個更安全的選擇,因為它從你的遠程倉庫拉入所有的提交,但不會對你的本地文件做任何修改。
這給了你足夠時間去發(fā)現(xiàn)遠程倉庫自從你上次拉取后到現(xiàn)在為止發(fā)生的變化。
你可以在合并前檢查哪些文件有變化,哪些文件可能導致沖突。
而git pull相當于運行g(shù)it fetch,然后立即將你的改動合并到本地倉庫。
這樣的確少了一個步驟,但是也會帶來一些風險。
作為一名開發(fā)者,在項目開發(fā)過程中很難繞開git,只有深入理解git的工作原理才能在工作中更加自如的應(yīng)用Git完成項目協(xié)同開發(fā),如果一直處于一知半解的狀態(tài),在版本控制中經(jīng)常會遇到各種各樣的問題。
我寫了一篇關(guān)于Git和Github的入門回答,循序漸進,比較詳細,感興趣的同學可以看一下:
另外,在實踐中我們可以得到更多的鍛煉,也可以加深對于Git的理解。我建議大家可以多參與Github上開源代碼的協(xié)同開發(fā),這樣不僅可以鍛煉對于Git的理解,還有很多額外的好處。
如果還不知道如何加入Github開源項目,可以參考我之前寫的一篇內(nèi)容:
建議大家有空可以多瀏覽Github,有很多非常優(yōu)秀的開源項目。但是,目前Github上項目多如牛毛,而且刷榜現(xiàn)在也非常嚴重,想要找到優(yōu)質(zhì)的項目變得越來越難。這里,給大家推薦Github上一個非常不錯的項目《DevWeekly》,這個項目每周都會精挑細選一些優(yōu)質(zhì)的開源項目,涵蓋C++、JAVA、JavaScript、Python、Go等不同編程語言。此外,還有一些開源工具、優(yōu)秀的技術(shù)文章,喜歡的同學可以Star并收藏一下,每周五會定期更新:
https://github.com/Jackpopc/DevWeekly