Git
GitDay 15

rebase 直後に、自分が修正していたファイルが変更されたかどうかを調べる

More than 5 years have passed since last update.

rebase 直後に、自分が修正していたファイルが変更されたかどうかを調べる

a - b - c
 \ d - e - f

みたいな状態から,f上で、

git rebase c

して、

a - b - c - d' - e' -f'

になるように rebase したときに、

d,e,f で修正していたファイルが a,b,c で変更されていないかを調べる


git diff f f' -- $(git diff --name-only a f)

(f(rebase前) と f'(rebase後) の差分を出す。ただし、diff の対象とするのは af で差分があったファイルのみ)

終わり・・・としたいところですが、このままだと汎用的に使えないのでもうちょっとコマンドを一般的にしていきます。

コマンドの一般化

  • コマンドがみやすいように f' を 指しているブランチが f-dash というブランチ名だとします

git diff f-dash@{1} f-dash -- $(git diff --name-only $(git merge-base f-dash@{1} f-dash) f-dash@{1})

簡単な説明

  • git diff f-dash@{1} f-dash の部分
    • ここは単純に、rebase前とrebase後の変更点を出すための diff コマンドです。
      • f-dash@{1} の部分は、 f-dash ブランチが一つ前に指していたコミットです。(今回の場合は f を指している)
  • -- 以降の部分
    • 入力したファイル名のみを diff の対象とする
  • $(git diff --name-only $(git merge-base f-dash@{1} f-dash) f-dash@{1}) の部分
    • d, e, f で変更されたファイル名の一覧を出力するコマンドです。
    • $(git merge-base f-dash@{1} f-dash) の部分
      • f-dashf-dash@{1} の共通の祖先のコミット(今回の場合は a )を出力するためのコマンドです。

これを踏まえて今回の場合で同等のコマンドで書き換えると

git diff f-dash@{1} f-dash -- $(git diff --name-only $(git merge-base f-dash@{1} f-dash) f-dash@{1})となる
あとはこれを独自コマンドにするなりなんなりすればOK!

注意点

--onto や -i を利用したrebaseに対しては使えない

まとめ

これで rebase したら知らない間にファイルが変わっていた!ということを防ぐことができる!(かもしれない!)