web-dev-qa-db-ja.com

親とコミットをどのように比較するのですか

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

git diff 15dc8^..15dc8

単一のコミットIDをgit diff 15dc8と指定しただけの場合は、そのコミットとHEADの差分がとられます。

437
Brian L

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

609
mipadi

つかいます:

git diff 15dc8^!

次の git-rev-parse(1) マンページ(または最近のgit gitrevisions(7) マンページ)に記載されているとおりです。

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

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

git-rev-parse(1)のマンページの説明はリビジョンの範囲についての説明です、マージコミットに対しても動作する必要があり、複数の親を持つ場合。 r1^!は "r1 --not r1^@"、すなわち "r1 ^r1^1 ^r1^2 ..."です。


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

419
Jakub Narębski

あなたがどれだけ遠くまで戻って知っているなら、あなたは以下のようなことを試みることができます:

# 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

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

53

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

これは明らかに非常に簡潔な方法ではないので、私はこの別名を私の.gitconfigに入れています。

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

これは私がgit sd $COMMITto show diffを使うことを可能にします。

10

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

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

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

  3. キャレットを脱出し、毎回バックスラッシュで強打します。 git diff 15dc8\^\!

5
Ville
git diff 15dc8 15dce~1

〜1は「親」、〜2は「祖父母」などを意味します。

上記のPaulの解決策は、私が望んでいたことでした。

$ git diff HEAD^1

また、あなたが〜/ .gitconfigファイルの[alias]セクションに次のように書いているなら、hobsのようなエイリアスを追加するのが便利です。そうすれば、headとpreviousの差分を短く見ることができます。

[alias]
    diff-last = diff HEAD^1

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

$ git diff HEAD^1 HEAD
2

エイリアスを使用するので、あなたの質問に正確に答えないでください、しかし、私はあなたが意図することをするのにこれらが役に立つと思います...

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"
0
hobs