Selain menulis alias atau skrip, apakah ada perintah yang lebih pendek untuk mendapatkan diff untuk komit tertentu?
git diff 15dc8^..15dc8
Jika Anda hanya memberikan satu komit git diff 15dc8
, itu berbeda dengan komit terhadap HEAD.
Selain menulis alias atau skrip, apakah ada perintah yang lebih pendek untuk mendapatkan diff untuk komit tertentu?
git diff 15dc8^..15dc8
Jika Anda hanya memberikan satu komit git diff 15dc8
, itu berbeda dengan komit terhadap HEAD.
Jawaban:
Gunakan git show $COMMIT
. Ini akan menunjukkan kepada Anda pesan log untuk komit, dan perbedaan komit tertentu.
Menggunakan:
git diff 15dc8^!
seperti yang dijelaskan dalam fragmen manpage git-rev-parse (1) berikut (atau dalam manpage git gvision (7) modern ):
Dua singkatan lainnya untuk penamaan set yang dibentuk oleh komit dan induknya ada. Notasi r1 ^ @ berarti semua orang tua dari r1. r1 ^! termasuk komit r1 tetapi mengecualikan semua orang tuanya.
Ini berarti Anda dapat menggunakan 15dc8^!
sebagai singkatan untuk 15dc8^..15dc8
di mana saja di git di mana revisi diperlukan. Untuk perintah diffgit diff 15dc8^..15dc8
dipahami sebagai git diff 15dc8^ 15dc8
, yang berarti perbedaan antara induk komit ( 15dc8^
) dan komit ( 15dc8
).
Catatan : deskripsi dalam git-rev-parse(1)
pembicaraan manual tentang rentang revisi , di mana ia perlu bekerja juga untuk komitmen gabungan, dengan lebih dari satu orangtua. Maka r1^!
" r1 --not r1^@
" yaitu " r1 ^r1^1 ^r1^2 ...
"
Anda juga dapat menggunakan git show COMMIT
untuk mendapatkan deskripsi komit dan diff untuk komit. Jika Anda hanya menginginkan diff, Anda dapat menggunakannyagit diff-tree -p COMMIT
^!
notasi tua singkatan bekerja dengan baik dengan difftool untuk komit normal tetapi diff dibalik untuk komit merge. Kenapa begitu?
Jika Anda tahu seberapa jauh ke belakang, Anda dapat mencoba sesuatu seperti:
# Current branch vs. parent
git diff HEAD^ HEAD
# Current branch, diff between commits 2 and 3 times back
git diff HEAD~3 HEAD~2
Komit sebelumnya berfungsi seperti ini:
# Parent of HEAD
git show HEAD^1
# Grandparent
git show HEAD^2
Ada banyak cara untuk menentukan komit:
# Great grandparent
git show HEAD~3
Lihat halaman ini untuk detailnya .
Seperti @mipadi tunjukkan, Anda dapat menggunakan git show $COMMIT
, tetapi ini juga menunjukkan beberapa tajuk dan pesan komit. Jika Anda ingin perbedaan lurus, gunakan git show --pretty=format:%b $COMMIT
.
Ini jelas bukan tugas yang singkat, jadi saya menyimpan alias ini di .gitconfig saya
[alias]
sd = show --pretty=format:%b
Ini memungkinkan saya untuk menggunakan git sd $COMMIT
untuk menampilkan diff .
Banyak contoh yang disebutkan (misalnya git diff 15dc8^!
, atau git diff 15dc8^..15dc8
) tidak berfungsi jika Anda menggunakan zsh dan memiliki extendedglob
set opsi. Anda dapat memperbaikinya dengan salah satu dari tiga cara berikut:
unsetopt extendedglob
(dan / atau hapus dari .zshrc)
setopt NO_NOMATCH
(dan / atau atur dalam .zshrc)
melarikan diri dari caret dan bang setiap kali dengan backslash, mis git diff 15dc8\^\!
git diff 15dc8 15dce~1
~ 1 berarti 'orangtua', ~ 2 'kakek-nenek, dll.
Solusi Paul di atas melakukan apa yang saya harapkan.
$ git diff HEAD^1
Juga, berguna untuk menambahkan alias seperti hobs yang disebutkan, jika Anda meletakkan yang berikut di bagian [alias] file ~ / .gitconfig Anda, maka Anda dapat menggunakan tangan-pendek untuk melihat perbedaan antara head dan sebelumnya.
[alias]
diff-last = diff HEAD^1
Kemudian menjalankan $ git diff-last akan memberi Anda hasil. Perhatikan bahwa ini juga akan mencakup setiap perubahan yang belum Anda lakukan serta perbedaan antar komitmen. Jika Anda ingin mengabaikan perubahan yang belum Anda lakukan, maka Anda dapat menggunakan diff untuk membandingkan KEPALA dengan induknya secara langsung:
$ git diff HEAD^1 HEAD
Menggunakan alias, jadi tidak menjawab pertanyaan Anda dengan tepat, tetapi saya menemukan ini berguna untuk melakukan apa yang Anda inginkan ...
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"