19

最後のコミット以降にファイルに対して何が変更されたかを簡単に見つけることができますが、それ以降のコミットの数に関係なく、特定のファイルが最後にコミットされてgit diff HEAD^ -- <filename>からの差分を表示する同等の省略形はありますか? または、その特定のファイルの N コミットに戻るには?

コンテキスト:ファイルにエラーが見つかったので、いつ侵入したかを追跡したいと思います。特定のファイルのログ レポートを取得して、git log -<n> <filename>そのファイルへの変更を含むコミットのみを表示するのは簡単です。明らかに、そのレポートからSHAをコピーして貼り付けることlogができますが、本当に欲しいのは、git diff ^ -- <filename>またはのようなことをできるようにすることですgit diff ~2 -- <filename>.

4

3 に答える 3

43
$ git log -p <filename>

指定されたファイルに触れた各コミットのログメッセージと差分が表示されます。

以前のバージョンとの違いのみを表示するには、ログ履歴で 1 つのステップだけを要求します。

$ git log -1 -p <filename>
于 2013-01-22T21:09:12.910 に答える
4

フォーマットを利用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 の間の差分が表示されるため、望ましくない可能性があります。

于 2014-06-26T23:25:01.050 に答える
1

git blameかなり速く目的地に到着するはずです。

于 2013-01-22T21:50:14.887 に答える