Bagaimana cara membedakan satu file dengan versi sewenang-wenang di Git?

324

Bagaimana saya bisa membedakan file, katakanlah pom.xml, dari cabang master ke versi lama yang sewenang-wenang di Git?

Chris K
sumber

Jawaban:

347

Anda dapat melakukan:

git diff master~20:pom.xml pom.xml

... untuk membandingkan arus Anda pom.xmldengan yang dari master20 revisi yang lalu melalui induk pertama. Anda dapat mengganti master~20, tentu saja, dengan nama objek (SHA1sum) dari komit atau salah satu dari banyak cara lain untuk menentukan revisi .

Perhatikan bahwa ini sebenarnya membandingkan yang lama pom.xmldengan versi di pohon kerja Anda, bukan versi yang dilakukan master. Jika Anda menginginkannya, maka Anda dapat melakukan yang berikut:

git diff master~20:pom.xml master:pom.xml
Mark Longair
sumber
12
Perhatikan bahwa ini tidak hanya berfungsi untuk file, tetapi juga berfungsi untuk (sub) direktori, misalnya git diff <revision>:foo/ HEAD:foo/.
2
Perhatikan juga bahwa pada windows Anda perlu menggunakan garis miring maju untuk direktori jika Anda menggunakan specifier revisi atau git akan memberi Anda kesalahan tentang file / direktori yang tidak ada dalam revisi itu.
Dylan Nissley
1
@DylanNissley atau itu akan memberi Anda tidak ada kesalahan dan tidak ada perbedaan. Itu yang saya lihat. Bagaimanapun, terima kasih atas petunjuk tentang menggunakan garis miring bukan garis miring terbalik.
Gary S.
Dengan file windows saya merasa lebih mudah untuk mengubah direktori dan kemudian memanggil git diff master ~ 20: ./pom.xml ./pom.xml
lloyd
Beberapa versi git memerlukan "-" antara <revision> & <path>
Josh
140
git diff <revision> <path>

Sebagai contoh:

git diff b0d14a4 foobar.txt
Benjamin Pollack
sumber
tidak berfungsi untuk versi 1.7.11 jika file tidak ada di direktori saat ini. Contoh: kesalahan 'git diff f76d078 test / Config' menghasilkan ": Tidak dapat mengakses 'test / f76d078'"
simpleuser
1
@ user1663987 hanya lulus path relatif lengkap ke akar proyek: git diff <revision> root/path/file.
1
test / Config adalah relatif ke root (seperti dalam test adalah sub-direktori dari root). tetapi kemudian contoh root / path / file Anda tampaknya TERMASUK root?
simpleuser
41

Jika Anda ingin melihat perbedaan antara komit terakhir dari satu file yang dapat Anda lakukan:

git log -p -1 filename

Ini akan memberi Anda perbedaan file di git, tidak membandingkan file lokal Anda.

Gerardo
sumber
2
ini tidak mengembalikan apa pun
Andrei Cristian Prodan
@AndreiCristianProdan Maka Anda tidak memiliki perubahan di sana. Anda dapat meningkatkan -1langkah demi langkah sampai Anda mendapatkan perubahan.
kaiser
Ini sangat bagus. Saya membuat fungsi bash yang mungkin berguna: gitlog () { git log -${3:-p} -${2:-1} $1; } Digunakan seperti: gitlog Rakefileatau gitlog Rakefile 5dan gitlog Rakefile 10 s. Yang pertama menunjukkan satu perbedaan; yang kedua menunjukkan lima perbedaan; yang ketiga menunjukkan sepuluh --no-patch.
auxbuss
18

Untuk melihat apa yang diubah dalam file di komit terakhir:

git diff HEAD~1 path/to/file.

Anda dapat mengubah angka (~ 1) menjadi komis ke-n yang ingin Anda bedakan.

Juampy NR
sumber
Jawaban ini benar-benar hanya kasus khusus dari jawaban yang lebih umum ini , di mana HEAD~1diganti <revision>, yang membuat jawaban ini duplikat.
1
ini tidak berfungsi! fatal: argumen ambigu 'HEAD ~ 1': revisi yang tidak diketahui atau jalur yang tidak ada di pohon kerja. Gunakan '-' untuk memisahkan jalur dari revisi
Andrei Cristian Prodan
Jawaban ini sederhana dan fungsional bagi saya.
Douglas Frari
6

Sintaksis Generik:

$git diff oldCommit..newCommit -- **FileName.xml > ~/diff.txt

untuk semua file bernama "FileName.xml" di mana saja di repo Anda.

Perhatikan jarak antara "-" dan "**"

Jawab untuk pertanyaan Anda:

$git checkout master
$git diff oldCommit..HEAD -- **pom.xml 
or
$git diff oldCommit..HEAD -- relative/path/to/pom.xml 

seperti biasa dengan git, Anda dapat menggunakan tag / sha1 / "HEAD ^" untuk id komit.

Diuji dengan git 1.9.1 di Ubuntu.

Kedengarannya sepertiod
sumber
6

Jika tidak ada komit yang menjadi HEAD Anda maka ekspansi brace bash terbukti sangat berguna, terutama jika nama file Anda panjang, contoh di atas:

git diff master~20:pom.xml master:pom.xml

Akan menjadi

git diff {master~20,master}:pom.xml

Lebih lanjut tentang ekspansi Brace dengan bash.

robstarbuck
sumber
6

Untuk membandingkan hingga 5 komit dengan yang sekarang, keduanya aktif master, cukup lakukan:

git diff master~5:pom.xml master:pom.xml

Anda juga dapat merujuk ke komit nomor hash, misalnya jika nomor hash adalah x110bd64, Anda dapat melakukan sesuatu seperti ini untuk melihat perbedaannya:

git diff x110bd64 pom.xml
Alireza
sumber
4

git diff -w HEAD origin / jalur master / ke / file

CatalinBerta
sumber
2
git diff master~20 -- pom.xml

Berfungsi jika Anda tidak berada di cabang master juga.

Gunar Gessner
sumber
2

Jika Anda baik-baik saja menggunakan alat grafis (atau bahkan lebih suka) Anda dapat:

gitk pom.xml

Di gitk Anda kemudian dapat mengklik komit apa saja (untuk "memilih" itu) dan klik kanan komit lain untuk memilih "Diff this -> terpilih" atau "Diff terpilih -> ini" di menu sembulan, tergantung pada urutan apa yang Anda inginkan.

Martin G
sumber
0

Jika Anda perlu melakukan diff pada satu file dalam simpanan misalnya, Anda dapat melakukannya

git diff stash@{0} -- path/to/file
lacostenycoder
sumber
-1

Jika Anda mencari diff pada komit tertentu dan Anda ingin menggunakan UI github alih-alih baris perintah (katakanlah Anda ingin menautkannya ke orang lain), Anda dapat melakukan:

https://github.com/<org>/<repo>/commit/<commit-sha>/<path-to-file>

Sebagai contoh:

https://github.com/grails/grails-core/commit/02942c5b4d832b856fbc04c186f1d02416895a7e/grails-test-suite-uber/build.gradle

Perhatikan tautan Sebelumnya dan Berikutnya di kanan atas yang memungkinkan Anda menavigasi semua file dalam komit.

Ini hanya bekerja untuk komit tertentu, bukan untuk membandingkan antara dua versi sewenang-wenang.

Schmick
sumber