生活分享

Git 2.56 發布:GitHub 解讀更安全的衝突暫存、更快的合併基底搜尋與 path-walk 改進

GitHub 部落格 2026 年 9 月 28 日介紹開源 Git 專案新發布的 Git 2.56.0。主要受影響的是開發者與程式碼託管平台:新增 git add --resolved,避免解決合併衝突時誤把無關修改一併加入;尋找共同祖先的速度加快;path-walk 重新打包則可與 bitmap 及 delta islands 一起使用。

閱讀時間約 7 分鐘

Git 2.56 發布:GitHub 解讀更安全的衝突暫存、更快的合併基底搜尋與 path-walk 改進
圖片:Mokaair (Original editorial artwork)

發生了什麼事

GitHub 部落格於 2026 年 9 月 28 日刊出由 Elijah Newren 撰寫的文章,指開源 Git 專案剛發布 Git 2.56.0。Git 是開發者用來記錄與管理程式碼修改歷史的版本控制工具。GitHub 表示,這個版本收錄了來自超過 104 名貢獻者的功能與錯誤修正,其中 39 人是新貢獻者。文章挑選了 GitHub 認為最值得關注的改動,包括三項:更安全地標記「衝突已解決」、更快地找出共同祖先,以及讓 path-walk 重新打包更適合伺服器使用。

三大重點改動

Git 2.56 發布:GitHub 解讀更安全的衝突暫存、更快的合併基底搜尋與 path-walk 改進
Mokaair 編輯查核流程 · 圖片:Mokaair (Original editorial artwork)
閱讀完整文字說明

消息會先蒐集來源、獨立查核,再交由 Jev 判斷。

git add --resolved:只暫存已解決的衝突

合併兩條開發分支時,如果雙方改到同一處,Git 無法自動決定保留哪一份,就會發生「合併衝突」。Git 會在檔案裡留下「衝突標記」,把雙方不同的內容標示出來。GitHub 解釋,解決衝突分成兩步:第一步是修改檔案,直到內容正確;第二步是把這些檔案「暫存」,也就是放進 Git 的索引,告訴 Git 衝突已經解決。索引是下一次提交前的準備區。問題出在第二步。常用的 git add -u 會暫存所有已修改、且受 Git 追蹤的檔案,因此可能把與衝突無關的本地修改一起暫存;如果漏看了一處衝突標記,也可能把仍有標記的檔案暫存進去。Git 2.56 新增的 git add --resolved 只處理索引中目前仍未合併的檔案,暫存前會先掃描是否還留有衝突標記。如果發現殘留標記,它會列出受影響的檔案,並且不改動索引。

GitHub 文章中的 git add --resolved 示例 · shell
$ git add --resolved
fatal: the following paths still have conflict markers: recipe.txt
$ # Edit recipe.txt and remove the conflict markers.
$ git add --resolved
$ git status --short
 M notes.txt
M  recipe.txt

在上面的例子中,第一次執行時,recipe.txt 仍有衝突標記,所以 Git 拒絕暫存。清除標記後再執行,recipe.txt 會被標記為已解決並暫存,而無關的 notes.txt 修改則維持未暫存。GitHub 補充,這個模式可以搭配 pathspec(指定要處理哪些路徑的條件)縮小範圍,但在選定範圍內採取「全有或全無」的檢查:只要其中一個檔案仍有衝突標記,就一個都不會暫存。已解決的刪除以及二進位檔案的衝突沒有文字標記,可以正常暫存。它不能與 git add -u 或 git add -A 同時使用,也會略過從未發生衝突的追蹤檔案。

合併基底搜尋可以提早停止

「合併基底」指兩個提交的最佳共同祖先,也就是雙方分岔前最近的共同版本。合併、三點 diff 比較,以及託管平台上的 pull request 比較,都需要先找出它。GitHub 解釋,Git 會從兩端的最新提交往回走;兩邊都能走到的提交,就是合併基底的候選。由於交叉合併可能產生多個合併基底,Git 必須繼續搜尋,直到確定已全部找到。舊有的停止規則可能在已經不可能再出現新合併基底之後,仍繼續處理大量舊歷史。Git 2.56 會追蹤佇列中仍只屬於其中一方的提交數量。只要其中一方已經走完,就不可能再出現新的交會點,Git 便可以停止,同時仍會回傳所有合併基底。

path-walk 重新打包可搭配 bitmap 與 delta islands

Git 重新打包(repack)儲存庫時,會尋找內容相似的物件,改用「差異」形式儲存以節省空間。GitHub 表示,傳統做法依名稱雜湊把候選物件分組,path-walk 則依檔案在目錄樹中的位置走訪物件,讓同一路徑的不同版本排在一起,往往能找到更好的差異組合。不過,託管平台通常會用 reachability bitmap(用來快速列出需要傳送哪些物件的索引),有些平台還會用 delta islands(防止一組參照的物件依賴只存在於另一組參照中的物件)。過去 path-walk 與這兩者都不相容,Git 2.56 移除了這兩項限制。GitHub 強調,新版並沒有預設啟用 path-walk 重新打包,只是讓大型儲存庫託管方能夠評估它節省儲存空間的效果。

GitHub 公布的效能數字對照

數字均來自 GitHub 部落格文章,實際效果取決於儲存庫結構。
場景改動前Git 2.56 / 新做法來源說法
真實 monorepo(把大量專案放在同一個儲存庫)的合併基底搜尋0.68 秒0.01 秒GitHub 引述的單一案例
Linux 核心 git merge-base --all v4.8 v4.9167,441 步、0.29 秒3,887 步、0.01 秒使用預設 v2 commit-graph
兩個大型 monorepo 的正式環境評估—其中一個有許多案例快約 70 倍;另一個平均快約 20 倍GitHub 所述的評估結果
Fluent UI 儲存庫重新打包後的大小558.5 MB(一般帶 bitmap 的重新打包)164.4 MB(--path-walk)約小 71%,為強制重算差異的基準測試

其他值得留意的新指令

  • git history drop:GitHub 表示,實驗性的 git history 指令在 Git 2.54 推出 reword 與 split,Git 2.55 加入 fixup,Git 2.56 再加入 drop。drop 會移除選定的提交,並把它之後的提交重新套用到它的上一個提交上。如果重新套用會發生衝突或覆寫本地修改,指令就會中止。它不能處理含有合併提交的歷史,也不能移除根提交或合併提交。
  • git refs 工具:Git 2.56 繼續把低階的參照管理集中到 git refs 之下,包括 create、update、delete 和 rename。參照是指向某個提交的名稱,例如分支。
  • git branch --delete-merged:GitHub 表示,新版加入一次清理多個本地主題分支的方式,適用於工作已併入上游的分支。文章示例附帶 --dry-run 選項。

對一般使用者有什麼影響

對日常使用 Git 的開發者來說,最直接的變化是 git add --resolved。如果合併時手上已有無關的本地修改,它就像一道安全欄,能減少把未解決的衝突或無關改動一起暫存的機會。合併基底搜尋的改進,主要影響歷史龐大、合併過大量舊分支的儲存庫;path-walk 相關改動則主要與儲存庫託管方有關。非開發者一般不會直接接觸這些改動。是否升級、何時升級,應依團隊自身的工具與相容性需要決定。

常見問題

Git 2.56 是什麼時候發布的?

GitHub 部落格於 2026 年 9 月 28 日發文,指開源 Git 專案剛發布 Git 2.56.0。

git add --resolved 和 git add -u 有什麼不同?

GitHub 表示,git add -u 會暫存所有已修改的追蹤檔案,包括與衝突無關的修改。git add --resolved 只處理目前仍未合併的衝突檔案;只要發現殘留的衝突標記,就不會暫存任何檔案。兩者不能同時使用。

新版會自動讓儲存庫變小嗎?

不會。GitHub 表示,Git 2.56 並未預設啟用 path-walk 重新打包,只是移除了它與 bitmap 及 delta islands 不相容的限制,讓託管方可以自行評估。

git history drop 可以放心在正式專案使用嗎?

GitHub 指出,git history 仍屬實驗性質,不能處理含有合併提交的歷史,也不能移除根提交或合併提交。使用前最好先了解這些限制。

git refs rename 和 git branch -m 一樣嗎?

不一樣。GitHub 指出,git refs rename 會移動參照及其 reflog(參照的變動紀錄),但不會像 git branch -m 那樣一併調整分支設定。git refs 系列是刻意設計的低階指令。

查看同分類最新消息

最新旅遊情報攻略

資料來源

生活分享