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
の対象とするのは a
と f
で差分があったファイルのみ)
終わり・・・としたいところですが、このままだと汎用的に使えないのでもうちょっとコマンドを一般的にしていきます。
コマンドの一般化
- コマンドがみやすいように 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
を指している)
-
- ここは単純に、rebase前とrebase後の変更点を出すための diff コマンドです。
-
--
以降の部分- 入力したファイル名のみを 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-dash
とf-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 したら知らない間にファイルが変わっていた!ということを防ぐことができる!(かもしれない!)