Apakah mungkin untuk mendapatkan git untuk menghasilkan perbedaan antara file tertentu seperti yang ada sekarang, dan seperti yang ada sebelum komit terakhir yang mengubahnya?
Yaitu, jika kita tahu:
$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit
Kemudian git diff 456def myfile
tunjukkan perubahan terakhir ke myfile. Apakah mungkin untuk melakukan hal yang sama tanpa pengetahuan yang dihasilkan oleh git log
; apa yang berubah di 123abc?
git diff HEAD^ <file_path>
HEAD^
adalah123abc
,HEAD^^
adalah456def
; dan jika ada komitmen lain yang tidak memengaruhi file ini makaHEAD^
merujuk pada mereka)Jawaban:
Ini memang ada, tetapi sebenarnya fitur
git log
:Catatan yang
-p
juga dapat digunakan untuk menampilkan diff sebaris dari komit tunggal:Opsi yang digunakan:
-p
(juga-u
atau--patch
) disembunyikan deeeeeeeep digit-log
halaman manual, dan sebenarnya merupakan opsi tampilan untukgit-diff
. Ketika digunakan denganlog
, itu menunjukkan tambalan yang akan dihasilkan untuk setiap komit , bersama dengan informasi komit - dan menyembunyikan komit yang tidak menyentuh yang ditentukan<path>
. (Perilaku ini dijelaskan dalam paragraf di--full-diff
, yang menyebabkan perbedaan penuh dari setiap komit ditampilkan).-1
hanya menunjukkan perubahan terbaru ke file yang ditentukan (-n 1
dapat digunakan sebagai ganti-1
); jika tidak, semua perbedaan yang tidak nol dari file tersebut ditampilkan.--follow
diperlukan untuk melihat perubahan yang terjadi sebelum mengganti nama.Sejauh yang saya tahu, ini adalah satu-satunya cara untuk segera melihat set perubahan terakhir yang dibuat untuk file tanpa menggunakan
git log
(atau serupa) untuk menghitung jumlah revisi intervensi atau menentukan hash dari komit.Untuk melihat perubahan revisi yang lebih lama, cukup gulir ke seluruh log, atau tentukan komit atau tag untuk memulai log. (Tentu saja, menentukan komit atau tag mengembalikan Anda ke masalah awal untuk mengetahui apa komit atau tag yang benar.)
Kredit yang harus dibayar:
log -p
berkat jawaban ini .--follow
pilihan.-n 1
opsi dan atatko untuk menyebutkan-1
varian.-p
"arti" secara semantik.sumber
git log -p filename
-n 1
parameter.git log -p -n 1 filename
-n 1
juga dapat diganti dengan-1
, itu tidak mengubah hasil. Saya hanya lebih menyukai sintaks:git log -p -1 filename
git log -p -1 --skip=1 <path>
untuk menampilkan komit kedua.Salah satu cara untuk menggunakan git diff adalah:
Dan cara yang umum untuk merujuk satu commit dari commit terakhir adalah sebagai jalur relatif ke HEAD yang sebenarnya. Anda dapat merujuk komit sebelumnya sebagai HEAD ^ (dalam contoh Anda ini akan menjadi 123abc) atau HEAD ^^ (456def dalam contoh Anda), dll ...
Jadi jawaban untuk pertanyaan Anda adalah:
sumber
HEAD^
, tetapi tentu saja itu tidak menghasilkan apa-apa. Tidak berpikir untuk mencobaHEAD^^
.HEAD~2
HEAD^^ myfile
benar-benar akan merujuk pada komitmen kedua-ke-terakhir yang diubahmyfile
; itu akan merujuk pada komitmen kedua-ke-terakhir secara keseluruhan. Apakah ada cara untuk menentukan "Saya ingin melihat perubahan terakhir yang dibuat untuk file ini" tanpa menentukan (bagian dari) hash komit atau menghitung jumlah komit antara perubahan terakhir yang dibuat untuk file itu dan revisi saat ini?git log -p
cukup dekat.Jika Anda baik-baik saja menggunakan alat grafis ini berfungsi dengan sangat baik:
gitk sekarang menunjukkan semua komit di mana file telah diperbarui. Menandai komit akan menunjukkan perbedaan terhadap komit sebelumnya dalam daftar. Ini juga berfungsi untuk direktori, tetapi kemudian Anda juga bisa memilih file untuk diff untuk komit yang dipilih. Sangat berguna!
sumber
git difftool HEAD^ file
ataugit difftool -d HEAD^ path