git fetch與git pull的區(qū)別詳解
git fetch和git pull都可以將遠(yuǎn)端倉(cāng)庫(kù)更新至本地那么他們之間有何區(qū)別?想要弄清楚這個(gè)問(wèn)題有有幾個(gè)概念不得不提。
FETCH_HEAD: 是一個(gè)版本鏈接,記錄在本地的一個(gè)文件中,指向著目前已經(jīng)從遠(yuǎn)程倉(cāng)庫(kù)取下來(lái)的分支的末端版本。
commit-id:在每次本地工作完成后,都會(huì)做一個(gè)git commit 操作來(lái)保存當(dāng)前工作到本地的repo, 此時(shí)會(huì)產(chǎn)生一個(gè)commit-id,這是一個(gè)能唯一標(biāo)識(shí)一個(gè)版本的序列號(hào)。 在使用git push后,這個(gè)序列號(hào)還會(huì)同步到遠(yuǎn)程倉(cāng)庫(kù)。
有了以上的概念再來(lái)說(shuō)說(shuō)git fetch
git fetch:這將更新git remote 中所有的遠(yuǎn)程倉(cāng)庫(kù)所包含分支的最新commit-id, 將其記錄到.git/FETCH_HEAD文件中
git fetch更新遠(yuǎn)程倉(cāng)庫(kù)的方式如下:
git fetch origin master:tmp //在本地新建一個(gè)temp分支,并將遠(yuǎn)程origin倉(cāng)庫(kù)的master分支代碼下載到本地temp分支 git diff tmp //來(lái)比較本地代碼與剛剛從遠(yuǎn)程下載下來(lái)的代碼的區(qū)別 git merge tmp //合并temp分支到本地的master分支 git branch -d temp //如果不想保留temp分支 可以用這步刪除
(1)如果直接使用git fetch,則步驟如下:
- 創(chuàng)建并更新本 地遠(yuǎn)程分支。即創(chuàng)建并更新origin/xxx 分支,拉取代碼到origin/xxx分支上。
- 在FETCH_HEAD中設(shè)定當(dāng)前分支-origin/當(dāng)前分支對(duì)應(yīng),如直接到時(shí)候git merge就可以將origin/abc合并到abc分支上。
(2)git fetch origin
只是手動(dòng)指定了要fetch的remote。在不指定分支時(shí)通常默認(rèn)為master
(3)git fetch origin dev
指定遠(yuǎn)程remote和FETCH_HEAD,并且只拉取該分支的提交。
這個(gè)命令會(huì)訪問(wèn)遠(yuǎn)程倉(cāng)庫(kù),從中拉取所有你還沒有的數(shù)據(jù)。 執(zhí)行完成后,你將會(huì)擁有那個(gè)遠(yuǎn)程倉(cāng)庫(kù)中所有分支的引用,可以隨時(shí)合并或查看。
如果你使用git clone 命令克隆了一個(gè)倉(cāng)庫(kù),命令會(huì)自動(dòng)將其添加為遠(yuǎn)程倉(cāng)庫(kù)(git remote -v)并默認(rèn)以 “origin” 為簡(jiǎn)寫。 所以,git fetch origin 會(huì)抓取克?。ɑ蛏弦淮巫ト。┖笮峦扑偷乃泄ぷ鳌?必須注意 git fetch 命令會(huì)將數(shù)據(jù)拉取到你的本地倉(cāng)庫(kù) - 它并不會(huì)自動(dòng)合并或修改你當(dāng)前的工作。 當(dāng)準(zhǔn)備好時(shí)你必須手動(dòng)將其合并入你的工作。
如果你有一個(gè)分支設(shè)置為跟蹤一個(gè)遠(yuǎn)程分支,可以使用 git pull命令來(lái)自動(dòng)的抓取然后合并遠(yuǎn)程分支到當(dāng)前分支。 這對(duì)你來(lái)說(shuō)可能是一個(gè)更簡(jiǎn)單或更舒服的工作流程;默認(rèn)情況下,git clone 命令會(huì)自動(dòng)設(shè)置本地 master 分支跟蹤克隆的遠(yuǎn)程倉(cāng)庫(kù)的 master 分支(或不管是什么名字的默認(rèn)分支)。 運(yùn)行 git pull 通常會(huì)從最初克隆的服務(wù)器上抓取數(shù)據(jù)并自動(dòng)嘗試合并到當(dāng)前所在的分支。
git pull : 首先,基于本地的FETCH_HEAD記錄,比對(duì)本地的FETCH_HEAD記錄與遠(yuǎn)程倉(cāng)庫(kù)的版本號(hào),然后git fetch 獲得當(dāng)前指向的遠(yuǎn)程分支的后續(xù)版本的數(shù)據(jù),然后再利用git merge將其與本地的當(dāng)前分支合并。所以可以認(rèn)為git pull是git fetch和git merge兩個(gè)步驟的結(jié)合。
git pull的用法如下:
git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名> //取回遠(yuǎn)程主機(jī)某個(gè)分支的更新,再與本地的指定分支合并。
因此,與git pull相比git fetch相當(dāng)于是從遠(yuǎn)程獲取最新版本到本地,但不會(huì)自動(dòng)merge。如果需要有選擇的合并git fetch是更好的選擇。效果相同時(shí)git pull將更為快捷。
注:用git pull更新代碼的話就比較簡(jiǎn)單暴力了但是根據(jù)commit ID來(lái)看的話,他們實(shí)際的實(shí)現(xiàn)原理是不一樣的,所以不要用git pull,用git fetch和git merge更加安全。
到此這篇關(guān)于git fetch與git pull的區(qū)別詳解的文章就介紹到這了,更多相關(guān)git fetch與git pull區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Git pull(拉取)及push(上傳)相關(guān)命令介紹
這篇文章主要介紹了Git pull(拉取),push(上傳)相關(guān)命令,git是一個(gè)非常好用的分布式版本管理工具,Git是去中心化,每一個(gè)分支都是一個(gè)中心,并且支持本地倉(cāng)庫(kù)存儲(chǔ),像如今很多大公司都用git做版本控制。有興趣的話來(lái)學(xué)習(xí)一下2020-07-07永恒之藍(lán)實(shí)戰(zhàn)教程之Mac通過(guò)Metasploit攻擊Server2008的詳細(xì)過(guò)程
這篇文章主要介紹了永恒之藍(lán)實(shí)戰(zhàn)教程?Mac通過(guò)Metasploit攻擊Server2008,首先準(zhǔn)備一個(gè)Server2008,主要功能是使網(wǎng)絡(luò)上的機(jī)器能夠共享計(jì)算機(jī)文件、打印機(jī)、串行端口和通訊等資源,需要的朋友可以參考下2022-08-08GitHub入門教程 手把手教你最簡(jiǎn)單的開源項(xiàng)目托管
這篇文章主要介紹了GitHub入門教程 手把手教你最簡(jiǎn)單的開源項(xiàng)目托管,需要的朋友可以參考下2016-12-12