フォーマットを利用git log
して、ファイルへの以前のコミットのハッシュを取得できます。例えば、
git log --pretty=format:'%h' -1 --skip=1 <filename>
特定のファイルに触れるために最後から2番目のコミットを取得します。実際、ファイル名を指定しないと、リポジトリ全体で最後から 2 番目のコミットが取得されます。古いハッシュを取得するには、次のように、シェル関数を呼び出す git エイリアスを設定できます。
[alias]
prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph"
これを使用するには、次のようgit prior-hash n <filename>
に入力します。ここで、n はファイルの (n+1) 番目の最新バージョンです。したがって、1 はファイルへの最後から 2 番目のコミット、2 は最後から 3 番目のコミット、0 はそのファイルへの最新のコミットになります。繰り返しますが、リポジトリ全体を調べたい場合は、ファイル名はオプションです。
そこから diff コマンドを作成する方法を理解できると確信しています。
[alias]
prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph"
diff-prev-easy = "!dp() { git diff $(git prior-hash $1 $2).. $2; }; dp"
これは、以前のハッシュ エイリアスと同様に使用されgit diff-prev-easy n <filename>
ます。これは、(n+1) 番目の最後のリビジョンをファイルの最新のリビジョンと比較します。代わりに (n+1) 番目の最後のリビジョンを n 番目の最後のリビジョンと比較したい場合、それは簡単な変更です:
[alias]
prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph"
diff-prev = "!dp() { git diff $(git prior-hash $1 $2)..$(git prior-hash $(($1 - 1)) $2) $2; }; dp"
これも同じように使用されます。git diff-prev n <filename>
ただし、注意が必要な潜在的な問題の 1 つは、git log
コミットが時系列順にリストされることです。この歴史を考えてみましょう:
1 - 2 - - - 4 - 5 master
\ /
3 - - develop
git diff-prev 1
このコマンドは、予想どおり、コミット 4 と 5 の間の差分を生成します。ただしgit diff-prev 2
、コミット 3 と 4 の間の差分が表示されるため、望ましくない可能性があります。