<style> .g56-hero{padding:clamp(25px,5vw,48px);border-radius:24px;background:linear-gradient(130deg,#131a2c,#1d4ed8 57%,#0f766e);color:#fff}.g56-hero h2{color:#fff;margin:.35em 0}.g56-kicker{font-size:.8rem;letter-spacing:.13em;font-weight:700}.g56-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:22px 0}.g56-card{padding:18px;border:1px solid #bfdbfe;border-radius:16px;background:#eff6ff}.g56-card strong{display:block;color:#1e40af;font-size:1.14rem}.g56-table{overflow-x:auto;margin:20px 0}.g56-table table{min-width:620px;width:100%;border-collapse:collapse}.g56-table th,.g56-table td{padding:11px;border:1px solid #cbd5e1;text-align:left;vertical-align:top}.g56-table th{background:#dbeafe;color:#1e3a8a}.g56-flow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px;margin:20px 0}.g56-step{padding:15px;border:1px solid #99f6e4;border-radius:14px;background:#f0fdfa}.g56-step b{display:block;color:#0f766e}.g56-note{padding:17px;border-left:5px solid #f59e0b;background:#fffbeb;border-radius:10px;margin:20px 0}.g56-bars{padding:20px;border:1px solid #bfdbfe;border-radius:15px;background:#f8fafc}.g56-bar{height:27px;border-radius:8px;background:#64748b;margin:5px 0 13px}.g56-bar.fast{width:7%;min-width:18px;background:#0d9488}@media(max-width:760px){.g56-grid,.g56-flow{grid-template-columns:1fr}} </style>

DEVELOPMENT / DEVOPS / GIT 2.56

競合解消で「別の修正」まで混ぜない

Git 2.56は派手な新機能だけでなく、レビューとリポジトリ保守で起きがちな小さな事故を減らす更新です。

競合解消解消したパスだけステージ
ブランチ整理削除前にdry-runで確認
履歴探索一部の大規模履歴で高速化

3行要約

  • Gitプロジェクトは2026年9月にGit 2.56を公開しました。本記事の公開日は日本時間10月1日です。[release][windows]
  • 新しいgit add --resolvedは競合中のパスだけを対象にし、競合マーカーが残っている通常ファイルがあればステージを中止します。[release][github]
  • git branch --delete-mergedやgit bisect run --reset-when-foundも追加。履歴探索の高速化は特定条件での測定値であり、すべてのリポジトリに同じ効果が出るわけではありません。[release][github]

背景:Gitの事故は「ついでに混ざる」

マージ競合を直した後、git add -uで変更済みファイルをまとめてステージすると、作業前からあった無関係な変更まで次のコミットに混ざることがあります。逆に、競合マーカー<<<<<<<を消し忘れたままステージすることもあります。Git 2.56はこの工程を狭く扱う--resolvedを追加しました。[^github]

何が新しい? 実務で効く3つ

Git 2.56の主な変更と使いどころ
変更できること注意点
git add --resolved未解決状態のパスだけをステージ通常のテキスト競合マーカーを確認するが、内容の正しさまでは判定しない
git branch --delete-merged追跡先へ取り込まれたローカルブランチをまとめて整理まず--dry-runで候補を見る
git bisect run --reset-when-found原因コミット特定後にbisect状態を自動整理テストスクリプトの終了コードが正しいことが前提

Gitの公式リリースノートがこれらの追加を確認できます。GitHubの解説は--resolvedが未マージのパスだけを見て、選択したテキストファイルに競合マーカーが一つでも残れば対象を一切ステージしないと説明しています。削除やバイナリ競合にはテキストマーカーの検査は適用されません。[release][github]

技術的なポイント:履歴が大きいチームにも

Git 2.56はmerge-base探索を、片側にしか属さない未処理コミットがなくなれば早期に止めるよう改善しました。GitHubは実リポジトリの一例で0.68秒から0.01秒、Linuxカーネルの特定クエリで0.29秒から0.01秒を報告しています。これはGitHubが示すケースの値で、一般的な「70倍高速化」の保証ではありません。Git公式ノートもアルゴリズム改善を記載しています。[release][github]

開発者・企業への影響

競合解消のステージング対象を限定できれば、レビューで無関係な差分を見落とすリスクを減らせます。ブランチ整理を定型化する際も、追跡先に取り込まれたことを確認してから候補を一覧化できます。一方、既存のCIや開発者端末のGitが2.56未満なら新オプションは使えません。社内の開発環境・コンテナイメージ・runnerのバージョンを先に把握する必要があります。

安全な導入手順・実践例

1. 確認git --versionで実行環境を点検
2. 小さく試す競合解消後に差分とstatusを確認
3. 展開チームの手順書・CIのGitを更新
git --version
git status --short
# 競合ファイルを編集してから、Git 2.56以降で実行
git add --resolved
git diff --cached --check
git diff --cached

git add --resolvedは競合解消の代わりではありません。内容とテスト結果を確認し、ステージされた差分をレビューしてからコミットします。ローカルブランチ整理は候補の確認だけを先に行います。[^github]

git branch --delete-merged 'origin/*' 'topic-*' --dry-run

上記は削除を実行しません。追跡先設定のないブランチや別worktreeで使用中のブランチなどは対象外になります。実際の削除はチームの保護ルールと候補を照合してから判断してください。[^github]

リスクと限界

新コマンドでも履歴やファイルを自動的に「正しく」判断するわけではありません。 競合マーカーが消えても論理的なマージミスは残り得ます。`--delete-merged`の「マージ済み」は指定された追跡先からの到達可能性で判定され、業務上の保存要件を意味しません。[^github]

git history dropなどの履歴書き換え機能も加わりましたが、こちらは実験的で、共有済み履歴への適用には慎重さが必要です。本記事の導入手順には含めません。GitLabの解説は将来のGit 3.0に向けた変更予定にも触れていますが、日程や互換性は今後の正式発表を追う必要があります。[^gitlab]

今後注目すべき点

CIイメージや開発者端末への2.56の普及、--resolvedの運用フィードバック、大規模リポジトリでのmerge-base実測を確認したいところです。性能比較は自社の履歴を使い、同一マシン・同一コマンドで更新前後を測るのが妥当です。

最終確認日:2026年10月1日(日本時間)。Git 2.56の公開は9月、GitHubとGitLabの解説記事は9月28日です。[release][github][^gitlab]

参照元

[^release]: Git公式:Git v2.56 Release Notes [^github]: GitHub Blog:Highlights from Git 2.56(2026年9月28日) [^gitlab]: GitLab Blog:What's new in Git 2.56.0?(2026年9月28日) [^windows]: Git公式:Git for Windowsの公開ページ

Previous Post Next Post