使用 git fetch 與 git pull, 從 GitHub 取得最新檔案內容
更新日期: 2024 年 12 月 9 日
本文為 GitHub 操作指令教學,第 3 篇:
- GitHub Issue 與 Git Commit 命名指南
- Git Clone:初次複製專案的完整指南
- 使用 git fetch 與 git pull, 從 GitHub 取得最新檔案內容 👈 所在位置
- Git Ignore:排除檔案的完整指南
- 修改 Git 提交訊息與內容的完整指南
- GitHub 上傳檔案完整指南
- 發佈 Pull Request 與重新提交的完整指南
建議閱讀本文前,先閱讀完 Git 指令基本介紹教學 系列文
在使用 Git 進行版本控制時,從遠端儲存庫 (如 GitHub) 拉取最新的檔案內容,是日常工作中不可或缺的一部分。
本文將介紹幾種常用的方法,包括 git fetch
、git pull
,幫助新手快速理解和運用。
使用 git fetch
什麼是 git fetch
?
git fetch
是用來從遠端儲存庫下載最新變更的指令,但它不會直接影響本地分支的內容。
這使得開發者可以檢視和確認更新後再決定如何處理。
基本用法
git fetch
發生了什麼?
當執行 git fetch
時:
- Git 將下載遠端儲存庫的最新變更。
- 如果遠端有新增的分支,Git 會自動建立對應的追蹤分支,例如:
origin/feature
。 - 本地分支不會受到影響,除非手動執行合併或切換。
使用 git pull
什麼是 git pull
?
git pull
是 git fetch
和自動合併的結合操作,能直接將遠端的最新變更同步到本地分支。
基本用法
git pull
發生了什麼?
git pull
首先執行git fetch
,從遠端獲取最新的變更。- 然後自動執行
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):是指一個分支開始進行新提交時,它所基於的那個提交點。
- 最後一次同步的狀態
- 本地分支和遠端分支在某個時刻會同步,例如在執行
git pull
或git fetch
時。 - 假設同步後,本地和遠端的狀態相同,這時基底是共同的提交點,稱為
B
。
- 本地分支和遠端分支在某個時刻會同步,例如在執行
- 在本地進行新提交
- 當您在本地分支進行修改,並提交(如
git commit
),這些新提交(如D
和E
)是基於同步後的那個基底(B
)進行的。 - 這表示
D
和E
的「父節點」是B
。
- 當您在本地分支進行修改,並提交(如
- 遠端的變更(新增
C
)- 如果在此期間,遠端分支新增了一個提交(如
C
),本地分支並不會自動知道這一點。 - 因此,本地的提交
D
和E
依然基於舊的狀態B
,而不是最新的狀態C
。
- 如果在此期間,遠端分支新增了一個提交(如
用圖示化的方式來理解
初始狀態(同步後,基底是 B
):
遠端分支:A -- B [origin/main]
本地分支:A -- B [HEAD, main]
本地新增提交:
在本地分支進行兩次提交(D
和 E
):
遠端分支:A -- B [origin/main]
本地分支:A -- B -- D -- E [HEAD, main]
這裡的 D
和 E
是基於 B
。
遠端新增提交:
此期間,遠端分支新增了一個提交 C
:
遠端分支:A -- B -- C [origin/main]
本地分支:A -- B -- D -- E [HEAD, main]
本地的提交仍然是基於 B
,因為本地尚未執行同步操作。
當您在本地分支新增提交(如 D
和 E
)時,這些提交會基於最後一次從遠端分支同步過來的狀態(在這個例子中是 B
),而不是遠端的最新提交(如 C
)。
只有在執行同步操作(如 git pull
或 git fetch
)後,本地分支才會知道遠端的最新狀態。
如果本地分支的基底和遠端不一致,該怎麼辦?
當發現本地分支的基底(如 B
)與遠端分支的最新狀態(如 C
)不一致時,我們需要同步兩者的內容,使本地分支能與遠端保持一致。
以下是詳細的操作步驟和方法。
檢查遠端更新
首先,使用 git fetch
獲取遠端分支的最新狀態,但不會自動合併到本地分支:
git fetch origin
執行後,您可以使用以下指令檢視本地分支與遠端分支的差異:
git log HEAD..origin/main --oneline
這會顯示遠端分支(origin/main
)的新增提交(如 C
)。
選擇同步方式
根據需求,您可以選擇以下兩種方式來同步本地分支與遠端分支:
方法一:使用 git pull
(合併方式)
git pull
結合了 git fetch
和 git merge
,會自動合併遠端分支的變更到本地分支:
git pull origin main
執行後,Git 會:
- 拉取遠端分支的變更。
- 將遠端的變更(如
C
)合併到本地分支,生成一個合併節點。
結果:
遠端分支:A -- B ------- C [origin/main]
\ \
本地分支: D -- E -- M [HEAD, main]
適用場景:需要保留分支歷史,完整呈現遠端分支與本地分支的合併狀態。
方法二:使用 git pull --rebase
(重整基底方式)
如果希望提交歷史保持線性,可以使用重整基底的方式:
git pull --rebase origin main
執行後,Git 會:
- 拉取遠端分支的變更(如
C
)。 - 將本地分支的提交(如
D
和E
)重演到遠端分支的基底上。
結果:
遠端分支:A -- B -- C [origin/main]
\
本地分支: D' -- E' [HEAD, main]
適用場景:希望提交歷史簡潔,無需保留合併節點。
步驟 3:處理可能的衝突
無論是使用 git pull
還是 git pull --rebase
,如果本地提交與遠端提交有衝突,Git 會提示解決衝突。
解決衝突的步驟:
- 打開衝突檔案,手動編輯並移除 Git 標記(如
<<<<<<<
、=======
、>>>>>>>
)。 - 保存檔案後,將解決的檔案加入暫存區:
git add <檔案名稱>
- 如果使用合併:
git commit -m "解決衝突"
- 如果使用重整基底:
git rebase --continue
步驟:確認同步結果
完成同步操作後,確認本地分支與遠端分支是否一致:
git status
若顯示:
Your branch is up to date with 'origin/main'.
則表示同步成功。
三種方法的比較
操作方式 | 功能 | 適用情境 |
---|---|---|
git fetch | 獲取遠端變更,但不影響本地分支內容。 | 想檢查遠端最新狀態,暫時不合併時。 |
git pull | 獲取並自動合併遠端變更。 | 需要直接同步遠端內容到本地分支時。 |
git pull --rebase | 獲取遠端變更,並整理提交歷史為線性結構。 | 想保持提交歷史清晰簡潔時。 |
小結
當本地分支的基底與遠端不一致時,可以按照以下步驟處理:
- 使用
git fetch
獲取遠端最新變更。 - 選擇
git pull
或git pull --rebase
進行同步。 - 解決可能的衝突。
- 確認同步結果。
這些操作不僅能讓本地分支與遠端保