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?

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

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

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.


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.


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.


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.


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


2
git diff master~20 -- pom.xml

Berfungsi jika Anda tidak berada di cabang master juga.


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.



0

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

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

-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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.