git difftool, segera buka semua file diff, bukan serial


240

Perilaku git diff default adalah membuka setiap file diff dalam serial (tunggu file sebelumnya ditutup sebelum membuka file berikutnya).

Saya mencari cara untuk membuka semua file sekaligus - di BeyondCompare misalnya ini akan membuka semua file di tab dalam jendela BC yang sama.

Ini akan membuatnya lebih mudah untuk meninjau serangkaian perubahan yang kompleks; gulir cepat ke depan antara file diff dan abaikan file yang tidak penting.


"git diff" atau "git difftool"? Anda mungkin ingin memposting permintaan pada (buka untuk semua, dan dengan berbagai antarmuka web) git milis: git@vger.kernel.org
Jakub Narębski

Saya menggunakan "git difftool" untuk memicu aplikasi diff eksternal. Terima kasih atas gagasan milis.
Seba Illingworth

Akan sangat membantu untuk mengetahui platform. Pada platform berbasis Unix, saya akan menulis skrip untuk melakukan diff dan memerintahkan git untuk menggunakan skrip itu. Dalam skrip, saya hanya akan menjalankan diff di latar belakang lalu membiarkan skrip mati.
Chris Cleeland

Platform Windows, tapi terima kasih atas idenya Chris.
Seba Illingworth

Jawaban:


214

Mulai dengan gitv1.7.11, Anda dapat menggunakangit difftool --dir-diff untuk melakukan diff direktori.

Fitur ini berfungsi baik dengan Meld 3.14.2 misalnya, dan memungkinkan Anda menjelajahi semua file yang dimodifikasi:

git difftool --dir-diff --tool=meld HEAD~ HEAD

Ini adalah fungsi Bash yang berguna:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

Jawaban berikut ini berlaku untuk gitinstalasi yang lebih lama dari v1.7.11.


Pertanyaan yang sama ditanyakan pada daftar mail git .

Saya mengumpulkan skrip shell berdasarkan utas email yang melakukan direktori berbeda antara komit sewenang-wenang.

Dimulai dengan git v1.7.10, git-diffallskrip disertakan dalamcontrib instalasi standar git.

Untuk versi sebelum v1.7.10, Anda dapat menginstal dari git-diffallproyek di GitHub .

Berikut ini deskripsi proyeknya:

Script git-diffall menyediakan mekanisme diff berbasis direktori untuk git. Skrip bergantung pada opsi konfigurasi diff.tool untuk menentukan apa yang digunakan penampil dif.

Skrip ini kompatibel dengan semua formulir yang digunakan untuk menentukan rentang revisi yang berbeda:

1) git diffall: menunjukkan perbedaan antara pohon yang bekerja dan perubahan yang dipentaskan
2) git diffall --cached [<commit>]: menunjukkan perbedaan antara perubahan yang dipentaskan dan HEAD (atau komit bernama lainnya)
3) git diffall <commit>: menunjukkan perbedaan antara pohon yang bekerja dan komit yang disebut
4) git diffall <commit> <commit>: menunjukkan perbedaan antara dua komit yang disebut
5) git diffall <commit>..<commit>: sama seperti di atas
6) git diffall <commit>...<commit>: menunjukkan perubahan pada cabang yang mengandung dan sampai yang kedua, mulai dari nenek moyang yang sama dari keduanya<commit>

Catatan: semua formulir menggunakan pembatas jalur opsional [--] [<path>]

Skrip ini didasarkan pada contoh yang diberikan oleh Thomas Rast pada daftar Git .


Apa perbedaan antara git-diffall dan github.com/wmanley/git-meld ? Saya mencoba keduanya dan mereka tampaknya memberikan fungsi yang identik pada pandangan pertama.
kynan

5
Saya sangat menghargai naskah Anda. Terus terang, saya tidak dapat memahami mengapa Git tidak berperilaku dengan cara yang benar dalam hal ini (Mercurial melakukannya, dan telah melakukannya selama bertahun-tahun), saya juga tidak dapat memahami kurangnya minat dari komunitas Git.
Douglas

6
Pembaruan (mengenai git difftool --dir-diffdan Melampaui Pembandingan): Saya menghubungi Scooter Software (penulis Beyond Membandingkan) dan mereka mengatakan bahwa bcompare.exeitu bukan solusi yang didukung dan dapat menyebabkan masalah jika ada lebih dari satu perbedaan terbuka pada suatu waktu. Mereka berencana untuk menambahkan dukungan untuk folder berbeda bcomp.exedi versi masa depan (sementara itu, saya akan terus menggunakan bcompare.exesebagai solusi yang tidak didukung).
Peter Rust

4
@coin Saya baru saja menguji dengan Beyond Compare 4 dan --dir-diff tampaknya berfungsi dengan bcomp.exe yang didukung
Peter Rust

5
Hanya berkomentar untuk mengatakan itu --dir-diffbekerja dengan sempurna dengan Meld. Dari sana, itu akan membiarkan Anda memilih dan melihat diff untuk file individual.
mkasberg

61

Inilah yang saya pilih ...

Salin kode berikut ke file bernama git-diffall(tanpa ekstensi):

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

Tempatkan file di cmdfolder dir instalasi git Anda (mis. C:\Program Files (x86)\Git\cmd)

Dan gunakan seperti yang Anda inginkan git diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

Catatan: Kunci untuk itu adalah & param yang memberi tahu perintah diff eksternal untuk berjalan dalam tugas latar belakang sehingga file diproses segera. Dalam kasus BeyondCompare ini membuka satu layar dengan setiap file di tabnya sendiri.


Terima kasih telah memposting. Sayangnya, itu tidak bekerja dengan opsi -s WinMerge. Semua file temp kecuali yang pertama dihapus sebelum WinMerge dapat melihatnya.
Carlos Rendon

Carlos: Saya menggunakan WinMerge dengan Git. Pendekatan saya adalah menambahkan 'sleep 1' setelah meluncurkan WinMerge (yang dalam kasus saya tampaknya sudah diluncurkan "di latar belakang" - tidak perlu untuk &). Dengan cara ini file sementara hanya cukup lama bagi WinMerge untuk mengambilnya sekali (kecuali dalam kasus aneh). Itu juga berarti bahwa dibutuhkan 1 detik per file untuk membuka semuanya. Ini adalah hack jahat (saya tidak akan pernah menyajikannya sebagai "jawaban"!), Tetapi yang mudah, cukup efektif.
Woody Zenfell III

2
Untuk digunakan di Linux, dengan Git 2.x, saya harus membuat sedikit modifikasi: ubah "$filename"ke "../$filename". Kemudian itu bekerja dengan sempurna dengan Beyond Compare
Dave C

1
@DaveC di utas aslinya dikatakan "menyimpan file dalam folder cmd git install Anda" dan mulai dengan contoh di windows. Di mana Anda menyimpan file "git-diffall" di Linux?
m4l490n

2
Apakah kita perlu me-restart windows setelah menambahkan git-diffallfile ke C:\Program Files\Git\cmdfolder? Saya melakukan persis seperti yang diperintahkan tetapi setelah melakukan $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
nesdis

19

meld memiliki fitur yang rapi bahwa jika Anda memberikannya direktori di bawah kendali sumber (Git, Mercurial, Subversion, Bazaar dan mungkin yang lainnya) secara otomatis akan mencantumkan semua file yang diubah dan Anda dapat mengklik dua kali untuk melihat perbedaan masing-masing.

IMO jauh lebih mudah untuk mengetik meld .dan membuatnya tahu VCS daripada mengkonfigurasi VCS Anda untuk diluncurkan meld. Plus, Anda dapat menggunakan perintah yang sama apa pun VCS yang digunakan oleh proyek Anda, yang sangat bagus jika Anda sering berpindah di antara mereka.

Satu-satunya downside adalah lebih lambat untuk berbaur untuk memindai perubahan daripada melewati perubahan dari git / hg / svn, meskipun apakah itu cukup lambat untuk menjadi masalah akan tergantung pada bagaimana Anda menggunakannya saya yakin.


4
Bagi saya downside utama adalah bahwa berbaur (untuk alasan apa pun) membuka diff di jendela baru, bukan tab baru dan setelah menutup diff, file di direktori kerja terbuka di tab baru dengan pesan popup yang mengganggu sebelumnya.
kynan

alat yang bagus tetapi instalasi Windows yang mengerikan (pada awal 2012).
Wernight

@ kynan Ini sepertinya solusi sempurna untuk cara agnostik VCS yang berbeda jika bukan karena masalah jendela sembulan jendela ganda yang menjengkelkan itu. Memalukan. :(
PKKid

Fitur hebat dari meld adalah filter diff-nya: abaikan perubahan misalnya dalam komentar atau tambahkan / hapus baris kosong, yang git difftidak menawarkan.
kynan

1
Saya telah menggunakan pendekatan ini selama satu tahun atau lebih; ini berfungsi dengan baik untuk proyek yang lebih kecil tetapi begitu Anda memiliki proyek besar (yaitu banyak file) itu sangat lambat karena secara manual "memindai" untuk git diffs (tidak yakin mengapa ini mengambil pendekatan ini ketika git jelas dapat menyediakannya dengan daftar file langsung ...)
namuol

3

Saya memang menemukan metode ini (GitDiff.bat dan GitDiff.rb) yang menyalin file ke direktori temp lama / baru dan kemudian melakukan perbandingan folder pada mereka.

Tapi saya lebih suka melihat file yang bekerja secara langsung (dari dir yang berfungsi), karena BeyondCompare memiliki fitur yang berguna untuk dapat mengedit file dari dalam jendela diff yang sangat bagus untuk pembersihan cepat.

Sunting: metode serupa di sini dalam menanggapi pertanyaan saya di milis git.



2

Melihat di sini bahwa Araxis Merge memiliki opsi perintah '-sekarang':

-Sekarang Tunggu Mencegah dibandingkan dari menunggu perbandingan ditutup

Mungkin ini mengembalikan kode keluar langsung dan akan bekerja, ada yang mengalami ini? Tidak dapat menemukan opsi serupa untuk BeyondCompare ...


2

Diffuse juga memiliki integrasi VCS. Ini bekerja sama dengan kebanyakan VCS lainnya, termasuk SVN, Mercurial, Bazaar, ... Untuk Git, ia bahkan akan menampilkan tiga panel jika beberapa tapi tidak semua perubahan dilakukan. Dalam kasus konflik, bahkan akan ada empat panel.

Cuplikan layar difus dengan pengeditan bertahap dan tidak bertahap

Meminta dengan

diffuse -m

di copy pekerjaan Git Anda.

Jika Anda bertanya kepada saya, perbedaan visual terbaik yang pernah saya lihat selama satu dekade. (Dan saya sudah mencoba berbaur juga.)


Bisakah Anda memberi tahu bagian mana dari difus yang Anda sukai, terutama saat berbaur?
musiphil

@musiphil: Saya suka kesederhanaannya - sepertinya memiliki set fitur yang dibutuhkan untuk menyelesaikan tugas, tidak lebih, tetapi juga tidak kurang. (Seperti penyelarasan perbedaan dan lebar ukuran tab.) Saya tidak ingat mengapa saya beralih dari berbd, dan saya belum menggunakan berbd sejak itu jadi saya tidak bisa benar-benar membandingkannya sekarang.
krlmlr

1
Diffuse bekerja dengan git tanpa konfigurasi apa pun. Diffuse -m membuka satu jendela dengan git diff di tab yang berbeda; sementara alat-alat lain membutuhkan terlalu banyak konfigurasi untuk memulai.
mosh

1

Jika semua yang ingin Anda lakukan adalah membuka semua file yang sedang dimodifikasi, coba sesuatu seperti:

vi $ (status git | sed -n '/.* dimodifikasi: * / s /// p')

Jika Anda melakukan "set perubahan kompleks", Anda mungkin ingin mempertimbangkan kembali alur kerja Anda. Salah satu fitur yang sangat bagus dari git adalah membuatnya mudah bagi pengembang untuk mengurangi set perubahan kompleks menjadi serangkaian tambalan sederhana. Daripada mencoba mengedit semua file yang saat ini dimodifikasi, Anda mungkin ingin melihat

git tambahkan --patch
yang akan memungkinkan Anda untuk secara bertahap mementaskan bakhil.


1

Saya telah menulis skrip PowerShell yang akan menduplikasi dua pohon yang bekerja dan membandingkannya dengan DiffMerge. Jadi kamu bisa melakukan:

GitNdiff master~3 .

Sebagai contoh, untuk membandingkan cabang utama tiga checkin yang lalu dengan pohon yang sedang bekerja.

Ini mengkilap dan baru dan mungkin penuh dengan bug. Salah satu kelemahannya adalah bahwa file di pohon kerja Anda yang belum ditambahkan disalin ke kedua pohon kerja. Ini juga bisa lambat.

http://github.com/fschwiet/GitNdiff


1

Bagi mereka yang tertarik menggunakan git-diffall pada Mac OS X dengan Araxis, saya memotong proyek git-diffall di github dan menambahkan AppleScript yang membungkus perintah Gabung Araxis. Catatan: ini adalah tiruan sedikit dimodifikasi dari araxisgitdifffile yang dikirimkan bersama Araxis Merge untuk Mac OS X.

https://github.com/sorens/git-diffall


1

Berikut ini berfungsi dengan berbaur dan kdiff3

git difftool --dir-diff origin/branch1..origin/branch2

Buka semua file di jendela yang dapat Anda jelajahi dengan mudah. Dapat digunakan dengan perubahan di tempat asal / nama cabang

misalnya: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1


-2

Anda dapat menggunakan gitk dan melihat semua perbedaan secara bersamaan


3
Ya saya menemukan gitk berguna, tetapi ketika datang ke diff-ing BC adalah apa yang ingin saya lihat :)
Seba Illingworth
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.