別名やスクリプトを書く以外に、特定のコミットの差分を取得するための短いコマンドはありますか?
git diff 15dc8^..15dc8
単一のコミットIDをgit diff 15dc8
と指定しただけの場合は、そのコミットとHEADの差分がとられます。
git show $COMMIT
を使用してください。コミットのログメッセージとその特定のコミットの差分が表示されます。
つかいます:
git diff 15dc8^!
次の git-rev-parse(1) マンページ(または最近のgit gitrevisions(7) マンページ)に記載されているとおりです。
コミットとその親コミットによって形成されるセットに名前を付けるための2つの他の短縮形があります。 r1 ^ @表記は、r1のすべての親を意味します。 r1 ^!コミットr1を含みますが、その親をすべて除外します。
これは、15dc8^!
を、リビジョンが必要なgit内の任意の場所で、15dc8^..15dc8
の省略形として使用できることを意味します。 diffコマンドの場合、git diff 15dc8^..15dc8
はgit 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
を使用できます。
あなたがどれだけ遠くまで戻って知っているなら、あなたは以下のようなことを試みることができます:
# 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
詳細はこのページ を参照してください。
@mipadiが指摘するように、あなたはgit show $COMMIT
を使うことができます、しかしこれはまたいくつかのヘッダとコミットメッセージを表示します。ストレートな差分が欲しい場合はgit show --pretty=format:%b $COMMIT
を使用してください。
これは明らかに非常に簡潔な方法ではないので、私はこの別名を私の.gitconfigに入れています。
[alias]
sd = show --pretty=format:%b
これは私がgit sd $COMMIT
to show diffを使うことを可能にします。
上記の例の多く(例:git diff 15dc8^!
、git diff 15dc8^..15dc8
)は、zshを使用していてextendedglob
オプションが設定されている場合は機能しません。次の3つの方法のいずれかで修正できます。
unsetopt extendedglob
(および/または.zshrcから削除)
setopt NO_NOMATCH
(および/または.zshrcに設定)
キャレットを脱出し、毎回バックスラッシュで強打します。 git diff 15dc8\^\!
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
エイリアスを使用するので、あなたの質問に正確に答えないでください、しかし、私はあなたが意図することをするのにこれらが役に立つと思います...
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"