Powiedzmy, że mam łatkę utworzoną za pomocą git format-patch
. Plik jest w zasadzie ujednoliconym plikiem różnicowym z niektórymi metadanymi. Jeśli otworzę plik w Vimie, widzę, które linie zostały zmodyfikowane, ale nie mogę zobaczyć, które znaki w zmienionych wierszach się różnią. Czy ktoś zna sposób (w Vimie lub innym bezpłatnym oprogramowaniu działającym w systemie Ubuntu) na wizualizację różnic dla poszczególnych znaków?
Przykładem licznika, w którym różnica na znak jest wizualizowana, jest wykonanie vimdiff a b
.
aktualizacja pt., 12 listopada, 22:36:23 UTC 2010
diffpatch jest pomocny w scenariuszu, w którym pracujesz z jednym plikiem.
aktualizacja czw., 16 czerwca, 17:56:10 UTC 2016
Sprawdź diff-highlight w git 2.9 . Ten skrypt robi dokładnie to , czego początkowo szukałem.
git diff --color-words
jest bardzo przydatne, aby zobaczyć, jakie słowa zmieniają się w wierszach, zamiast zwykłego ujednoliconego wyniku różnicowego. Jest on jednak oparty na słowach, a nie znakach, więc jeśli w treści, którą porównujesz, nie ma zbyt wielu białych znaków, wynik może być mniej czysty. (Edytowano: Ups, widzę, że źle zrozumiałem, o co prosisz - niemniej może ten komentarz byłby dla kogoś przydatny.)Odpowiedzi:
Biorąc pod uwagę twoje odniesienia do Vima w pytaniu, nie jestem pewien, czy to jest odpowiedź, której chcesz :) ale Emacs może to zrobić. Otwórz plik zawierający diff, upewnij się, że jesteś w
diff-mode
(jeżeli plik jest nazwanyfoo.diff
lubfoo.patch
dzieje się automatycznie, w przeciwnym razie wpisz M-xdiff-mode
RET), przejdź do przystojniak jesteś zainteresowany i trafiła C-c C-bdorefine-hunk
. Lub przechodź przez plik po kolei za pomocą M-n; który dokona rafinacji automatycznie.źródło
git log master.. -p | emacs -
M-!
aby uruchomić polecenie i przechwycić wyjście do bufora.W git możesz scalać bez zatwierdzania. Najpierw scal swoją łatkę, a następnie wykonaj:
Zwróć uwagę na kropkę po znaku równości.
źródło
git diff --color-words=.
.git diff --color-words=.
igit diff --color-words .
działa inaczej. Lepiej jestgit diff --color-words .
.git diff --color-words .
jest naprawdę to samo cogit diff --color-words -- .
! To.
znaczy , jest interpretowane jako ścieżka. Możesz zweryfikować za pomocąmkdir x y; echo foo > x/test; git add x/test; git commit -m test; echo boo > x/test; cd y; git diff --color-words=.; git diff --color-words .; git diff --color-words -- .
.Oto niektóre wersje z mniej hałaśliwe niż wyjście
git diff --word-diff-regex=<re>
i że wymagają mniej niż pisanie, ale są równoważne,git diff --color-words --word-diff-regex=<re>
.Proste (podkreśla zmiany przestrzeni):
Prosty (podkreśla indywidualne zmiany znaków; nie podkreśla zmian spacji):
Bardziej złożone (podkreśla zmiany przestrzeni):
Ogólnie:
gdzie
<re>
jest wyrażeniem regularnym definiującym „słowa” w celu identyfikacji zmian.Są one mniej hałaśliwe, ponieważ kolorują zmienione „słowa”, podczas gdy po prostu
--word-diff-regex=<re>
otaczają dopasowane „słowa” kolorowymi-/+
znacznikami.źródło
--color-words
, bez=.
roli.git diff --color-words='\w'
działałby lepiej ze znakami diakrytycznymi (git v1.7.10.4)--word-diff=plain
aby dodatkowo mieć[-
i-]
otaczać usunięcia{+
i+}
otaczające dodatki. Jednak, jak ostrzega instrukcja, faktycznym wystąpieniom tych separatorów w źródle nie udało się w żaden sposób uniknąćPowyższe wyrażenie regularne ( od Thomasa Rasta ) wykonuje dobrą robotę, oddzielając fragmenty różnic na poziomie interpunkcji / znaku (nie będąc tak hałaśliwym jak
--word-diff-regex=.
).Zamieściłem zrzut wynikowej tutaj .
Aktualizacja:
Ten artykuł zawiera kilka świetnych sugestii. W szczególności
contrib/
drzewo repozytorium git zawieradiff-highlight
skrypt w języku Perl, który wyświetla szczegółowe informacje.Szybki start korzystania z niego:
źródło
--color-words=[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
'
tam wartość na początku. w przeciwnym razie wystąpił błąd. Ponadto, po prostu używam--color-words
i otrzymuję dokładnie to samo zachowanie, co przy użyciu tego wyrażenia regularnego.foo.bar
nafoo.qux
, zobaczysz różnicę.git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
./usr/local/share/git-core/contrib/diff-highlight/diff-highlight
. To zdaje się sugerować, że nie jest git Homebrew zainstalować całą contrib w/usr/local/share/git-core/contrib/
. Więc w końcu dodaje pracował dla mniegit diff --color=always | /usr/local/share/git-core/contrib/diff-highlight/diff-highlight
Jeśli nie masz nic przeciwko instalacji NodeJS, istnieje pakiet o nazwie „diff-so-fancy” ( https://github.com/so-fancy/diff-so-fancy ), który jest bardzo łatwy w instalacji i działa doskonale:
Edycja: Właśnie się dowiedziałem, że to w rzeczywistości opakowanie dla oficjalnego wyróżnienia różnic ... Przynajmniej jest łatwiejsze do zainstalowania dla perlofobów takich jak ja, a strona GitHub jest ładnie udokumentowana :)
źródło
Nie znam narzędzia do różnicowania znaków, ale istnieje narzędzie do różnicowania słów: wdiff.
zobacz przykłady 4 Najważniejsze narzędzia różnicowania plików w systemie UNIX / Linux - Diff, Colordiff, Wdiff, Vimdiff .
źródło
wdiff old_file new_file | cdiff
*vimdiff
, a następnie wewnątrz vim:windo wincmd K
, aby przełączyć się na pionowy układ okna (jeden pod drugim) jeden obok drugiego. Ten układ jest znacznie lepszy dla plików z długimi wierszami.wdiff2
,mdiff
, a narzędzie online Google'a .Po krótkich badaniach zauważyłem, że to pytanie pojawiło się ostatnio dwukrotnie na głównej liście mailingowej Vima. Wtyczki NrrwRgn wspomniano oba razy (marka dwa wąskie regiony i ich diff). Korzystanie z NrrwRgn zgodnie z opisem Christiana Brabandta wydaje się bardziej obejściem niż rozwiązaniem, ale może to wystarczy.
Wypróbowałem NrrwRgn i razem z: diffthis było rzeczywiście przydatne do zilustrowania różnic między znakami w częściach pojedynczego pliku. Ale wymagało to wielu naciśnięć klawiszy. Mój Vimscript jest dość zardzewiały, ale prawdopodobnie zawiera skrypt. Może NrrwRgn można ulepszyć, aby zapewnić pożądaną funkcjonalność.
Myśli?
źródło