Bagaimana cara melihat perubahan dalam komit Git?

1549

Ketika saya melakukannya git diff COMMITsaya melihat perubahan antara komit itu dan KEPALA (sejauh yang saya tahu), tetapi saya ingin melihat perubahan yang dibuat oleh komit tunggal itu.

Saya belum menemukan opsi yang jelas pada diff/ logyang akan memberi saya output itu.

laktak
sumber

Jawaban:

1975

Untuk melihat perbedaan COMMIThash tertentu :

git diff COMMIT~ COMMITakan menunjukkan kepada Anda perbedaan antara COMMITleluhur dan leluhur COMMIT. Lihat halaman manual untuk git diff untuk perincian tentang perintah dan gitrevision tentang ~notasi dan teman-temannya.

Atau, git show COMMITakan melakukan sesuatu yang sangat mirip. (Data komit, termasuk diff - tetapi tidak untuk komit gabungan). Lihat manual git show .

Nevik Rehnel
sumber
17
Perhatikan bahwa ^kebutuhan dikutip dalam cangkang Thomson dan Bourne (sinonim untuk |sana) dan rcdan turunannya (operator caret) dan zshdengan perpanjangan extendedglob ( notoperator globbing)
Stephane Chazelas
3
Catatan yang HEAD^menyiratkan orang tua pertama dalam kasus komit memiliki beberapa orang tua (yaitu menggabungkan komit).
Mansour
23
git diff COMMIT~ COMMITbekerja untuk saya, perhatikan tilde bukan caret. Saya menjalankan git versi 2.6.1.windows.1 pada Windows 10.
Juuso Ohtonen
14
@tradetree: kata COMMIT seharusnya diganti dengan nama beberapa commit, misalnya jumlah SHA.
Nick Matteo
91
Saya merasa git show lebih cocok untuk pertanyaan ini dan harus menjadi saran yang disebutkan pertama.
pypmannetjies
497

Seperti disebutkan dalam " Singkatan untuk git dari commit dengan induknya? ", Anda juga dapat menggunakan git diff:

git diff COMMIT^!

atau

git diff-tree -p COMMIT

Dengan git show, Anda perlu (untuk fokus pada diff saja) untuk melakukan:

git show --color --pretty=format:%b $COMMIT

The COMMITparameter adalah ish komit- :

Sebuah komit objek atau objek yang dapat rekursif dereferenced untuk komit objek. Berikut ini semua komit: objek komit, objek tag yang menunjuk ke objek komit, objek tag yang menunjuk ke objek tag yang menunjuk ke objek komit, dll.

Lihat gitrevision "REVISI SPESIFIKASI" untuk referensi komitmen.
Lihat juga " Apa arti pohon-ish di Git? ".

VONC
sumber
371

Anda juga dapat mencoba cara mudah ini:

git show <COMMIT>
Lakhan
sumber
2
Sepertinya ini melakukan sesuatu yang sangat berbeda
Miserable Variable
3
Itu hanya menampilkan pesan komit. Bukan perbedaan dari perubahan kode yang diterapkan untuk komit ini.
k0pernikus
1
Ya itu tidak? Terakhir dalam versi git terbaru ...
Davy
2
Ini harus menjadi jawaban yang benar diperbarui
Scott Skiles
1
Ini seharusnya jawabannya.
Roel
77

git show memperlihatkan perubahan yang dilakukan pada komit terbaru.

Setara dengan git show HEAD.

git show HEAD~1 membawa Anda kembali 1 komit.

Adam Salma
sumber
45

Saya biasanya melakukan:

git diff HEAD~1

Untuk menampilkan perubahan terkait komit terakhir. Jika Anda memiliki lebih banyak komit, tambahkan saja angka 1 ke berapa banyak komit yang ingin Anda lihat.

Alex
sumber
34

Pertama-tama dapatkan ID komit menggunakan,

git log #to list all

Atau

git log -p -1 #last one commit id

Salin id komitmen.

Sekarang kami menggunakan dua metode untuk membuat daftar perubahan dari komit tertentu,

Metode 1:

git diff commit_id^! #commit id something like this 1c6a6000asad012

Metode 2:

git show commit_id
For example: git show 1c6a600a
Mohideen bin Mohammed
sumber
2
Apa ^!maksudnya ??
Martín Coll
2
^! adalah singkatan untuk komit ^ .. komit yang berarti akan mengecualikan semua orang tua dan memeriksa perbedaan komit itu
Mohideen bin Mohammed
Saya bukan ahli tapi saya punya kasus (dengan beberapa cabang terlibat) di mana git log c ^! tidak persis sama dengan git log c ^ .. c. Sebenarnya ini jauh lebih baik: git log c ^ .. c mendaftar terlalu banyak entri sementara git log c ^! melakukan hal yang benar, jadi ini adalah apa yang saya cari untuk waktu yang lama
user829755
32
git show <commit_sha>

Ini akan menunjukkan kepada Anda apa yang ada di komit itu. Saya pikir Anda dapat melakukan rentang itu dengan hanya memberi jarak antara dua shas komit.

git show <beginning_sha> <ending_sha>

yang cukup membantu jika Anda sering melakukan rebasing karena log fitur Anda semuanya akan berurutan.

Iwnnay
sumber
25

Dari halaman manual untuk git-diff (1) :

git diff [options] [<commit>] [--] [<path>…]
git diff [options] --cached [<commit>] [--] [<path>…]
git diff [options] <commit> <commit> [--] [<path>…]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>

Gunakan yang ke-3 di tengah:

git diff [options] <parent-commit> <commit>

Juga dari halaman manual yang sama, di bagian bawah, di bagian Contoh :

$ git diff HEAD^ HEAD      <3>

Bandingkan versi sebelum komit terakhir dan komit terakhir.

Memang kata-katanya sedikit membingungkan, itu akan kurang membingungkan

Bandingkan komit terbaru dengan komit sebelumnya.


sumber
3
Penulisan ulang Anda akan berlaku untuk git diff HEAD HEAD^.
Richard
git diff HEAD ^ HEAD tidak menampilkan perubahan apa pun.
pengguna3690202
@ user3690202 sehingga menyiratkan bahwa tidak ada perubahan untuk ditampilkan. Benarkah itu masalahnya?
Bagaimana tidak ada perubahan untuk ditampilkan? Jika Anda ingin melihat komit terakhir, tentunya kecuali itu adalah repositori yang sama sekali baru akan ada beberapa perubahan untuk ditampilkan?
pengguna3690202
@ user3690202 memungkinkan untuk membuat "komit kosong" dengan Git yang sebenarnya tidak mengandung perubahan apa pun dari induknya, meskipun ada perlindungan bawaan yang memeriksa dan mencegahnya, meskipun itu bisa ditimpa dengan opsi baris perintah. Saya ragu bahwa Anda akan dengan sengaja membuat komit kosong, jadi kemungkinan lain adalah Anda entah bagaimana memiliki konversi pra-komit akhiran pada (atau hal-hal spasi putih lucu lainnya) yang menipu Git dengan berpikir bahwa tidak ada perubahan yang sebenarnya telah dilakukan. Di platform apa Anda menjalankan Git?
22

Berikut ini tampaknya melakukan pekerjaan; Saya menggunakannya untuk menunjukkan apa yang telah dibawa oleh gabungan.

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>
MichaelMoser
sumber
Apakah itu akan berhasil juga git log? (karena stackoverflow.com/a/18585297/6309 )
VonC
16

Kemungkinan lain:

git log -p COMMIT -1
John_West
sumber
1
@GrantMcLean Ya, dan itu sudah dalam jawaban tertinggi yang dipilih, jadi saya tidak menyebutkannya.
John_West
11

Anda bisa menggunakannya git diff HEAD HEAD^1 untuk melihat perbedaan dengan komit induk.

Jika Anda hanya ingin melihat daftar file, tambahkan --statopsi.

Irshu
sumber
Ini yang Anda maksud, git diff HEAD ^ 1 HEAD
Shibir Basak
Perhatikan bahwa ini akan menunjukkan apa yang Anda tambahkan sebagai dihapus, karena itu akan melakukan perbandingan terbalik. Cara Anda membaca diffperintah ini adalah: apa yang harus saya ubah dalam file untuk mendapatkan dari commit HEADke commit HEAD^1?
brainplot
9
git difftool COMMIT^ <commit hash>

ini juga memungkinkan jika Anda telah mengkonfigurasi difftool Anda.

Lihat di sini cara mengkonfigurasi difftool Atau halaman manual di sini

Selain itu Anda dapat menggunakan git diff-tree --no-commit-id --name-only -r <commit hash>untuk melihat file mana yang telah diubah / dikomit dalam hash commit commit

Chand Priyankara
sumber
9

Saya suka perintah di bawah ini untuk membandingkan komit tertentu dan komit terakhir:

git diff <commit-hash>^-

Contoh:

git diff cd1b3f485^-
starcwl
sumber
6

Untuk melihat penulis dan waktu dengan komit, gunakan git show COMMIT. Yang akan menghasilkan sesuatu seperti ini:

commit 13414df70354678b1b9304ebe4b6d204810f867e
Merge: a2a2894 3a1ba8f
Author: You <[email protected]>
Date:   Fri Jul 24 17:46:42 2015 -0700

     Merge remote-tracking branch 'origin/your-feature'

Jika Anda ingin melihat file mana yang telah diubah, jalankan yang berikut dengan nilai-nilai dari garis Gabung di atas git diff --stat a2a2894 3a1ba8f .

Jika Anda ingin melihat diff yang sebenarnya, jalankan git --stat a2a2894 3a1ba8f

Nikita G.
sumber
"Jika Anda ingin melihat perbedaan yang sebenarnya, jalankan git --stat a2a2894 3a1ba8f". Saya pikir maksud Anda git diff a2a2894 3a1ba8fatau yang lain unknown option: --stat.
Buah
5

Untuk memeriksa perubahan lengkap:

  git diff <commit_Id_1> <commit_Id_2>

Untuk memeriksa hanya file yang diubah / ditambahkan / dihapus:

  git diff <commit_Id_1> <commit_Id_2> --name-only

CATATAN : Untuk memeriksa perbedaan tanpa komit di antaranya, Anda tidak perlu meletakkan id komit.

bit_cracker007
sumber
4

Saya menjalankan Git versi 2.6.1.windows.1 pada Windows 10, jadi saya perlu sedikit modifikasi untuk jawaban Nevik (tilde bukannya caret):

git diff COMMIT~ COMMIT

Pilihan lain adalah mengutip tanda sisipan:

git diff "COMMIT^" COMMIT
Juuso Ohtonen
sumber
3

Perintah ini akan memberi Anda hasit hasit induk Git:

git log -n 2 <commit-hash>

Setelah itu git diff-tool <commit-hash> <parent-commit-hash>

Contoh:

bonnie@bonnie ~/ $ git log -n 2 7f65b9a9d3820525766fcba285b3c678e889fe3

commit 7f65b9a9d3820525766fcba285b3c678e889fe3b
Author: souparno <[email protected]>
Date:   Mon Jul 25 13:17:07 2016 +0530

CSS changed to maintain the aspect ratio of the channel logos and to fit them properly.

commit c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Author: souparno <[email protected]>
Date:   Mon Jul 25 11:28:09 2016 +0530

The ratio of the height to width of the channel images are maintained.

Setelah ini

git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f
suparno majumder
sumber
2

Jika Anda hanya ingin melihat perubahan pada komit terbaru, cukup git showberi Anda itu.

MyrionSC2
sumber
1

Dalam hal memeriksa perubahan sumber dalam tampilan grafis,

$gitk (Mention your commit id here)

sebagai contoh:

$gitk HEAD~1 
pengguna272390
sumber
Saya tidak mengerti mengapa jawaban ini diturunkan. Saya setuju bahwa perintah dan hal-hal berbasis teks adalah cara untuk pergi tetapi gitk memberikan banyak informasi berguna.
ShellFish