2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

git merge で衝突(コンフリクト)したときの状態まとめ

Last updated at Posted at 2022-07-07

■概要

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 - ブランチとマージの基本

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?