Melihat semua `git diffs` dengan vimdiff

210

Saya mengatur git diffuntuk membungkus ke vimdiff, menggunakan " Git Diff dengan Vimdiff " sebagai panduan, dan itu berfungsi seperti yang diharapkan kecuali ada banyak file dengan perubahan.

Ketika ada banyak file dengan perubahan dan saya jalankan git diff, itu membuka file pertama dan, setelah berhenti dari contoh pertama vimdiff, saya disajikan dengan pesan berikut:

external diff died, stopping at filename

Ini adalah perilaku yang sangat berbeda dari yang biasa saya lakukan. Saya memiliki pengaturan yang sama di masa lalu dengan SVN dan, ketika berbeda dengan banyak file, saya akan meninjau file pertama, kemudian menulis dan berhenti menggunakan :wqdan file berikutnya dengan perbedaan akan terbuka.

Ini tidak terjadi dengan Git. Saya sudah mencoba :n[ext], tetapi hal itu tidak memenuhi jendela kiri dengan file asli sehingga dapat berbeda dengan versi yang dimodifikasi.

chuckg
sumber

Jawaban:

338
git config --global diff.tool vimdiff
git config --global difftool.prompt false
git config --global alias.d difftool

Mengetik git dmenghasilkan perilaku yang diharapkan, mengetikkan :wqsiklus vim ke file berikutnya di changeset.

chuckg
sumber
22
Hanya dua sen saya: Saya telah dfalias diffdan dtalias difftool. Mengetik :qadalam Vim juga akan menggulir ke perubahan berikutnya tanpa menyimpan apa pun.
JC Yamokoski
2
Solusi ini sangat bagus kecuali bahwa ketika menyimpan perubahan Anda harus mengetikkan ": w!" bukannya: w
Asenar
2
@jonyamo Setting alias harus selalu didasarkan pada seberapa sering kita menggunakan beberapa perintah. Saya sering menggunakan git diffdaripada git difftool. Jadi saya telah alias d'diff' dan 'dt' to difftool '. Kegunaan lebih penting daripada menciptakan alias dengan pola.
Habeeb Perwad
Bagaimana cara membuat "git diff" menggunakan vimdiff ?, jawaban ini membuat saya menggunakan alias. Jika saya alias "diff" tidak berfungsi.
Rombus
6
@Asenar "Solusi ini sangat bagus kecuali saat menyimpan perubahan, Anda harus mengetik :w!alih-alih :w". Itu karena git memanggil vimdiffdengan -Ropsi. Anda dapat menimpanya dengan git config --global difftool.vimdiff.cmd 'vimdiff "$LOCAL" "$REMOTE"'. Itu akan membuka vimdiff dalam mode tulis.
wisbucky
103

Anda dapat mencoba git difftool, ini dirancang untuk melakukan hal ini.

Pertama, Anda perlu mengkonfigurasi alat diff untuk vimdiff

git config diff.tool vimdiff

Kemudian, ketika Anda ingin melakukan diff, cukup gunakan git difftoolsebagai ganti git diff. Ini akan berfungsi seperti yang Anda harapkan.

czchen
sumber
1
Hampir sampai! Dimodifikasi sedikit itu persis apa yang saya cari. +1 meskipun!
chuckg
1
Vimdiff mergetool baru-baru ini diperbarui: git.kernel.org/?p=git/… (dan beberapa commit lainnya, tapi itu yang terbesar). Tidak yakin kapan rilis pemeliharaan berikutnya akan dilakukan, tetapi jika Anda ingin membangun dari git.git, pemutakhiran akan menjadi milik Anda!
Cascabel
21
Git accepts kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge,
and opendiff as valid diff tools. You can also set up a custom tool. 

git config --global diff.tool vimdiff
git config --global diff.tool kdiff3
git config --global diff.tool meld
git config --global diff.tool xxdiff
git config --global diff.tool emerge
git config --global diff.tool gvimdiff
git config --global diff.tool ecmerge
Nanhe Kumar
sumber
3
Anda menjawab untuk mergetool, bukan difftool. Tetapi ini masih merupakan jawaban yang bermanfaat. +1.
dotancohen
@dotancohen Benar-benar Terima kasih saya tidak pernah memperhatikan bahwa pada kesalahan konyol sekarang saya dapat mengedit jawaban saya.
Nanhe Kumar
1
@NanheKumar, @dotancohen, mengganti mergedengan diffjawaban di atas akan melakukan trik, yaitu git config --global diff.tool vimdiff .
Will
2

Untuk orang yang ingin menggunakan alat diff lain yang tidak terdaftar di git, katakan dengan nvim. inilah yang akhirnya saya gunakan:

git config --global alias.d difftool -x <tool name>

Dalam kasus saya, saya mengatur <tool name>ke nvim -ddan memanggil perintah diff dengan

git d <file>
ikan asin-kucing
sumber