概要
ローカルのgitで実際にマージされる内容をdiff表示するコマンド(エイリアス)。
コマンド(エイリアス)
GitHubではトリプルドットdiffが使われるので、実際にマージされる内容と Files changed タブの表示内容が異なる問題は解決できない。
しかしローカルでgitに以下エイリアスを登録してコマンド実行することで、(作業コピーは更新せずに)実際にマージを実行してマージ前とマージ結果をdiffできる。これにより、実際にマージされる内容を表示することができる。
.gitconfig
[alias]
merge-diff = "!f() { git show $1 > /dev/null; git merge-tree HEAD $1; git diff HEAD `git merge-tree HEAD $1 | head -1`; }; f" # 最初のshowは、ブランチ名の補完が効くようにするため
merge-df = "!f() { git show $1 > /dev/null; git merge-tree HEAD $1; git difftool -d HEAD `git merge-tree HEAD $1 | head -1`; }; f" # 最初のshowは、ブランチ名の補完が効くようにするため
# 使い方
# 実際にマージされる内容を、コンソールにdiff表示する
git merge-diff 《マージ先ブランチ》
# 実際にマージされる内容を、ツールを使ってdiff表示する
git merge-df 《マージ先ブランチ》
説明
以下のような処理をすることで、実際にマージを実行して、マージ前とマージ結果をdiffすることができる。
それをエイリアスとして使いやすく登録したのが上の.gitconfig内容になる。
# staging領域や作業ツリーは更新せずにマージを実行して、マージ結果のgitオブジェクトを作成する
git merge-tree HEAD 《マージ先ブランチ》
# ここに《マージ結果のgitオブジェクトID》が表示される
# マージ前の内容とマージ結果の差分を表示する
git diff HEAD 《マージ結果のgitオブジェクトID》
git merge --dry-run はこれでいいのでは?
git merge --dry-run
というオプションは存在しない。
検索するとgit merge --no-ff --no-commit
を代わりに使えという記事がひっかかるが、ドライランで行いたいことは『マージで衝突が発生するかと、マージされる内容を、ブランチを更新せずに確認したい』というものだと思うので、--dry-run
でやりたいことは上記コマンドで実現できる気がする。