使用 git fetch 與 git pull, 從 GitHub 取得最新檔案內容

更新日期: 2024 年 12 月 9 日

本文為 GitHub 操作指令教學,第 3 篇

  1. GitHub Issue 與 Git Commit 命名指南
  2. Git Clone:初次複製專案的完整指南
  3. 使用 git fetch 與 git pull, 從 GitHub 取得最新檔案內容 👈 所在位置
  4. Git Ignore:排除檔案的完整指南
  5. 修改 Git 提交訊息與內容的完整指南
  6. GitHub 上傳檔案完整指南
  7. 發佈 Pull Request 與重新提交的完整指南

建議閱讀本文前,先閱讀完 Git 指令基本介紹教學 系列文

在使用 Git 進行版本控制時,從遠端儲存庫 (如 GitHub) 拉取最新的檔案內容,是日常工作中不可或缺的一部分。

本文將介紹幾種常用的方法,包括 git fetchgit pull,幫助新手快速理解和運用。


使用 git fetch

什麼是 git fetch

git fetch 是用來從遠端儲存庫下載最新變更的指令,但它不會直接影響本地分支的內容。

這使得開發者可以檢視和確認更新後再決定如何處理。

基本用法

git fetch

發生了什麼?

當執行 git fetch 時:

  1. Git 將下載遠端儲存庫的最新變更。
  2. 如果遠端有新增的分支,Git 會自動建立對應的追蹤分支,例如:origin/feature
  3. 本地分支不會受到影響,除非手動執行合併或切換。

使用 git pull

什麼是 git pull

git pullgit fetch 和自動合併的結合操作,能直接將遠端的最新變更同步到本地分支。

基本用法

git pull

發生了什麼?

  1. git pull 首先執行 git fetch,從遠端獲取最新的變更。
  2. 然後自動執行 git merge,將遠端分支的內容合併到當前分支。

範例:

git pull origin main

這表示將遠端儲存庫的 main 分支內容拉取並合併到本地的 main 分支。


使用 git pull --rebase

git pull --rebase 是另一種選擇,它將遠端變更應用到本地提交的基底上,保持提交歷史的線性結構。

指令:

git pull --rebase
  • git pull 的區別
    • git pull 使用合併 (merge),會保留多條分支的提交記錄。
    • git pull --rebase 使用重整基底 (rebase),會將提交歷史整理為線性結構。

具體的情境解釋

重點概念基底 (Base):是指一個分支開始進行新提交時,它所基於的那個提交點。

  1. 最後一次同步的狀態
    • 本地分支和遠端分支在某個時刻會同步,例如在執行 git pullgit fetch 時。
    • 假設同步後,本地和遠端的狀態相同,這時基底是共同的提交點,稱為 B
  2. 在本地進行新提交
    • 當您在本地分支進行修改,並提交(如 git commit),這些新提交(如 DE)是基於同步後的那個基底(B)進行的。
    • 這表示 DE 的「父節點」是 B
  3. 遠端的變更(新增 C
    • 如果在此期間,遠端分支新增了一個提交(如 C),本地分支並不會自動知道這一點。
    • 因此,本地的提交 DE 依然基於舊的狀態 B,而不是最新的狀態 C

用圖示化的方式來理解

初始狀態(同步後,基底是 B):

遠端分支:A -- B [origin/main]
本地分支:A -- B [HEAD, main]

本地新增提交:

在本地分支進行兩次提交(DE):

遠端分支:A -- B [origin/main]
本地分支:A -- B -- D -- E [HEAD, main]

這裡的 DE 是基於 B

遠端新增提交:

此期間,遠端分支新增了一個提交 C

遠端分支:A -- B -- C [origin/main]
本地分支:A -- B -- D -- E [HEAD, main]

本地的提交仍然是基於 B,因為本地尚未執行同步操作。

當您在本地分支新增提交(如 DE)時,這些提交會基於最後一次從遠端分支同步過來的狀態(在這個例子中是 B),而不是遠端的最新提交(如 C)。

只有在執行同步操作(如 git pullgit fetch)後,本地分支才會知道遠端的最新狀態。

如果本地分支的基底和遠端不一致,該怎麼辦?

當發現本地分支的基底(如 B)與遠端分支的最新狀態(如 C)不一致時,我們需要同步兩者的內容,使本地分支能與遠端保持一致。

以下是詳細的操作步驟和方法。

檢查遠端更新

首先,使用 git fetch 獲取遠端分支的最新狀態,但不會自動合併到本地分支:

git fetch origin

執行後,您可以使用以下指令檢視本地分支與遠端分支的差異:

git log HEAD..origin/main --oneline

這會顯示遠端分支(origin/main)的新增提交(如 C)。

選擇同步方式

根據需求,您可以選擇以下兩種方式來同步本地分支與遠端分支:

方法一:使用 git pull(合併方式)

git pull 結合了 git fetchgit merge,會自動合併遠端分支的變更到本地分支:

git pull origin main

執行後,Git 會:

  1. 拉取遠端分支的變更。
  2. 將遠端的變更(如 C)合併到本地分支,生成一個合併節點。

結果:

遠端分支:A -- B ------- C [origin/main]
              \        \
本地分支:      D -- E -- M [HEAD, main]

適用場景:需要保留分支歷史,完整呈現遠端分支與本地分支的合併狀態。

方法二:使用 git pull --rebase(重整基底方式)

如果希望提交歷史保持線性,可以使用重整基底的方式:

git pull --rebase origin main

執行後,Git 會:

  1. 拉取遠端分支的變更(如 C)。
  2. 將本地分支的提交(如 DE)重演到遠端分支的基底上。

結果:

遠端分支:A -- B -- C [origin/main]
                        \
本地分支:               D' -- E' [HEAD, main]

適用場景:希望提交歷史簡潔,無需保留合併節點。

步驟 3:處理可能的衝突

無論是使用 git pull 還是 git pull --rebase,如果本地提交與遠端提交有衝突,Git 會提示解決衝突。

解決衝突的步驟:

  1. 打開衝突檔案,手動編輯並移除 Git 標記(如 <<<<<<<=======>>>>>>>)。
  2. 保存檔案後,將解決的檔案加入暫存區: git add <檔案名稱>
  3. 如果使用合併: git commit -m "解決衝突"
  4. 如果使用重整基底: git rebase --continue

步驟:確認同步結果

完成同步操作後,確認本地分支與遠端分支是否一致:

git status

若顯示:

Your branch is up to date with 'origin/main'.

則表示同步成功。


三種方法的比較

操作方式功能適用情境
git fetch獲取遠端變更,但不影響本地分支內容。想檢查遠端最新狀態,暫時不合併時。
git pull獲取並自動合併遠端變更。需要直接同步遠端內容到本地分支時。
git pull --rebase獲取遠端變更,並整理提交歷史為線性結構。想保持提交歷史清晰簡潔時。

小結

當本地分支的基底與遠端不一致時,可以按照以下步驟處理:

  1. 使用 git fetch 獲取遠端最新變更。
  2. 選擇 git pullgit pull --rebase 進行同步。
  3. 解決可能的衝突。
  4. 確認同步結果。

這些操作不僅能讓本地分支與遠端保

Similar Posts