Wyświetlanie wszystkich `git diffs` za pomocą vimdiff

209

I setup git diffzawinąć do vimdiff, używając „ Git Diff z Vimdiff ” jako przewodnik, i to działa zgodnie z oczekiwaniami, chyba że istnieje wiele plików o zmianach.

Gdy jest wiele plików ze zmianami i uruchamiam git diff, otwiera pierwszy plik, a po wyjściu z pierwszej instancji vimdiff pojawia się następujący komunikat:

external diff died, stopping at filename

To jest zupełnie inne zachowanie niż jestem przyzwyczajony. W przeszłości miałem podobną konfigurację z SVN i, gdy różnicowałem się z wieloma plikami, sprawdzałem pierwszy plik, a następnie pisałem i wychodziłem z niego, :wqa następny plik z różnicami otwierał się.

Nie jest tak w przypadku Git. Próbowałem :n[ext], ale nie powoduje to wypełnienia lewego okna oryginalnym plikiem, dzięki czemu można go odróżnić od zmodyfikowanej wersji.

chuckg
źródło

Odpowiedzi:

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

Pisanie git ddaje oczekiwane zachowanie, wpisując :wqcykle vima do następnego pliku w zestawie zmian.

chuckg
źródło
22
Tylko moje dwa centy: dfalias do diffi dtalias do difftool. Również wpisanie :qaVima spowoduje przejście do następnego zestawu zmian bez zapisywania czegokolwiek.
JC Yamokoski
2
To rozwiązanie jest świetne, z wyjątkiem tego, że podczas zapisywania zmian należy wpisać „: w!” zamiast: w
Asenar
2
@jonyamo Ustawienie aliasu powinno zawsze zależeć od tego, jak często używamy niektórych poleceń. Często używam git diffniż git difftool. Więc aliasowałem ddo „diff” i 'dt' to difftool ”. Użyteczność jest ważniejsza niż tworzenie aliasów ze wzorem.
Habeeb Perwad
Jak zmusić „git diff” do użycia vimdiff ?, ta odpowiedź zmusza mnie do używania aliasu. Jeśli pseudonim „diff” nie działa.
Rombus
6
@Asenar „To rozwiązanie jest świetne, z wyjątkiem tego, że podczas zapisywania zmian należy wpisać :w!zamiast :w”. Jest tak, ponieważ git dzwoni vimdiffz -Ropcją. Możesz to zmienić za pomocą git config --global difftool.vimdiff.cmd 'vimdiff "$LOCAL" "$REMOTE"'. To otworzy vimdiff w trybie do zapisu.
wisbucky
103

Możesz spróbować git difftool, jest przeznaczony do tego.

Najpierw musisz skonfigurować narzędzie diff do vimdiff

git config diff.tool vimdiff

Następnie, jeśli chcesz się różnić, po prostu użyj git difftoolzamiast git diff. Będzie działać zgodnie z oczekiwaniami.

czchen
źródło
1
Prawie na miejscu! Trochę zmodyfikowałem, właśnie tego szukam. +1!
chuckg
1
Narzędzie do łączenia vimdiff zostało niedawno zaktualizowane: git.kernel.org/?p=git/… (i kilka innych zmian , ale to największe). Nie jestem pewien, kiedy pojawi się następne wydanie serwisowe, ale jeśli chcesz budować z git.git, aktualizacje będą twoje!
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
źródło
3
Odpowiadasz za połączenie, a nie za difftool. Ale to wciąż pomocna odpowiedź. +1.
dotancohen
@dotancohen Naprawdę dziękuję, nigdy nie zauważyłem, że po głupim błędzie mogę teraz edytować swoją odpowiedź.
Nanhe Kumar,
1
@NanheKumar, @dotancohen, zastępując mergeze diffw powyższych odpowiedziach rade, tj git config --global diff.tool vimdiff .
Czy
2

Dla osób, które chcą użyć innego narzędzia do porównywania niewymienionego w git, powiedz za pomocą nvim. oto, co skończyło się na użyciu:

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

W moim przypadku, zestaw <tool name>do nvim -di wywoływać polecenia diff z

git d <file>
słony kot-ryba
źródło