説明
単純に「カレントブランチにおいてfetch merge、または pull する時に競合するかどうか」を「作業フォルダを一切触らず」に確認する方法と、応答別状況説明・及び対処法をメモ
無秩序なgit環境でとりあえず状況確認に実行してみる用途向けです。
応答をケース別に分けて説明しているので、mergeで何をしているかの理解も深めることができると思います。(多分)
本来マージして競合があればその場で解決&検証するのが順当ですが
作業フォルダが変更されるのは困る・・という場合(あるのか?)や、利用できます。
間違いがあればご指摘コメントお願いします・・
手法
まずはフェッチ
$ git fetch
完了後以下のコマンドで確認
$ git diff HEAD...origin/【ブランチ名】 | git apply -3 --check
【ブランチ名】には所定のブランチ名を指定してください。
応答と確認方法
実行結果の応答別に紹介
Case 1 マージ無し
$ error: unrecognized input
の場合は「適用する差分がない」
エラーに見えますが、前半のコマンドの結果、「空(差分無し)」だったので後半のコマンドで消化不良になっているだけです。
Case 2 正常にマージ可能
(無反応)
$
応答なしの場合は「マージ物はあるが、作業ファイルとの被りは無い」状態、マージしても競合しないはず。
Case 3 マージ物と未コミットの作業ファイルが被っている
$ path/to/file: does not match index
path/to/fileは対象のファイルへのパスです。
上記の場合は、「適用差分がコミットされてないのでローカルリポジトリにコミットしてください」
自動(3way)マージするにはローカルリポジトリへのコミットが必要です。
Case 4 マージ物とローカルリポジトリの変更が被っているけど正常にマージされました
error: patch failed: path/to/file:line
Falling back to three-way merge...
Applied patch to 'path/to/file' cleanly.
の場合は「マージ物とリポジトリの変更が被っているけど自動(3way)マージし、正常にマージされました」
この場合は「git merge」の実行中に機械的なマージで解決され、手作業による競合解決は必要ない状態です。
Case 5 マージ物とローカルリポジトリの変更が被り、自動マージしてみたがダメだった
error: patch failed: path/to/file:line
Falling back to three-way merge...
Applied patch to 'path/to/file' with conflicts.
の場合は「マージ物とリポジトリの変更が被っているので自動マージし、結果競合しました」
の場合は確実に競合です。手作業による競合解決が必要です。
結局見るべき応答は?
とりあえず、見るべきは以下の点。
- 「Case 3 コミットしてね」→ 作業中のブツをローカルリポジトリにコミットしましょう。
- 「Case 5 自動マージ失敗」→ 先方の変更点を先に適用して、再チェック。
(※ 空白も併せて確実にしないと解消されません)
リモートの変化を知りたければ前半のコマンドを実行すると良いでしょう。
git diff HEAD...origin/【ブランチ名】
解説
何しているか不安な方はこちらを確認
前半の
git diff HEAD...origin/【ブランチ名】
で比較します。「HEAD...」とドットを三つにすることにより、「リモートリポジトリとローカルリポジトリの分岐点」と「リモート」の比較になります。
このコマンド単体を実行することにより、リモートの変化が確認できます。
標準出力されたデータはそのままパッチとして利用できるので次のコマンドにパイプ(|
)で渡します。
git apply -3 --check
パッチを当てるふりをしてチェックしています。ここでエラーが出るかを確認しています。
base mine theirs の3wayマージで、自動マージも確認できます。