5
4

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 5 years have passed since last update.

GitAdvent Calendar 2013

Day 15

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

Last updated at Posted at 2013-12-14

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 したら知らない間にファイルが変わっていた!ということを防ぐことができる!(かもしれない!)

5
4
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
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?