最後の変更に対するgit diffファイル


236

現在存在している特定のファイルと、それを変更した最後のコミットの前に存在していた特定のファイルとの間にgitに差分を生成させることは可能ですか?

つまり、私たちが知っている場合:

$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit

次にgit diff 456def myfile、myfileに対する最後の変更を表示します。によって生成された知識がなくても同じことを行うことは可能git logです。123abcの変更点


8
私は使用を好むgit diff HEAD^ <file_path>
asgs

4
@asgs - DOESは、私が( -二つの理由を求めていたものをしないHEAD^123abcHEAD^^あり456def;そして他のコミットがあった場合は、このファイルには影響しなかった後、HEAD^それらを参照)
Chowlett

あなたは正しい、「それを変更した最後のコミット」の部分を
見逃しました

回答:


215

これは存在しますが、実際には次の機能ですgit log

git log -p [--follow] [-1] <path>

-p単一のコミットからのインライン差分を表示するためにも使用できることに注意してください:

git log -p -1 <commit>

使用されるオプション:

  • -p-uまたはまたは--patch)はgit-logmanページでdeeeeeeeepに隠されており、実際にはの表示オプションですgit-diff。とともに使用するとlogコミットごとに生成されるパッチとコミット情報が表示され、指定されたに関係のないコミットは非表示になります<path>。(この動作はの段落で説明されており--full-diff、各コミットの完全な差分が表示されます。)
  • -1ショーだけに最新の変更、指定したファイル-n 1の代わりに使用することができます-1)。それ以外の場合は、そのファイルのゼロ以外のすべての差分が表示されます。
  • --follow 名前の変更前に発生した変更を確認するために必要です。

私が知る限り、これは、git log介在するリビジョンの数をカウントしたり、コミットのハッシュを決定したりすることなく(または類似の方法で)、ファイルに加えられた最後の変更セットを即座に確認する唯一の方法です。

古いリビジョンの変更を確認するには、ログをスクロールするか、ログを開始するコミットまたはタグを指定します。(もちろん、コミットまたはタグを指定すると、正しいコミットまたはタグが何かを理解するという元の問題に戻ります。)

クレジットの期日があるクレジット:

  • 私はこの答えのlog -pおかげで発見しました。
  • FranciscoPugaへのクレジットと、オプションを表示してくれたこの回答--follow
  • -n 1オプションについて言及したChrisBetti、およびバリアントについて言及したatatkoの功績です-1
  • sweaver2112の功績により、実際にドキュメントを読み、-p意味的に「意味」を理解してもらいました。

6
これは私にとって素晴らしい解決策でした。私が実行したときに、各コミットと現在のファイルとの違いを示しましたgit log -p filename
Ian Jamieson 2014年

4
完璧です。最後の変更だけを確認するには、-n 1パラメーターを追加するだけです。git log -p -n 1 filename
Chris Betti

@ChrisBettiありがとう。私はそれを私の答えに組み込んだ!
カイルストランド

1
-n 1また、置き換えることができ-1、それは結果を変更しません。私はただの構文を好む:git log -p -1 filename
atatko

1
便利なオプション「--skip = [n]」があります。入力git log -p -1 --skip=1 <path>して2番目のコミットを表示できます。
MaciekŁoziński2017年

220

git diffを使用する方法の1つは次のとおりです。

git diff <commit> <path>

そして、最後のコミットの1つのコミットを参照する一般的な方法は、実際のHEADへの相対パスとしてです。以前のコミットをHEAD ^(例では123abc)またはHEAD ^^(例では456def)などとして参照できます。

だからあなたの質問への答えは:

git diff HEAD^^ myfile

6
もちろんです。試してみましたHEAD^が、もちろん何も起こりませんでした。しようとは思わなかったHEAD^^
Chowlett 2012

17
以前のコミットの構文がたぶん簡単になる:HEAD~2
ibizaman

19
HEAD^^ myfile変更された最後から2番目のコミットを実際に参照することは(少なくともGit 1.9.0では)真実ではありませんmyfile。最後から2番目のコミット全体を指します。コミットハッシュ(の一部)を指定したり、そのファイルに行われた最後の変更と現在のリビジョンとの間のコミット数をカウントしたりせずに、「このファイルに行われた最後の変更を確認したい」と指定する方法はありますか?
カイルストランド

3
うーん、git log -pかなり近いみたいです。
カイルストランド

30
反対投票の理由:「現在存在する特定のファイル間、およびファイルを変更した最後のコミットの前に存在していたファイル間」という質問ですが、最後の全体的なコミットでファイルが変更されていない場合、この回答は機能しません。
Chris Betti、2015年

8

グラフィカルツールを使用している場合、これは非常にうまく機能します。

gitk <file>

gitkはファイルが更新されたすべてのコミットを表示するようになりました。コミットをマークすると、リスト内の前のコミットとの差分が表示されます。これはディレクトリでも機能しますが、選択したコミットの差分を取るファイルを選択することもできます。超便利!


1
また、非常に便利です。git difftool HEAD^ fileまたはgit difftool -d HEAD^ path
ForeverLearning
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.