<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          從0學(xué)習(xí)Git:詳解git pull和git fetch的區(qū)別

          共 1863字,需瀏覽 4分鐘

           ·

          2019-12-28 23:27

          來源:CSDN

          作者:馬恩光

          整理:帥地

          在我們使用git的時候用的更新代碼是git fetch,git pull這兩條指令。但是有沒有小伙伴去思考過這兩者的區(qū)別呢?有經(jīng)驗的人總是說最好用git fetch+git merge,不建議用git pull。也有人說git pull=git fetch+git merge,真的是這樣嗎?為什么呢?既然如此為什么git還要提供這兩種方式呢?

          1、相同點

          首先在作用上他們的功能是大致相同的,都是起到了更新代碼的作用。

          2、不同點

          先補充一些git里面相關(guān)的一些知識

          首先我們要說簡單說git的運行機制。git分為本地倉庫和遠程倉庫,我們一般情況都是寫完代碼,commit到本地倉庫(生成本地倉的commit ID,代表當(dāng)前提交代碼的版本號),然后push到遠程倉庫(記錄這個版本號),這個流程大家都熟悉。

          我們本地的git文件夾里面對應(yīng)也存儲了git本地倉庫master分支的commit ID 和 跟蹤的遠程分支orign/master的commit ID(可以有多個遠程倉庫)。那什么是跟蹤的遠程分支呢?

          打開git文件夾可以看到如下文件:

          .git/refs/head/[本地分支]
          .git/refs/remotes/[正在跟蹤的分支]

          其中head就是本地分支,remotes是跟蹤的遠程分支,這個類型的分支在某種類型上是十分相似的,他們都是表示提交的SHA1校驗和(就是commitID)。

          但是,不管他們是如何的相似,他們還是有一個重大的區(qū)別:更改遠端跟蹤分支只能用git fetch,或者是git push后作為副產(chǎn)品(side-effect)來改變。我們無法直接對遠程跟蹤分支操作,我們必須先切回本地分支然后創(chuàng)建一個新的commit提交。

          34013842d6dda3cb5d3350e47916d467.webp在這里插入圖片描述

          例子演示

          首先假設(shè)我們本地倉庫的 master 分支上 commit ID =1 ,orign/mastter中的commit ID =1 ;這時候遠程倉庫有人更新了github ogirn庫中master分支上的代碼,新的代碼版本號commit ID =2 ,那么在github上 orign/master的commitID=2,然后我們要更新代碼。

          16f3090ad3d269e7cce8ba382b4aae4a.webp
          git fetch

          1、使用git fetch更新代碼,本地的庫中master的commitID不變,還是等于1。但是與git上面關(guān)聯(lián)的那個orign/master的commit ID變成了2。這時候我們本地相當(dāng)于存儲了兩個代碼的版本號,我們還要通過merge去合并這兩個不同的代碼版本,如果這兩個版本都修改了同一處的代碼,這時候merge就會出現(xiàn)沖突,然后我們解決沖突之后就生成了一個新的代碼版本。

          2、這時候本地的代碼版本可能就變成了commit ID=3,即生成了一個新的代碼版本。

          0deb4ed9756d79df3e95a8e43a2610c7.webp在這里插入圖片描述
          3、相當(dāng)于fetch的時候本地的master沒有變化,但是與遠程倉關(guān)聯(lián)的那個版本號被更新了,我們接下來就是在本地合并這兩個版本號的代碼。
          git push

          1、是用git pull更新代碼的話就比較簡單暴力了,看下圖。

          86bb1944c0925b7c7386edc43a215a31.webp在這里插入圖片描述
          2、使用git pull的會將本地的代碼更新至遠程倉庫里面最新的代碼版本

          總結(jié)

          由此可見,git pull看起來像git fetch+get merge,但是根據(jù)commit ID來看的話,他們實際的實現(xiàn)原理是不一樣的。

          這里借用之前文獻看到的一句話:不要用git pull,用git fetch和git merge代替它。

          git pull的問題是它把過程的細節(jié)都隱藏了起來,以至于你不用去了解git中各種類型分支的區(qū)別和使用方法。當(dāng)然,多數(shù)時候這是沒問題的,但一旦代碼有問題,你很難找到出錯的地方。看起來git pull的用法會使你吃驚,簡單看一下git的使用文檔應(yīng)該就能說服你。

          將下載(fetch)和合并(merge)放到一個命令里的另外一個弊端是,你的本地工作目錄在未經(jīng)確認的情況下就會被遠程分支更新。當(dāng)然,除非你關(guān)閉所有的安全選項,否則git pull在你本地工作目錄還不至于造成不可挽回的損失,但很多時候我們寧愿做的慢一些,也不愿意返工重來。

          推薦閱讀

          全部文章詳細分類與整理(算法+數(shù)據(jù)結(jié)構(gòu)+計算機基礎(chǔ))

          玩公眾號寫文章一年多以來,我經(jīng)歷了被噴被拉黑被贊美,我酸了

          有必要說一說即將到來的春招(經(jīng)歷+重要性+如何準備)

          普普通通,我的三年大學(xué)

          歷經(jīng)兩個月,我的秋招之路結(jié)束了!


          瀏覽 120
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美日韩黄色大片 | 大香焦av | 欧美VA视频 | 国产婬片一级A片AAA毛片AⅤ | 男人天堂久草 |