コミットをその親と比較する方法は?


460

エイリアスやスクリプトを作成する以外に、特定のコミットの差分を取得するための短いコマンドはありますか?

git diff 15dc8^..15dc8

単一のコミットIDのみを指定した場合git diff 15dc8、そのコミットはHEADと比較されます。


これについての最もクールなことは、これが「git difftool」で動作し、ツールを使用して差分を表示することです。
oripは2010

:参考までに、この他の質問への答えは、上記簡素化するためのbash-パワードエイリアスを設定することができる方法を示しstackoverflow.com/questions/3321492/...
ニック・

回答:


641

を使用しgit show $COMMITます。コミットのログメッセージと、その特定のコミットの差分が表示されます。


45
残念ながら、difftool :(
orip

1
@orip GIT_EXTERNAL_DIFFは、difftoolと同じことを行うスクリプトにいつでも設定できます。
レイシー

7
:そこに与えられた式は、多くの状況で動作しますコミットように私は、JakubNarebskiの答えを好むstackoverflow.com/a/449128/992887
RichVel

1
差分が表示されない場合、マージコミットのように実際の変更はおそらくありません
Devin G Rhode

6
@PTWithy:「特定のコミットのdiffを取得するためのより短いコマンドはありますか?」という質問でした。
mipadi 14年

439

使用する:

git diff 15dc8^!

次のgit-rev-parse(1)マンページ(または最新のgit gitrevisions(7)マンページ)で説明されているように:

コミットとその親コミットによって形成されるセットに名前を付けるための他の2つの省略形が存在します。r1 ^ @表記は、r1のすべての親を意味します。r1 ^!コミットr1を含みますが、そのすべての親を除外します。

これは、リビジョンが必要なgitの任意の場所の15dc8^!省略形として使用できることを意味します15dc8^..15dc8diffコマンドの場合、はとgit diff 15dc8^..15dc8理解されますgit diff 15dc8^ 15dc8。つまり、commit(15dc8^)の親とcommit()の違いを意味し15dc8ます。

git-rev-parse(1)マンページの説明で、リビジョン範囲について説明しており、複数の親を持つマージコミットでも機能する必要があります。次にr1^!r1 --not r1^@」すなわち「r1 ^r1^1 ^r1^2 ...


また、を使用git show COMMITして、コミットの説明とコミットの差分を取得することもできます。差分だけが必要な場合は、git diff-tree -p COMMIT


7
これは受け入れられる答えであるはずです、それはずっとすっきりしています。ただし、git-rev-parse抽出の最後の文はやや混乱しています。「このコミットの親からこのコミットまでの範囲」を意味するようです。
RichVel 2013

1
@RichVel:コミットが複数の親を持っている状況(マージコミット)についても説明しようとするため、少し混乱します。r1 ^!その後も期待どおりに動作します。
JakubNarębski2013

@JakubNarębski:良い点です。おそらく、回答を編集して、単一親と複数親のケースについての理解をまとめることができます。それぞれについて個別のステートメントを理解する方が簡単かもしれません。
RichVel 2013

1
@JakubNarębski:はい、はるかに良いです!今はいつもこのショートカットを使っています-ありがとう。
RichVel 2013

1
^!親簡略表記は、通常のコミットのためdifftoolで正常に動作しますが、差分をマージコミットのために逆転されます。なんでそうなの?
hIpPy 2017

56

どれだけ前に戻ったかわかっている場合は、次のようなことを試すことができます。

# Current branch vs. parent
git diff HEAD^ HEAD

# Current branch, diff between commits 2 and 3 times back
git diff HEAD~3 HEAD~2

以前のコミットは次のように機能します:

# Parent of HEAD
git show HEAD^1

# Grandparent
git show HEAD^2

コミットを指定する方法はたくさんあります。

# Great grandparent
git show HEAD~3

詳細については、このページを参照してください


2
HEAD ^ 2は祖父母ではありません。HEAD^ 1がパパの場合、HEAD ^ 2はマミーです。パパのパパにはHEAD〜2を使用してください。
Binarian 2017

11

@mipadiが指摘するように、を使用できますgit show $COMMITが、これにはいくつかのヘッダーとコミットメッセージも表示されます。ストレートな差分が必要な場合は、を使用しますgit show --pretty=format:%b $COMMIT

これは明らかに短い手ではないので、このエイリアスを.gitconfigに保存します

    [alias]
      sd = show --pretty=format:%b

これにより、を使用git sd $COMMITしてdiff表示できます。


1
このエイリアスには--colorを含めることができ、読みやすくなります。sd = show --color --pretty = format:%b
RichVel

@RichVel確かに!非常に良い点です。gitのデフォルトで色が有効になっている場合は、このスイッチは必要ありません。それは私が通常行うことです。
ØysteinSteimler

5

上記の例の多く(git diff 15dc8^!や、などgit diff 15dc8^..15dc8)は、zshを使用していてextendedglobオプションを設定している場合は機能しません。次の3つの方法のいずれかで修正できます。

  1. unsetopt extendedglob (および/または.zshrcから削除)

  2. setopt NO_NOMATCH (および/または.zshrcに設定)

  3. キャレットをエスケープし、バックスラッシュで毎回強打する、例えば git diff 15dc8\^\!



2

上記のポールの解決策は、私が望んでいたことを実行しました。

$ git diff HEAD^1

また、前述のホブのようなエイリアスを追加すると便利です。以下を〜/ .gitconfigファイルの[alias]セクションに配置すると、省略形を使用して、headとpreviousの差分を表示できます。

[alias]
    diff-last = diff HEAD^1

次に$ git diff-lastを実行すると、結果が得られます。これにはまだコミットしていない変更やコミット間の差分も含まれることに注意してください。まだコミットしていない変更を無視したい場合は、diffを使用してHEADをその親と直接比較できます。

$ git diff HEAD^1 HEAD

0

エイリアスを使用しているため、質問に正確に答えることはできませんが、意図したことを行うのに役立つと思います...

alias gitdiff-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"

alias gitlog-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.