Gitで1つのファイルを任意のバージョンに比較する方法は?


324

たとえばpom.xml、ファイルをmasterブランチからGitの任意の古いバージョンに比較するにはどうすればよいですか?

回答:


347

できるよ:

git diff master~20:pom.xml pom.xml

...現在の20リビジョン前のpom.xmlものからmaster最初の親までのものを比較します。master~20もちろん、をコミットのオブジェクト名(SHA1sum)またはリビジョンを指定する他多くの方法で置き換えることができます

これは実際には、古いpom.xmlバージョンと作業ツリーのバージョンを比較するものであり、でコミットされたバージョンではありませんmaster。それが必要な場合は、代わりに以下を実行できます。

git diff master~20:pom.xml master:pom.xml

12
これはファイルだけでなく、(サブ)ディレクトリなどでも機能することに注意してくださいgit diff <revision>:foo/ HEAD:foo/

2
また、Windowsでは、リビジョン指定子を使用している場合はディレクトリにスラッシュを使用する必要があることに注意してください。そうでない場合、gitはそのリビジョンに存在しないファイル/ディレクトリに関するエラーを表示します。
ディランニスリー2014年

1
@DylanNissleyまたはそれはあなたにエラーと差分を与えません。それは私が見るものです。いずれにしても、バックスラッシュの代わりにスラッシュを使用することについてのヒントをありがとう。
Gary S.

Windowsファイルで、私は、変更ディレクトリに簡単にそれを見つけたし、その後のgitのdiffマスターが〜20呼び出し:./のpom.xml ./pom.xml
ロイド

gitの一部のバージョンでは、<revision>と<path>の間に「-」が必要です
Josh

140
git diff <revision> <path>

例えば:

git diff b0d14a4 foobar.txt

ファイルが現在のディレクトリにない場合、バージョン1.7.11では機能しません。例: 'git diff f76d078 test / Config'は「エラー: 'test / f76d078'にアクセスできませんでした」
simpleuser

1
@ user1663987は、プロジェクトルートからの相対パスを渡すだけですgit diff <revision> root/path/file

1
test / Config ルートを基準にしています(testはルートのサブディレクトリです)。しかし、あなたの例のルート/パス/ファイルはルートを含むようですか?
simpleuser 2014年

41

単一のファイルの最後のコミットの違いを見たい場合は、次のようにすることができます:

git log -p -1 filename

これはgit内のファイルの差分を提供しますが、ローカルファイルを比較しません。


2
これは何も返しません
Andrei Cristian Prodan 2014年

@AndreiCristianProdan次に、変更はありません。-1変更を取得するまで、段階的に増分できます。
カイザー2014年

これはすごく素敵。私は役に立つかもしれないbashの関数を作成しました。 gitlog () { git log -${3:-p} -${2:-1} $1; } 同じように使用:gitlog Rakefilegitlog Rakefile 5gitlog Rakefile 10 s。最初は1つの差分を示しています。2番目は5つの差分を示しています。3番目は10を示します--no-patch
auxbus

18

最後のコミットでファイルの変更内容を確認するには:

git diff HEAD~1 path/to/file.

番号(〜1)を、比較するn番目のコミットに変更できます。


この答えは、実際のちょうど特定のケースである。このより一般的な答えHEAD~1置換される<revision>この回答複製を作り、。

1
これは機能していません!fatal:あいまいな引数 'HEAD〜1':作業ツリーにない不明なリビジョンまたはパス。パスをリビジョンから分離するには、「-」を使用します
Andrei Cristian Prodan

この答えはシンプルで機能的です。
Douglas Frari、

6

一般的な構文:

$git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt

リポジトリ内の任意の場所にある「FileName.xml」という名前のすべてのファイル。

「-」と「**」の間のスペースに注意してください

あなたの質問に対する答え:

$git checkout master
$git diff oldCommit..HEAD -- **pom.xml 
or
$git diff oldCommit..HEAD -- relative/path/to/pom.xml 

いつものようにgitと同様に、tag / sha1 / "HEAD ^"を使用してコミットを識別できます。

Ubuntuのgit 1.9.1でテスト済み。


6

どちらのコミットもHEADでない場合、特にファイル名が長い場合、上記の例のように、bashのブレース展開は本当に便利です。

git diff master~20:pom.xml master:pom.xml

なるだろう

git diff {master~20,master}:pom.xml

bashを使用したブレース拡張の詳細。


6

5つのコミットと現在のコミットを比較するには、両方でmaster、単に次のようにします:

git diff master~5:pom.xml master:pom.xml

また、コミットハッシュ番号を参照することもできます。たとえば、ハッシュ番号がの場合、x110bd64次のようにして違いを確認できます。

git diff x110bd64 pom.xml



2

グラフィカルツールを使用している場合(またはそれを好む場合)、次のことができます。

gitk pom.xml

次に、gitkで任意のコミットをクリック(「選択」)し、他のコミットを右クリックして、優先順位に応じてポップアップメニューで[Diff this-> selected]または[Diff selected-> this]を選択します。




-1

特定のコミットでdiffを探していて、コマンドラインの代わりにgithub UIを使用したい場合(他の人にリンクしたい場合など)、次のことができます。

https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>

例えば:

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

右上の[前へ]および[次へ]リンクに注目してください。これにより、コミット内のすべてのファイルをナビゲートできます。

ただし、これは特定のコミットでのみ機能し、任意の2つのバージョン間の比較では機能しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.