Bagaimana cara membandingkan file dari dua cabang yang berbeda?

1538

Saya memiliki skrip yang berfungsi dengan baik di satu cabang dan rusak di yang lain. Saya ingin melihat dua versi secara berdampingan dan melihat apa yang berbeda. Apakah ada cara untuk melakukan ini?

Untuk lebih jelasnya saya tidak mencari alat bandingkan (saya menggunakan Beyond Compare). Saya sedang mencari perintah git diff yang akan memungkinkan saya untuk membandingkan versi master dengan versi cabang saya saat ini untuk melihat apa yang telah berubah. Saya tidak di tengah-tengah gabungan atau apa pun. Saya hanya ingin mengatakan sesuatu seperti

git diff mybranch/myfile.cs master/myfile.cs
Mikha
sumber

Jawaban:

2208

git diff dapat menunjukkan kepada Anda perbedaan antara dua komitmen:

git diff mybranch master -- myfile.cs

Atau, yang setara:

git diff mybranch..master -- myfile.cs

Menggunakan sintaks yang terakhir, jika salah satu sisinya HEADmungkin dihilangkan (mis. master..Dibandingkan masterdengan HEAD).

Anda mungkin juga tertarik mybranch...master(dari git diffdokumen ):

Formulir ini untuk melihat perubahan pada cabang yang berisi dan sampai yang kedua <commit>, dimulai pada nenek moyang yang sama dari keduanya <commit>. git diff A...Bsetara dengan git diff $(git-merge-base A B) B.

Dengan kata lain, ini akan memberikan perbedaan perubahan masterkarena berbeda dari mybranch(tetapi tanpa perubahan baru sejak saat itu mybranch).


Dalam semua kasus, --pemisah sebelum nama file menunjukkan akhir tanda baris perintah. Ini opsional kecuali Git akan bingung jika argumen merujuk ke sebuah komit atau file, tetapi termasuk itu bukan kebiasaan buruk untuk masuk. Lihat https://stackoverflow.com/a/13321491/54249 untuk beberapa contoh.


Argumen yang sama dapat diteruskan ke git difftooljika Anda memiliki satu dikonfigurasi.

dahlbyk
sumber
44
Dan jika tak satu pun dari dua versi yang ingin Anda bandingkan adalah pohon kerja, Anda bisa menggunakannya git diff branch1 branch2 myfile.cs. (Yang --seharusnya tidak perlu lagi, karena hanya bisa memakan dua argumen revisi.)
Cascabel
8
Saya sudah mencoba semua versi ini dan tidak ada yang terjadi. Saya telah mengkonfigurasi difftool saya (berfungsi untuk menggabungkan). Saya memiliki file bernama bd.ps1. Setiap versi perintah yang saya ketik tidak melakukan apa-apa. Bahkan tidak memberikan kesalahan. WTH!?!?!
Micah
3
@Micah: Apakah Anda mencobanya dengan diff biasa juga? Apakah Anda mengetik path dengan benar ke direktori saat ini? (Ini akan diam-diam tidak menunjukkan perbedaan jika file tidak ada, dan Anda menggunakan --kesalahan. Umum dan mudah untuk membuat.)
Cascabel
5
Ini tidak berfungsi untuk saya kecuali saya menyertakan path lengkap ke file, seperti yang ditunjukkan oleh git diff --name-status branch1..branch2(mungkin jelas, tetapi saya pikir saya akan menyebutkannya kalau-kalau ada orang lain yang memiliki masalah yang sama dengan saya).
hBrent
4
Urutan mybranch dan master juga penting. File di cabang pertama akan ditampilkan dengan awalan '-', file di cabang kedua akan ditampilkan dengan awalan '+'.
timbo
414

Kamu bisa melakukan ini: git diff branch1:path/to/file branch2:path/to/file

Jika Anda telah mengkonfigurasi difftool, maka Anda juga dapat: git difftool branch1:path/to/file branch2:path/to/file

Pertanyaan terkait: Bagaimana cara melihat output git diff dengan program visual diff

Tim Henigan
sumber
4
Menggunakan titik dua sebenarnya bukan cara yang bagus - itu berarti Anda mereferensikan file melalui objek pohon, jadi Anda harus mengetikkan path lengkap, bukan relatif terhadap direktori Anda saat ini.
Cascabel
13
@ Jefromi, ini mungkin telah berubah dalam versi yang lebih baru, tetapi setidaknya sekarang Anda dapat menggunakan jalur relatif (misalnya branch1:./file). Ini juga berguna jika file berada di lokasi terpisah antara cabang-cabang (misalnya git diff branch1:old/path/to/file branch2:new/path/to/file).
redbmk
4
@redbmk Ya, itu sekitar 2010 dan sekarang! Namun, jika itu file yang sama di kedua cabang, tidak perlu melakukannya seperti ini, cukup git diff branch1 branch2 path/to/file.
Cascabel
3
@ jefromi keren, saya tidak yakin waktu kapan itu ditambahkan. Ya saya biasanya akan menggunakan sintaks yang Anda sebutkan, tetapi jawaban Tim membantu saya mencari cara membandingkan file dengan jalur yang berbeda, meskipun itu tidak benar-benar apa yang ditanyakan oleh pertanyaan
redbmk
1
Walaupun saya menyukai ide ini, saya tidak bisa mendapatkan sintaks ini untuk bekerja atau menemukan menyebutkannya di git diff docs. Apa yang saya lewatkan? Terima kasih!
yoyo
160

Sintaks yang lebih modern:

git diff ..master path/to/file

Awalan titik ganda berarti "dari direktori kerja saat ini ke". Anda juga bisa mengatakan:

  • master.., yaitu kebalikan dari di atas. Ini sama dengan master.
  • mybranch..master, secara eksplisit mereferensikan status selain dari pohon kerja saat ini.
  • v2.0.1..master, yaitu referensi tag.
  • [refspec]..[refspec], pada dasarnya apa pun yang dapat diidentifikasi sebagai kode negara untuk git.
Joe Atzberger
sumber
33

Ada banyak cara untuk membandingkan file dari dua cabang berbeda:

  • Opsi 1: Jika Anda ingin membandingkan file dari n cabang tertentu dengan cabang spesifik lainnya:

    git diff branch1name branch2name path/to/file
    

    Contoh:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    Dalam contoh ini Anda membandingkan file di cabang "mybranch" dengan file di cabang "mysecondbranch".

  • Opsi 2: Cara sederhana:

     git diff branch1:file branch2:file
    

    Contoh:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    Contoh ini mirip dengan opsi 1.

  • Opsi 3: Jika Anda ingin membandingkan direktori kerja Anda saat ini dengan beberapa cabang:

    git diff ..someBranch path/to/file
    

    Contoh:

    git diff ..master myfile.cs
    

    Dalam contoh ini Anda membandingkan file dari cabang Anda yang sebenarnya dengan file di cabang master.

Javier C.
sumber
12

Saya hanya melakukannya git diff branch1 branch2 path/to/file

Ini memeriksa perbedaan antara file. Perubahan branch1akan berwarna merah. Perubahan branch2akan berwarna hijau.

Diasumsikan bahwa itu branch1adalah masa lalu dan branch2masa depan. Anda dapat membalikkan ini dengan membalik urutan cabang di diff:git diff branch2 branch1

iGbanam
sumber
Versi git diff mana yang bisa melakukan ini? Tampaknya tidak didukung dalam versi yang saya jalankan (2..9.2.windows.1).
Vince Bowdren
9

Jika Anda ingin membuat perbedaan terhadap cabang saat ini, Anda dapat menonaktifkannya dan menggunakan:

git diff $BRANCH -- path/to/file

dengan cara ini akan berbeda dari cabang saat ini ke cabang yang direferensikan ( $BRANCH).

Paulo Fidalgo
sumber
5

Setuju dengan jawaban yang disarankan oleh @dahlbyk. Jika Anda ingin diff ditulis ke file diff untuk ulasan kode gunakan perintah berikut.

git diff branch master -- filepath/filename.extension > filename.diff --cached
Azad
sumber
2

Dalam kasus saya, saya menggunakan perintah di bawah ini:

git diff <branch name> -- <path + file name>

Perintah ini dapat membantu Anda membandingkan file yang sama di dua cabang yang berbeda

SKT
sumber
1

Cara terbaik untuk melakukannya adalah dengan menggunakan git diffcara berikut: git diff <source_branch> <target_branch> -- file_path

Ini akan memeriksa perbedaan antara file di cabang-cabang itu. Lihatlah artikel ini untuk informasi lebih lanjut tentang perintah git dan cara kerjanya.

Nesha Zoric
sumber
1

Gunakan hash sebagai berikut:

git diff <hash1> <hash2> <filename>

di mana hash1 dapat berupa komit dari cabang apa pun, sama untuk hash2 .

prometeu
sumber
1

Ada dua skenario untuk membandingkan file:

Skenario 1: Bandingkan file di cabang jauh (kedua cabang harus ada di repositori jarak jauh)

Skenario 2: Bandingkan file lokal (di copy area kerja lokal) dengan file di repositori jarak jauh.

Logikanya sederhana. Jika Anda memberikan dua nama cabang untuk diff, itu akan selalu membandingkan cabang jauh, dan jika Anda hanya memberikan satu nama cabang, itu akan selalu membandingkan copy pekerjaan lokal Anda dengan repo jarak jauh (yang Anda berikan). Anda dapat menggunakan rentang untuk menyediakan repositori jarak jauh.

mis. Periksa cabang

git checkout branch1
git diff branch2 [filename]

dalam hal ini, jika Anda memberikan nama file, itu akan membandingkan salinan nama file lokal Anda dengan cabang jarak jauh bernama " branch2 ".

git diff branch1 branch2 [filename]

dalam hal ini, ia akan membandingkan nama file dari cabang jauh bernama " branch1 " vs " branch2 "

git diff ..branch2 [filename]

dalam hal ini juga, ia akan membandingkan nama file dari cabang jarak jauh bernama " branch1 " vs " branch2 ". Jadi, sama seperti di atas. Namun, jika Anda baru saja membuat cabang dari cabang lain, ucapkan "master" dan cabang Anda saat ini tidak ada pada repositori jarak jauh, ia akan membandingkan remote " master " vs remote " branch2 ".

Semoga bermanfaat.

Dharmender Rawat
sumber
0

Untuk membandingkan dua file di git bash, Anda perlu menggunakan perintah:

git diff <Branch name>..master -- Filename.extension   

Perintah ini akan menunjukkan perbedaan antara dua file di bash itu sendiri.

Rishav_SO
sumber