■概要
git merge でマージを行い「衝突が発生してマージコミットが作られずに処理が停止した状態」がいまいち理解できてなかったので、いったいどのような状態なのかをまとめた。
■マージに関連するコミットの名前
コミット名 | 説明 | git checkout/diffでの指定 | TortoiseGitでの呼び名 |
---|---|---|---|
HEAD | マージ作業直前のHEAD | --ours, -2 | %mine, LOCAL |
MERGE_HEAD | マージしようとしているコミット。 | --theirs, -3 | %theirs, REMOTE |
共通祖先 | 上2つの共通祖先 | --base | %base, BASE |
■git merge でコンフリクトした状態
コンフリクトしたときの作業コピー
共通祖先コミット ──────→ HEADコミット ────→ 【作業コピー】
│ (ours側) ↑
│ │
└─────────→ MERGE_HEADコミット - - - - ┘
(theirs側) ※ここの線はマージコミットを作るまでは無い
git merge でコンフリクトして止まったときは、HEADコミットの作業コピーに対して以下修正がされた状態になっている。(ちなみにHEADコミットの作業コピーなので、まだMERGE_HEADは親コミットとして登録されてない。)
- 衝突しなかったファイル
共通祖先コミット..MERGE_HEADの修正が「ステージ状態」にされている - 衝突したファイル
どこが衝突したのかわかるように自動編集されて、「衝突・未ステージ状態」にされている。
(「衝突フラグON」かつ「未ステージ状態」の状態)
「衝突・未ステージ状態」のファイルについて
衝突したファイルは以下のような状態遷移をする。
●初期状態
↓ git add (ステージされると同時に衝突フラグoff)
[衝突・未ステージ状態] ───────────────┐
↑ │
git checkout --conflict(*) │
: │
git reset ↓
[未ステージ状態] ←──────────────── [ステージ状態]
────────────────→
git add
(*)git co --conflict=merge ファイル名
……のコマンドで、[未ステージ状態][ステージ状態]どちらの状態からでも
「衝突フラグON」かつ「未ステージ状態」でどこが衝突したのかわかるように
自動編集された[衝突・未ステージ状態]に戻すことができる。
「衝突・未ステージ状態」ファイルに対しては、以下の作業を行うことができる。
これらは衝突フラグがONのファイルにしか行えない。
コマンド | 説明 |
---|---|
git checkout --ours ファイル名 | HEADコミットのファイルを作業コピーに上書き。-2オプションも同じ意味。 |
git checkout --theirs ファイル名 | MERGE_HEADコミットのファイルを作業コピーに上書き。-3オプションも同じ意味。 |
git diff --ours | HEADコミット..作業コピーの差分表示。 |
git diff --theirs | MERGE_HEADコミット..作業コピーの差分表示。 |
git add ファイル名 | ファイルを「衝突フラグOFF」にして「ステージ状態」にする。 |
■その他の情報
TortoiseGit既定マージツール
マージ用のGUIツールの説明。
- 左上ペイン
共通祖先..MERGE_HEAD の差分(削除行、追加行)が表示されている。 - 右上ペイン
共通祖先..HEAD の差分(削除行、追加行)が表示されている。 - 下ペイン
共通祖先..マージ結果ファイルの差分(削除行、追加行)が表示される。
衝突した箇所は「??????」と表示されている。
そこをカーソル選択して上部のアイコンをクリックすることで、ours, thirsのどちらかを採用した状態に編集できる。直接テキスト編集することも可能。
WinMerge
マージ用のGUIツールの説明。
TortoiseGitの設定でマージ外部ツールに「WinMerge.exe」と指定すると、BASE, LOCAL, REMOTEの3ファイルの比較が行われる。
マージ結果ファイルは別のテキストエディタなどで開かないと修正できない。
TortoiseGitの設定でマージ外部ツールに「WinMerge.exe %mine %theirs %merged」と指定すると、3ファイルのうち1つがマージ結果ファイルになる。
マージ結果ファイルを直接WinMergeでテキスト編集できる。
git status -s の1ファイル1行表示
「衝突・未ステージ状態」のファイルには、左に共通祖先..HEADの変更、右に共通祖先..MERGE_HEADの変更の記号が表示される。通常は「U:衝突」が2つ並んだ表示になるが削除されたファイルなどだと片方が「D:削除」になったりする。
「ステージ状態」「未ステージ状態」のファイルには、左にHEAD..ステージの変更、右にHEAD..作業コピーの変更が表示される。
■参考URL
Git - ブランチとマージの基本