git: Bagaimana cara membedakan file yang diubah versus versi sebelumnya setelah penarikan?

117

Ketika saya menjalankan "git pull", saya sering ingin tahu apa yang berubah antara versi terakhir dari sebuah file dan yang baru. Katakanlah saya ingin tahu komitmen orang lain pada file tertentu.

Bagaimana caranya?

Saya berasumsi itu "git diff" dengan beberapa parameter untuk komit x versus komit y tapi sepertinya saya tidak bisa mendapatkan sintaksnya. Saya juga menemukan "git log" agak membingungkan dan saya tidak yakin di mana mendapatkan ID komit dari versi terbaru saya dari file versus yang baru.

doug
sumber
1
Anda mungkin menemukan alat grafis gitk lebih sesuai dengan selera Anda.
crazyscot
stackoverflow.com/questions/61002/… mungkin mirip dengan yang ini
VonC

Jawaban:

158

Ada berbagai macam cara yang indah untuk menentukan komit - melihat revisi menspesifikasikan bagian man git-rev-parseuntuk rincian lebih lanjut. Dalam kasus ini, Anda mungkin menginginkan:

git diff HEAD@{1}

The @{1}berarti "posisi sebelumnya dari ref saya sudah ditentukan", sehingga mengevaluasi apa yang Anda telah memeriksa sebelumnya - sebelum pull. Anda dapat menempel HEADdi ujung sana jika Anda juga memiliki beberapa perubahan dalam pohon kerja Anda dan Anda tidak ingin melihat perbedaannya.

Saya tidak yakin apa yang Anda minta dengan "ID komit versi terbaru saya dari file" - komit "ID" (hash SHA1) adalah hex 40 karakter tepat di bagian atas setiap entri dalam output dari git log. Ini adalah hash untuk keseluruhan komit, bukan untuk file yang diberikan. Anda tidak benar-benar membutuhkan lebih banyak - jika Anda ingin membedakan hanya satu file di seluruh tarikan, lakukan

git diff HEAD@{1} filename

Ini adalah hal yang umum - jika Anda ingin mengetahui tentang status file dalam komit yang diberikan, Anda menentukan komit dan file, bukan ID / hash khusus untuk file tersebut.

Bertingkat
sumber
Posting sebelumnya yang ditautkan VonC mengatakan pada dasarnya hal yang sama dengan ini, tetapi penjelasannya sedikit berbeda, jadi saya akan meninggalkan ini untuk saat ini. (Ini juga digunakan @{1}sebagai singkatan untuk HEAD@{1})
Cascabel
benar, tapi saya juga suka penjelasannya. +1
VonC
Inilah yang saya cari. Terima kasih atas penjelasannya.
lucapette
1 untuk apa yang saya googling. Akan luar biasa jika ini dipilih sebagai jawaban dan naik ke atas ... :)
longda
@longda Jika Anda mengurutkan berdasarkan suara (yang menurut saya default), seharusnya sudah di atas.
Cascabel
57

Saya suka menggunakan:

git diff HEAD^

Atau jika saya hanya ingin membeda-bedakan file tertentu:

git diff HEAD^ -- /foo/bar/baz.txt
cadizm.dll
sumber
5
-1: HEAD^adalah komit orang tua, bukan komit sebelumnyapull
CharlesB
1
Jika HEADadalah komit gabungan, HEAD^adalah komit orang tua pertama, jadi ya, itu bisa menjadi komit sebelum pull. Untuk mendapatkan induk lainnya (untuk penggabungan dua arah), gunakan HEAD^2. Tapi kemudian, jawaban di atas tidak benar-benar menjawab pertanyaan di tempat pertama, jadi tinggalkan -1 ;-)
Michael Wild
Terimakasih atas klarifikasinya. Tidak membaca pertanyaan dengan cermat, karena saya sedang mencari sesuatu yang lain di Google dan tautan ini muncul di bagian atas halaman hasil. Saya pikir saya akan bergabung karena saya adalah pengguna baru dan tidak memiliki karma (jika itu namanya SO).
Salah
3
@MichaelWild mungkin bukan yang diminta oleh penanya, tetapi itulah yang saya cari ketika saya menemukan ini. Itu berguna bagi saya. Upvoting.
John Dvorak
Inilah yang dilakukan TortoiseGit "Diff dengan versi sebelumnya". Dan itulah yang saya cari selama ini.
Fabien Haddadi
15

Jika Anda melakukan straight git pullmaka Anda akan 'dipercepat' atau menggabungkan sejumlah komit yang tidak diketahui dari repositori jarak jauh. Ini terjadi sebagai satu tindakan, jadi komit terakhir yang Anda lakukan tepat sebelum penarikan akan menjadi entri terakhir dalam reflog dan dapat diakses sebagai HEAD@{1}. Artinya, Anda dapat melakukan:

git diff HEAD@{1}

Namun, saya sangat menyarankan bahwa jika ini adalah sesuatu yang sering Anda lakukan, Anda harus mempertimbangkan untuk melakukan git fetchdan memeriksa cabang yang diambil sebelum menggabungkan atau melakukan rebasing secara manual. Misalnya jika Anda berada di master dan akan menarik asal / master:

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master
CB Bailey
sumber
Penggunaan yang bagus git logdaripada di git diffsini (meskipun sintaksnya agak tidak koheren antara '..' untuk git logdan '...' untuk git diff;) +1 Lihat stackoverflow.com/questions/53569/… dan stackoverflow.com/questions / 850607 /…
VonC
Untungnya jika Anda menggunakan sintaks '..' dalam perintah git diff, git "melakukan hal yang benar".
CB Bailey