git:プル後に変更されたファイルを以前のバージョンと比較する方法は?


117

「git pull」を実行すると、ファイルの最新バージョンと新しいバージョンの間で何が変わったのかを知りたいことがよくあります。他の誰かが特定のファイルにコミットした内容を知りたいとしましょう。

それはどのように行われますか?

私はそれがコミットxとコミットyのいくつかのパラメーターを持つ「git diff」であると想定していますが、構文を取得できないようです。また、 "git log"が少し混乱しているので、最新バージョンのファイルと新しいバージョンのファイルのコミットIDをどこで取得するかわかりません。


1
あなたはあなたの好みに合わせてgitkグラフィカルツールを見つけるかもしれません。
crazyscot 2010年

stackoverflow.com/questions/61002/…これに似ているかもしれません
VonC 2010年

回答:


158

コミットを指定するには、さまざまな種類の素晴らしい方法があります。詳細については、リビジョン指定のセクションをman git-rev-parse参照してください。この場合、おそらく以下が必要です。

git diff HEAD@{1}

@{1}そのための手段「私が指定したREFの前の位置」、あなたは以前にチェックアウトしていたものと評価された-ちょうどプルの前に。あなたはタックすることができますHEADまた、あなたの作業ツリー内のいくつかの変更があり、彼らのために差分を表示したくない場合が最後に。

「ファイルの最新バージョンのコミットID」で何を求めているのかわかりません-コミット「ID」(SHA1ハッシュ)は、出力のすべてのエントリの上部にある40文字の16進数です。 git logの。これは、特定のファイルではなく、コミット全体のハッシュです。実際にはこれ以上必要ありません-プル全体で1つのファイルだけを比較したい場合は、

git diff HEAD@{1} filename

これは一般的なことです。特定のコミットでのファイルの状態を知りたい場合は、ファイルに固有のID /ハッシュではなく、コミットとファイルを指定します。


VonCのリンクされた以前の投稿は本質的にこれと同じことを言っていますが、説明は少し異なるので、今はこれを残しておきます。(これは@{1}の短縮形としても使用されますHEAD@{1}
Cascabel

本当ですが、私も説明が好きです。+1
VonC 2010年

これはまさに私が探していたものです。説明ありがとうございます。
lucapette

私がググリングしていたものの+1。これが答えとして選択され、トップにぶつかったら素晴らしいでしょう... :)
longda

@longda(私がデフォルトだと思っていた)投票で並べ替えている場合は、すでに一番上にあるはずです。
Cascabel 2013年

57

私は使いたい:

git diff HEAD^

または、特定のファイルのみを比較したい場合:

git diff HEAD^ -- /foo/bar/baz.txt

5
-1:HEAD^親のコミットであり、以前のコミットではありませんpull
CharlesB 2012

1
HEADがマージコミットの場合、HEAD^は最初の親コミットなので、はい、それはの前のコミットでもかまいませんpull。他の親を取得するには(双方向マージの場合)、を使用しますHEAD^2。しかし、その場合、上記の回答は、そもそも質問に対する回答ではないため、-1を残します;-)
Michael Wild

説明をありがとう。私は他のことを探していて、このリンクが結果ページの上位に表示されたため、質問をあまり注意深く読みませんでした。私は新しいユーザーであり、カルマがない(それがSOで呼び出されている場合)ので、私はチャイムを鳴らしたいと思いました。私の過ち=)
cadizm '23

3
@MichaelWildそれは質問者が求めていたものではないかもしれませんが、これを見つけたときに私が探していたものでした。役に立ちました。賛成票。
John Dvorak 14年

これはTortoiseGitの「以前のバージョンとの差分」が行うことです。そして私が探していたものです。
Fabien Haddadi、2018年

15

ストレートを行うと、git pull「早送り」されるか、リモートリポジトリから不明な数のコミットがマージされます。ただし、これは1つのアクションとして発生するため、プルの直前に行った最後のコミットがreflogの最後のエントリになり、としてアクセスできますHEAD@{1}。これはあなたができることを意味します:

git diff HEAD@{1}

ただし、これが自分でよくやっていることである場合はgit fetch、手動でマージまたはリベースする前に、を実行してフェッチしたブランチを調べることを検討することを強くお勧めします。たとえば、マスターを使用していて、オリジン/マスターをプルインする場合:

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master

ここでのgit log代わりの使用git diff(構文が「..」git logと「...」の間で少し矛盾している場合でもgit diff)+1を参照してください。stackoverflow.com / questions
VonC 2010年

幸い、git diffコマンドで「..」構文を使用すると、gitは「正しいことを行います」。
CBベイリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.