1. 程式人生 > 其它 >git clone、git pull和git fetch的用法及區別--更易理解

git clone、git pull和git fetch的用法及區別--更易理解

最近在一個學習小組裡學習AI的課程,我們所有的學習資料和homework都放在gitlab上。今天一個小隊友從gitlab上load倉庫的時候問起了這個問題,正好在此總結記錄一下,僅供參考。

1.git clone

git clone顧名思義就是將其他倉庫克隆到本地,包括被clone倉庫的版本變化。舉個例子,你當前目錄比方說是在e:/course/中,此時若想下載遠端倉庫,本地無需git init,直接git clone url(url是你遠端倉庫的地址,直接複製就可以了)。執行git clone等待clone結束,e:/course/目錄下自動會有一個.git的隱藏資料夾(如果看不見,請嘗試設定隱藏資料夾可見),因為是clone來的,所以.git資料夾裡存放著與遠端倉庫一模一樣的版本庫記錄。clone操作是一個從無到有的克隆操作,再次強調不需要git init

初始化。

git clone的用法:

$ gitclone<版本庫的url>

例如克隆TensorFlow:

$ git clone https://github.com/tensorflow/tensorflow.git

或者使用SSH協議:

$ gitclone[email protected]:tensorflow/tensorflow.git

這樣就會在本地生成一個目錄,該目錄與遠端倉庫同名。
However,如果本地目錄不想與遠端倉庫同名怎麼辦??也有辦法,將目錄名作為git clone命令的第二個引數:

$ git clone<版本庫的網址><本地目錄名>

2.git pull

git pull是拉取遠端分支更新到本地倉庫的操作。比如遠端倉庫裡的學習資料有了新內容,需要把新內容下載下來的時候,就可以使用git pull命令。事實上,git pull是相當於從遠端倉庫獲取最新版本,然後再與本地分支merge(合併)。
  即:git pull = git fetch + git merge

注:git fetch不會進行合併,執行後需要手動執行git merge合併,而git pull拉取遠端分之後直接與本地分支進行合併。更準確地說,git pull是使用給定的引數執行git fetch,並呼叫git merge將檢索到的分支頭合併到當前分支中。

git pull的用法:

$ git pull<遠端主機名><遠端分支名>:<本地分支名>

舉例:將遠端主機origin的master分支拉取過來,與本地的branchtest分支合併。

$ git pull originmaster:branchtest

如果將冒號和後面的branchtest去掉,則表示將遠端origin倉庫的master分支拉取下來與本地當前分支合併。
以上的git pull操作如果用git fetch來表示:

$ git fetch origin master:brantest
$ git merge brantest

相比起來,git fetch更安全也更符合實際要求,因為可以在merge前,我們可以檢視更新情況,根據實際情況再決定是否合併。

3.git fetch 更新遠端程式碼到本地倉庫

理解 fetch 的關鍵, 是理解 FETCH_HEAD,FETCH_HEAD指的是: 某個branch在伺服器上的最新狀態’。這個列表儲存在 .Git/FETCH_HEAD 檔案中, 其中每一行對應於遠端伺服器的一個分支。
當前分支指向的FETCH_HEAD, 就是這個檔案第一行對應的那個分支.
一般來說, 存在兩種情況:

  • 如果沒有顯式的指定遠端分支, 則遠端分支的master將作為預設的FETCH_HEAD
  • 如果指定了遠端分支, 就將這個遠端分支作為FETCH_HEAD

git fetch更新本地倉庫的兩種用法:

# 方法一
$ git fetch origin master                #從遠端的origin倉庫的master分支下載程式碼到本地的origin maste
$ git log -p master.. origin/master      #比較本地的倉庫和遠端參考的區別
$ git merge origin/master                #把遠端下載下來的程式碼合併到本地倉庫,遠端的和本地的合併
# 方法二
$ git fetch origin master:temp           #從遠端的origin倉庫的master分支下載到本地並新建一個分支temp
$ git diff temp                          #比較master分支和temp分支的不同
$ git merge temp                         #合併temp分支到master分支
$ git branch -d temp                     #刪除temp