Git 進(jìn)階 - 獲取 fetch

在之前的內(nèi)容中蟆盹,有學(xué)習(xí)總結(jié)基本操作孩灯、修改撤回、分支 branch逾滥、貯藏 stash 峰档、標(biāo)簽 tag 以及部分遠(yuǎn)程操作。

涉及了 Git 的幾個(gè)工作區(qū)寨昙,工作目錄讥巡、暫存區(qū)、本地倉(cāng)庫(kù) 以及 遠(yuǎn)程倉(cāng)庫(kù)
他們之間的用 Git 操作的關(guān)系可總結(jié)如下圖:


從本期開(kāi)始進(jìn)入Git 的進(jìn)一步學(xué)習(xí)

本想先介紹下遠(yuǎn)程倉(cāng)庫(kù)的舔哪,有幾個(gè)好友說(shuō)很期待看 fetch欢顷,所以進(jìn)階首篇,學(xué)習(xí) fetch 命令捉蚤,也會(huì)區(qū)分下 git fetchgit pull 的使用抬驴。

fetch 概念

git fetchgit pull 是兩個(gè)比較相近的命令

git pull 我們已經(jīng)知道炼七,是從遠(yuǎn)程倉(cāng)庫(kù)拉取最新的內(nèi)容到本地,在 pull 的過(guò)程中如果沒(méi)有沖突布持,Git 會(huì)自動(dòng)將最新的內(nèi)容合并到本地倉(cāng)庫(kù)中豌拙,如果有沖突也是需要解決沖突。

fetch 可譯為獲取鳖链,官方給出如下說(shuō)明

git fetch:Download objects and refs from another repository
git pull :Fetch from and integrate with another repository or a local branch

fetch 直譯過(guò)來(lái)就是從另一個(gè)存儲(chǔ)庫(kù)下載對(duì)象和引用(refs)姆蘸,而 pull 可以看到除了 fetch 之外 還有 integrate(集成),所以大家習(xí)慣理解成 pull = fetch + merge芙委,用于本地存儲(chǔ)庫(kù)與遠(yuǎn)程存儲(chǔ)庫(kù)同步逞敷。

fetch & pull

我們來(lái)具體消化下上面的解釋

在我們進(jìn)行 commit 的時(shí)候,Git 會(huì)自動(dòng)生成一個(gè) commitid(即 SHA1 校驗(yàn)和)灌侣,此時(shí)如果進(jìn)行 push 操作推捐,遠(yuǎn)程倉(cāng)庫(kù)的對(duì)應(yīng)分支會(huì)同步這個(gè) commitid 的內(nèi)容,同時(shí)本地也會(huì)保存一份遠(yuǎn)程副本侧啼。

在入門(mén)(一)的時(shí)候牛柒,我們有提到過(guò),由 Git 管理的目錄會(huì)自動(dòng)生成一個(gè).git 文件夾痊乾,.git 文件夾包含著 Git 操作所需要的內(nèi)容皮壁。

在這個(gè)文件夾中就保存了 Git 本地倉(cāng)庫(kù) 以及 跟蹤的遠(yuǎn)程倉(cāng)庫(kù)的 commitid。


在上圖目錄 .git/refs 里面有幾個(gè)文件夾哪审,比如

  • heads 存放著本地分支
  • remotes 正在跟蹤的遠(yuǎn)程倉(cāng)庫(kù)
  • tags 標(biāo)簽

通過(guò) git branch -a 查看分支蛾魄,和 .git 文件夾本地以及遠(yuǎn)程分支是一致的。

這些文件里面存放的就是對(duì)應(yīng)分支指向的 commitid (如下圖)
HEAD 文件里面存放的是當(dāng)前的指向(這里也和前面 git branch -a 查看的內(nèi)容是一樣的)

下面進(jìn)入正題

  • 假設(shè)當(dāng)前操作的分支為 master 分支

使用 Git 進(jìn)行提交的時(shí)候湿滓,會(huì)使用 addcommit 命令將修改的文件提交 Git 版本庫(kù)滴须,同時(shí)在 heads/master(即,本地的當(dāng)前分支)生成對(duì)應(yīng)的 commitid(圖示中用 cid 表示)叽奥。然后扔水,通過(guò) push 同步到遠(yuǎn)程倉(cāng)庫(kù)對(duì)應(yīng)的分支中,同時(shí)本地也會(huì)保存一份遠(yuǎn)程的副本朝氓,即 origin/master

push

如果遠(yuǎn)程倉(cāng)庫(kù)被其他協(xié)同者更新了魔市,若要更新本地內(nèi)容,使用 push膀篮,此時(shí)會(huì)從遠(yuǎn)程獲取的最新內(nèi)容并合并到本地

pull

git pull 不同的是 fetch 是從遠(yuǎn)程倉(cāng)庫(kù) origin 的 master 分支獲取最新的內(nèi)容到 origin/master 分支上嘹狞,可以比較本地 master 和 origin/master 的差別之后,操作者視情況決定是否進(jìn)行合并

fetch

fetch 語(yǔ)法

git fetch 命令語(yǔ)法誓竿,詳見(jiàn)官方文檔 https://git-scm.com/docs/git-fetch

git fetch [<options>] [<repository> [<refspec>…?]]
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…?]
git fetch --all [<options>]

常用語(yǔ)法

git fetch
該命令將某個(gè)遠(yuǎn)程服務(wù)器的更新,全部取回本地谈截。默認(rèn)情況下筷屡,git fetch 取回所有分支的更新涧偷。

如果只想獲取特定分支的更新,可以指定分支名
git fetch <repository> <branch>

git fetch origin master

這里有個(gè)陌生的標(biāo)識(shí) FETCH_HEAD

FETCH_HEAD 是什么毙死?

FETCH_HEAD 指的是某個(gè) branch 在遠(yuǎn)程服務(wù)器上的最新?tīng)顟B(tài)

每一個(gè)執(zhí)行過(guò) fetch 操作的項(xiàng)目都會(huì)在 .git/FETCH_HEAD 文件中保存一個(gè) FETCH_HEAD 列表燎潮,其中每一行對(duì)應(yīng)著遠(yuǎn)程服務(wù)器的一個(gè)分支,而文件第一行就是當(dāng)前分支指向的 FETCH_HEAD

執(zhí)行 git fetch origin master 之后扼倘, FETCH_HEAD 就指向了 master 分支确封,

  • 如果沒(méi)有指定遠(yuǎn)程分支,那么當(dāng)前操作的分支對(duì)應(yīng)的遠(yuǎn)程分支作為默認(rèn)的FETCH_HEAD (假設(shè)當(dāng)前在develop 分支 執(zhí)行命令 git fetch再菊,那么 FETCH_HEAD 指向的就是遠(yuǎn)程端 develop 分支的最新提交)
  • 如果遠(yuǎn)程沒(méi)有對(duì)應(yīng)分支爪喘,也就沒(méi)有 FETCH_HEAD
  • 如果指定了分支,就將這個(gè)分支作為 FETCH_HEAD

這里先插入介紹下可能用到的命令

便于實(shí)戰(zhàn)纠拔,提前做些數(shù)據(jù)

  • 將之前創(chuàng)建的 feat_6 分支 push 到了遠(yuǎn)程服務(wù)器
  • 同時(shí)通過(guò) GitHub 創(chuàng)建了一次描述為 “l(fā)earn fetch” 的提交(添加了一行 add line : learn fetch)秉剑,模擬多人協(xié)同時(shí),遠(yuǎn)程倉(cāng)庫(kù)有更新

執(zhí)行一次 git fetch origin feat_6 FETCH_HEAD 和 origin/feat_6 都更新了

  • fetch 之后稠诲,如果想查看 fetch 日志侦鹏,可以使用 git log FETCH_HEAD
    這里便于查看 log 的區(qū)別,將本地分支切換為 feat_6
    最新的一次提交就是從遠(yuǎn)端獲取的臀叙,但是是本地沒(méi)有的日志
  • 也可以使用 diff 查看具體的改動(dòng)
    • git diff FETCH_HEAD [HEAD] 查看的是 HEAD(當(dāng)前分支)相對(duì)于FETCH_HEAD 的區(qū)別
    • 如果使用 git diff HEAD FETCH_HEAD 查看的就是略水,FETCH_HEAD 相對(duì)于 HEAD 的改變,注意和上邊做區(qū)分

講到這里劝萤,對(duì)于 pull = fetch + merge 的說(shuō)法便是指在同一分支

git pull 
等同于
git fetch
git merge FETCH_HEAD

除了上面的內(nèi)容渊涝,在 fetch 獲取遠(yuǎn)程更新之后,可以在它的基礎(chǔ)上創(chuàng)建一個(gè)新的分支稳其,比如:
git checkout -b newBranch origin/master
當(dāng)然也可以 merge 或 rebase 在本地分支上合并遠(yuǎn)程分支
git merge origin/mastergit rebase origin/master
(rebase 我們后面也會(huì)介紹到)

后記

fetch 這個(gè)功能在我平時(shí)的工作中也是疏于使用驶赏,但是不論使用 GitHub 還是 SourceTree 都可以看到 Fetch,F(xiàn)etch 之后會(huì)提示是否可 pull


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末既鞠,一起剝皮案震驚了整個(gè)濱河市煤傍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘱蛋,老刑警劉巖蚯姆,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異洒敏,居然都是意外死亡龄恋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)凶伙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)郭毕,“玉大人,你說(shuō)我怎么就攤上這事函荣∠匝海” “怎么了扳肛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)乘碑。 經(jīng)常有香客問(wèn)我挖息,道長(zhǎng),這世上最難降的妖魔是什么兽肤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任套腹,我火速辦了婚禮,結(jié)果婚禮上资铡,老公的妹妹穿的比我還像新娘电禀。我一直安慰自己,他們只是感情好害驹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布鞭呕。 她就那樣靜靜地躺著,像睡著了一般宛官。 火紅的嫁衣襯著肌膚如雪葫松。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天底洗,我揣著相機(jī)與錄音腋么,去河邊找鬼。 笑死亥揖,一個(gè)胖子當(dāng)著我的面吹牛珊擂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播费变,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼摧扇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了挚歧?” 一聲冷哼從身側(cè)響起扛稽,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滑负,沒(méi)想到半個(gè)月后在张,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矮慕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年撮慨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仔沿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片组力。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡县貌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哼转,我是刑警寧澤明未,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布槽华,位于F島的核電站壹蔓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏猫态。R本人自食惡果不足惜佣蓉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亲雪。 院中可真熱鬧勇凭,春花似錦、人聲如沸义辕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灌砖。三九已至璧函,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間基显,已是汗流浹背蘸吓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撩幽,地道東北人库继。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像窜醉,于是被迫代替她去往敵國(guó)和親宪萄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355