"git diff" selalu menunjukkan perbedaan antara dua commit (atau commit dan direktori kerja, dll.).
Jakub Narębski
21
@ JakubNarębski, dia bertanya bagaimana melihat perbedaan antara perubahan yang diperkenalkan oleh satu perintah dan perubahan yang diperkenalkan oleh komit lain. Dengan kata lain, diff dari diff atau interdiff.
psusi
1
dan jika Anda menambahkan --dirstat = parameter file ke perintah diff, Anda akan mengambil tangkapan layar yang sangat bagus pada proyek yang tepat dan file yang diubah, bersama dengan persentase perubahan. Seperti ini: git diff [commit-number] [commit-number] --dirstat = file
Óscar Ibáñez Fernández
Jawaban:
606
Anda cukup memberikan 2 commit ke git diff seperti:
Keuntungan menggunakan git apply vs. patch adalah Anda dapat memasukkan nama baru dan beberapa perubahan lain yang khusus untuk git. Saya suka menggunakan format git-patch dan git.
Russell
58
Jawaban ini sama sekali gagal menjawab pertanyaan, jadi saya tidak tahu mengapa ada begitu banyak upvotes. OP secara khusus menanyakan bagaimana TIDAK untuk mendapatkan perintah pertama yang Anda berikan, dan yang kedua tidak ada hubungannya dengan apa pun.
psusi
3
Jawaban ini sama sekali tidak gagal menjawab apa pun. Ini bekerja dengan sempurna. Jika Anda bercabang di kemudian hari dari dua commit yang bersangkutan, maka terapkan diff ini ke cabang baru itu, Anda akan melihat perubahan antara kedua commit tersebut tanpa sakit kepala dari commit yang berselang.
Craig Labenz
142
Meminta perbedaan / antara / dua komit tanpa menyertakan komit di antaranya tidak masuk akal. Komit hanyalah snapshot dari isi repositori; meminta perbedaan antara keduanya harus mencakup mereka. Jadi pertanyaannya adalah, apa yang sebenarnya Anda cari?
Seperti yang disarankan William, memetik ceri dapat memberi Anda delta dari satu komit yang direbus di atas yang lain. Itu adalah:
Ini membutuhkan komit 'abcdef', membandingkannya dengan leluhur langsungnya, kemudian menerapkan perbedaan itu di atas '012345'. Perbedaan baru ini kemudian ditampilkan - satu-satunya perubahan adalah konteksnya berasal dari '012345' daripada 'leluhur langsung abcdef. Tentu saja, Anda mungkin mendapatkan konflik dan lain-lain, jadi itu bukan proses yang sangat berguna dalam kebanyakan kasus.
Jika Anda hanya tertarik dengan abcdef itu sendiri, Anda dapat melakukannya:
$ git log -u -1 abcdef
Ini membandingkan abcdef dengan leluhur langsungnya, sendirian, dan biasanya itulah yang Anda inginkan.
Dan tentu saja
$ git diff 012345..abcdef
memberi Anda semua perbedaan antara kedua komitmen tersebut.
Ini akan membantu untuk mendapatkan ide yang lebih baik tentang apa yang ingin Anda capai - seperti yang saya sebutkan, meminta perbedaan antara dua komitmen tanpa apa yang ada di antaranya sebenarnya tidak masuk akal.
Saya akan setuju bahwa, secara umum, tidak masuk akal untuk membandingkan dua komitmen. Tapi git sangat pandai tidak memberitahu Anda bagaimana Anda harus berpikir. Misalkan Anda memiliki dua cabang, masing-masing dengan komit berbeda yang terlihat seperti mereka membuat perubahan yang sama untuk set file yang sama. Saya ingin dapat menggunakan git untuk memberi tahu saya jika kedua tambalan ini sama tanpa harus mempercayai mata saya. Saya pikir ada utilitas dalam hal ini.
Chris Cleeland
9
@ ChrisCleeland, utilitas interdiff bisa berguna dalam kasus itu. Gunakan git diff untuk mendapatkan diff dari setiap komit terhadap induk langsungnya, kemudian gunakan interdiff untuk membandingkan diff.
bdonlan
3
@ ChrisCleeland, git tidak menyimpan tambalan. Ini menyimpan konten file. Itu memang memiliki skema kompresi yang menggunakan delta, tetapi sumber delta tidak selalu berkorelasi dengan sejarah sebenarnya dari file.
bdonlan
11
Perbedaan antara dua komit tidak termasuk komit lain di cabang masing-masing masuk akal: satu komit dipilih dari yang lain, tetapi mungkin memiliki beberapa perbedaan halus. Anda ingin melihat apa yang mereka tanpa berantakan dengan semua omong kosong yang tidak terkait lainnya yang berbeda antara dua cabang.
psusi
2
Atau katakan Anda rebase master ke cabang fitur, dan harus menyelesaikan konflik. Setelah membandingkan origin/featurebranch#HEADdengan local/featurebranch#HEADdapat membantu Anda memastikan Anda tidak membuang apa pun selama resolusi konflik.
kidal
91
Untuk membandingkan dua git melakukan 12345 dan abcdef sebagai tambalan kita dapat menggunakan perintah diff sebagai
@OneOfOne git diff <(git show 123456) <(git show abcdef)tidak berfungsi; diff <(...) <(...)tidak. (Saya baru mencobanya).
Menachem
@Menachem git diff 123456 abcdef.
OneOfOne
15
@OneOfOne Itu tidak melakukan hal yang sama. Apa yang Anda sarankan akan membandingkan pohon masing-masing komit, menunjukkan satu tambalan . Apa yang saya (dan @plexoos) lakukan adalah membandingkan dua tambalan , masing-masing telah diperkenalkan oleh komit terpisah - dengan kata lain, diffmenghasilkan output dari dua diffs. Ini melibatkan membaca dan membandingkan dua aliran input. diff(GNU, atau Unix, diff) dapat melakukan itu, sementara git difftidak bisa. Beberapa orang mungkin bertanya-tanya mengapa seseorang ingin melakukan itu. Saya sedang melakukan itu sekarang, membersihkan gabungan yang menjadi buruk.
Menachem
1
tidakkah ini termasuk gnu diff dari semua metadata di git diff?
joelb
61
git diff <a-commit> <another-commit> path
Contoh:
git diff commit1 commit2 config/routes.rb
Ini menunjukkan perbedaan pada file itu antara komit tersebut.
Terima kasih, itu ide yang bagus untuk memeriksa hasil Anda setelah melakukan squashing. Sebagai contoh, Anda dapat checkout cabang Anda dengan komit non-squash dan ceri memilih komit squashing Anda untuk melihat apakah semuanya berjalan lancar dengan rebase interaktif. Selain itu, ketika master telah maju dari cabang.
akostadinov
10
Bagaimana dengan ini:
git diff abcdef 123456 | less
Berguna hanya untuk mengurangi menjadi pipa jika Anda ingin membandingkan banyak perbedaan yang berbeda dengan cepat.
aliasPengaturan saya di ~/.bashrcfile untuk git diff:
alias gdca='git diff --cached' # diff between your staged file and the last commit
alias gdcc='git diff HEAD{,^}' # diff between your latest two commits
Jawaban:
Anda cukup memberikan 2 commit ke git diff seperti:
sumber
my.patch
ke cabang lain?Meminta perbedaan / antara / dua komit tanpa menyertakan komit di antaranya tidak masuk akal. Komit hanyalah snapshot dari isi repositori; meminta perbedaan antara keduanya harus mencakup mereka. Jadi pertanyaannya adalah, apa yang sebenarnya Anda cari?
Seperti yang disarankan William, memetik ceri dapat memberi Anda delta dari satu komit yang direbus di atas yang lain. Itu adalah:
Ini membutuhkan komit 'abcdef', membandingkannya dengan leluhur langsungnya, kemudian menerapkan perbedaan itu di atas '012345'. Perbedaan baru ini kemudian ditampilkan - satu-satunya perubahan adalah konteksnya berasal dari '012345' daripada 'leluhur langsung abcdef. Tentu saja, Anda mungkin mendapatkan konflik dan lain-lain, jadi itu bukan proses yang sangat berguna dalam kebanyakan kasus.
Jika Anda hanya tertarik dengan abcdef itu sendiri, Anda dapat melakukannya:
Ini membandingkan abcdef dengan leluhur langsungnya, sendirian, dan biasanya itulah yang Anda inginkan.
Dan tentu saja
memberi Anda semua perbedaan antara kedua komitmen tersebut.
Ini akan membantu untuk mendapatkan ide yang lebih baik tentang apa yang ingin Anda capai - seperti yang saya sebutkan, meminta perbedaan antara dua komitmen tanpa apa yang ada di antaranya sebenarnya tidak masuk akal.
sumber
origin/featurebranch#HEAD
denganlocal/featurebranch#HEAD
dapat membantu Anda memastikan Anda tidak membuang apa pun selama resolusi konflik.Untuk membandingkan dua git melakukan 12345 dan abcdef sebagai tambalan kita dapat menggunakan perintah diff sebagai
sumber
git diff <(git show 123456) <(git show abcdef)
tidak berfungsi;diff <(...) <(...)
tidak. (Saya baru mencobanya).git diff 123456 abcdef
.diff
menghasilkan output dari duadiff
s. Ini melibatkan membaca dan membandingkan dua aliran input.diff
(GNU, atau Unix,diff
) dapat melakukan itu, sementaragit diff
tidak bisa. Beberapa orang mungkin bertanya-tanya mengapa seseorang ingin melakukan itu. Saya sedang melakukan itu sekarang, membersihkan gabungan yang menjadi buruk.Contoh:
Ini menunjukkan perbedaan pada file itu antara komit tersebut.
sumber
Untuk memeriksa perubahan lengkap:
Untuk memeriksa hanya file yang diubah / ditambahkan / dihapus:
CATATAN : Untuk memeriksa perbedaan tanpa komit di antaranya, Anda tidak perlu meletakkan id komit.
sumber
Katakanlah Anda punya ini
Dan Anda ingin memastikan bahwa
A
itu sama denganA0
.Ini akan melakukan trik:
sumber
diff <(git diff B A) <(git diff D A0)
(hasil yang sama seperti dengan git show)Misalkan Anda ingin melihat perbedaan antara komit 012345 dan abcdef. Berikut ini harus melakukan apa yang Anda inginkan:
sumber
Bagaimana dengan ini:
Berguna hanya untuk mengurangi menjadi pipa jika Anda ingin membandingkan banyak perbedaan yang berbeda dengan cepat.
sumber
Sejak Git 2.19, Anda cukup menggunakan:
git range-diff rev1...rev2
- membandingkan dua pohon komit, dimulai oleh nenek moyang mereka bersamaatau
git range-diff rev1~..rev1 rev2~..rev2
- bandingkan perubahan yang dilakukan oleh 2 commit yang diberikansumber
alias
Pengaturan saya di~/.bashrc
file untukgit diff
:sumber
alias
Pengaturan saya di~/.zshrc
file untukgit diff
:Terima kasih @ Jinmiao Luo
git diff HEAD~2 HEAD
selesaikan perubahan antara komitmen terbaru ke-2 dan saat ini.
HEAD
nyamansumber
Saya menulis sebuah skrip yang menampilkan perbedaan antara dua commit, berfungsi dengan baik di Ubuntu.
https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc
sumber