Hal paling keren tentang ini adalah bahwa ini akan bekerja dengan "git difftool", menggunakan alat untuk menampilkan diff.
orip
Untuk referensi, jawaban untuk pertanyaan lain ini mengilustrasikan bagaimana Anda dapat membuat alias bash-powered untuk menyederhanakan di atas: stackoverflow.com/questions/3321492/…
Nick
Jawaban:
641
Gunakan git show $COMMIT. Ini akan menunjukkan kepada Anda pesan log untuk komit, dan perbedaan komit tertentu.
@orip Anda selalu dapat mengatur GIT_EXTERNAL_DIFF ke skrip yang melakukan hal yang sama dengan difftool Anda.
slacy
7
Saya lebih suka jawaban JakubNarebski, karena ekspresi komit yang diberikan di sana akan berfungsi dalam banyak konteks: stackoverflow.com/a/449128/992887
RichVel
1
Jika tidak ada perbedaan yang ditampilkan, mungkin tidak ada perubahan aktual, seperti untuk komit gabungan
Devin G Rhode
6
@ PTWithy: Pertanyaannya adalah, "Apakah ada perintah yang lebih pendek untuk mendapatkan diff untuk komit tertentu?", Yang dijawab pertanyaan ini.
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^..15dc8di 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 COMMITuntuk mendapatkan deskripsi komit dan diff untuk komit. Jika Anda hanya menginginkan diff, Anda dapat menggunakannyagit diff-tree -p COMMIT
Ini harus menjadi jawaban yang diterima, jauh lebih rapi. Namun, kalimat terakhir dari ekstrak git-rev-parse agak membingungkan - sepertinya itu berarti 'mulai dari induk commit ini hingga commit ini'.
RichVel
1
@RichVel: ini agak membingungkan karena mencoba menjelaskan juga situasi di mana komit memiliki lebih dari satu orangtua (adalah komit gabungan). r1 ^! bekerja seperti yang diharapkan juga.
Jakub Narębski
@ JakubNarębski: poin bagus, mungkin Anda bisa mengedit jawaban Anda untuk merangkum pemahaman Anda tentang kasus orang tua tunggal dan multi-orang tua - pernyataan terpisah pada masing-masing mungkin lebih mudah untuk dipahami.
RichVel
1
@ JakubNarębski: ya, jauh lebih baik! Saya sekarang menggunakan pintasan ini sepanjang waktu - terima kasih.
RichVel
1
The ^!notasi tua singkatan bekerja dengan baik dengan difftool untuk komit normal tetapi diff dibalik untuk komit merge. Kenapa begitu?
hIpPy
56
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
KEPALA ^ 2 bukan kakek-nenek, jika KEPALA ^ 1 adalah ayah, maka KEPALA ^ 2 adalah ibu. Gunakan HEAD ~ 2 untuk ayah ayah.
Binarian
11
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 $COMMITuntuk menampilkan diff .
Alias ini dapat menyertakan --color yang membuatnya lebih mudah dibaca: sd = show --color --pretty = format:% b
RichVel
@RichVel Memang! Poin yang sangat bagus. Jika Anda memiliki warna yang diaktifkan secara default di git, Anda tidak perlu beralih ini. Itu yang biasanya saya lakukan.
Øystein Steimler
5
Banyak contoh yang disebutkan (misalnya git diff 15dc8^!, atau git diff 15dc8^..15dc8) tidak berfungsi jika Anda menggunakan zsh dan memiliki extendedglobset 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\^\!
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:
Jawaban:
Gunakan
git show $COMMIT
. Ini akan menunjukkan kepada Anda pesan log untuk komit, dan perbedaan komit tertentu.sumber
Menggunakan:
seperti yang dijelaskan dalam fragmen manpage git-rev-parse (1) berikut (atau dalam manpage git gvision (7) modern ):
Ini berarti Anda dapat menggunakan
15dc8^!
sebagai singkatan untuk15dc8^..15dc8
di mana saja di git di mana revisi diperlukan. Untuk perintah diffgit diff 15dc8^..15dc8
dipahami sebagaigit 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. Makar1^!
"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
sumber
^!
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:
Komit sebelumnya berfungsi seperti ini:
Ada banyak cara untuk menentukan komit:
Lihat halaman ini untuk detailnya .
sumber
Seperti @mipadi tunjukkan, Anda dapat menggunakan
git show $COMMIT
, tetapi ini juga menunjukkan beberapa tajuk dan pesan komit. Jika Anda ingin perbedaan lurus, gunakangit show --pretty=format:%b $COMMIT
.Ini jelas bukan tugas yang singkat, jadi saya menyimpan alias ini di .gitconfig saya
Ini memungkinkan saya untuk menggunakan
git sd $COMMIT
untuk menampilkan diff .sumber
Banyak contoh yang disebutkan (misalnya
git diff 15dc8^!
, ataugit diff 15dc8^..15dc8
) tidak berfungsi jika Anda menggunakan zsh dan memilikiextendedglob
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\^\!
sumber
~ 1 berarti 'orangtua', ~ 2 'kakek-nenek, dll.
sumber
Solusi Paul di atas melakukan apa yang saya harapkan.
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.
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:
sumber
Menggunakan alias, jadi tidak menjawab pertanyaan Anda dengan tepat, tetapi saya menemukan ini berguna untuk melakukan apa yang Anda inginkan ...
sumber