Git Diff / Merge ワークフロー
Gitは独自の内部アルゴリズムを使用して、差分、マージ、リベースを実行します。 これらの操作は決定的であり、完全に自動化されています:Gitは外部ツールに依存しません。
しかし、人間の判断が求められる状況もあります。 例えば、変更をテキストではなく視覚的または意味的に評価する必要がある場合です。 そのような場合、Git は意思決定ではなく検査を支援する外部ツールを呼び出すことができます。
macOS の一般的な例として、FileMerge.app があり、Xcode コマンドラインツールと共にインストールされ、Git によって diff ヘルパーまたはマージヘルパーとして起動できます。
Merge
Git がブランチをマージし、変更を照合できない場合、競合しているすべてのファイルに競合マーカーを書き込み、マージを停止してユーザーに通知します。 競合マーカーを持つ各ファイルについて、Git インデックスには共通の「ours」と「theirs」の3つの段階が記録されます。 この時点でリポジトリは conflicted merge state にあり、Git はすべての競合が解決されるのを待っています。
競合するファイル File.swift
が与えられた場合、生成されたファイル
手動で競合を修正するには、ファイルを編集してください:
- エディタでファイルを開き、競合マーカーを削除してください。
- 解決されたファイルを
git addでステージングしてください。
外部ツールの競合を修正するには、実行してください:
git mergetoolgit mergetool
は、競合する各ファイルごとにツールを起動し、BASE、ours、theirs、およびマージ結果パスをツールに渡します。
Gitは、次のファイルを起動する前にツールが終了するのを待ちます。
各ファイルに対するアプリケーションの終了コードは、そのファイルが解決済みとしてマークされているかどうかを決定します。
また、git add <file>
を明示的に実行してステージングとしてマークするオプションもあります。
複数のマージツールが設定されている場合、Git はこのリストから最初に見つかったものを選択します。
merge.tool設定。$GIT_MERGE_TOOL環境変数。- 既知のインストール済みツールからの自動検出。
外部ツールの呼び出し
各競合ファイル Example.swift に対して、Git
はここに見られる追加のファイルを作成します。
Example_BACKUP_70842.swift
Example_BASE_70842.swift
Example_LOCAL_70842.swift
Example_REMOTE_70842.swift
Example.swift
各呼び出しごとに接尾辞番号が変わります。 すると、Git 連携 で確認したように設定されたコマンドでツールが呼び出されます。 「CODE0」のコマンドは
abd --base Example_BASE_70842.swift --local Example_LOCAL_70842.swift --remote Example_REMOTE_70842.swift --result Example.swiftこのツールは、競合マーカーを除去し、通常通り終了することになっています。 これは、紛争が解決されたことを示しています。
Diff
差分に関しては、外部ツールは目視検査にのみ有用です。
Gitはアプリケーションが終了したときに戻りコードを無視します。
git difftool を呼び出すと、Git
は変更されたファイルを列挙し、各ファイルペアごとに外部ツールを起動します。
通常は、比較したいファイルをドラッグアンドドロップする方が良いです。
しかし、すべてを比較したい場合は、git difftool
を実行してください。
呼び出された外部ツールは、このリストから最初に見つかったものです。
diff.tool設定。$GIT_DIFF_TOOL環境変数。$PATHの既知のツールからの自動検出。vimdiffにフォールバックします。