Chciałbym użyć „diff”, aby uzyskać zarówno różnicę między wierszami, jak i różnicę znaków. Weźmy na przykład pod uwagę:
Plik 1
abcde
abc
abcccd
Plik 2
abcde
ab
abccc
Używając diff -u otrzymuję:
@@ -1,3 +1,3 @@
abcde
-abc
-abcccd
\ No newline at end of file
+ab
+abccc
\ No newline at end of file
Jednak pokazuje mi tylko, że były to zmiany w tych liniach. Chciałbym zobaczyć coś takiego:
@@ -1,3 +1,3 @@
abcde
-ab<ins>c</ins>
-abccc<ins>d</ins>
\ No newline at end of file
+ab
+abccc
\ No newline at end of file
Masz mój dryf.
Teraz wiem, że mogę użyć innych silników, aby zaznaczyć / sprawdzić różnicę na określonej linii. Ale wolałbym użyć jednego narzędzia, które zrobi to wszystko.
text
command-line
diff
VitalyB
źródło
źródło
Odpowiedzi:
Git ma słowo diff, a definiowanie wszystkich znaków jako słów skutecznie daje ci różnicę między znakami. Jednak zmiany nowej linii są ignorowane .
Przykład
Utwórz takie repozytorium:
Teraz zrób,
git diff --word-diff=color --word-diff-regex=. master^ master
a otrzymasz:Zwróć uwagę, jak zarówno dodania, jak i usunięcia są rozpoznawane na poziomie znaku, podczas gdy zarówno dodawanie, jak i usuwanie nowych linii są ignorowane.
Możesz także spróbować jednego z tych:
źródło
git diff --word-diff=color --word-diff-regex=. file1 file2
--no-index
do odpowiedzi @ qwertzguys powyżej, aby działała dla mnie poza repozytorium git. A więc:git diff --no-index --word-diff=color --word-diff-regex=. file1 file2
--no-index
wnętrze repozytoriumMożesz użyć:
colordiff
to pakiet Ubuntu. Możesz go zainstalować za pomocąsudo apt-get install colordiff
.diff-highlight
pochodzi z gita (od wersji 2.9). Znajduje się w/usr/share/doc/git/contrib/diff-highlight/diff-highlight
. Możesz go umieścić gdzieś w swoim$PATH
.źródło
brew install colordiff
diff-highlight
w$(brew --prefix git)/share/git-core/contrib/diff-highlight/diff-highlight
diff-highlight
może być również zainstalowany z pip Pythona -pip install diff-highlight
(wolę to nawet jeśli jest zainstalowany git poprzez wywaru)Różnica w Pythonie jest asem, jeśli chcesz to zrobić programowo. Do użytku interaktywnego używam trybu diff vima (dość łatwy w użyciu: po prostu wywołaj vim za pomocą
vimdiff a b
). Od czasu do czasu używam Beyond Compare , który robi prawie wszystko, czego można oczekiwać od narzędzia porównywania.Nie widziałem żadnego narzędzia wiersza poleceń, które robi to pożytecznie, ale jak zauważa Will, przykładowy kod difflib może pomóc.
źródło
Możesz użyć
cmp
polecenia w Solarisie:źródło
cmp
jest również dostępny w (przynajmniej niektórych) dystrybucjach Linuksa.-l -b
.Python ma wygodną bibliotekę nazwaną,
difflib
która może pomóc odpowiedzieć na twoje pytanie.Poniżej znajdują się dwa onelinery używające
difflib
różnych wersji Pythona.Mogą się one przydać jako alias powłoki, który łatwiej jest poruszać się po
.${SHELL_NAME}rc
.I bardziej czytelna wersja do umieszczenia w samodzielnym pliku.
źródło
Pracował dobrze dla mnie. Liczba znajdująca się po lewej stronie wyniku wskazuje liczbę znaków, które się różnią.
źródło
cmp -l file1 file2 | wc -l
Napisałem również własny skrypt, aby rozwiązać ten problem za pomocą algorytmu Najdłuższy wspólny podciąg.
Jest wykonywany jako taki
JLDiff.py a.txt b.txt out.html
Wynik jest w html z czerwono-zielonymi kolorami. Większe pliki wykładniczo zajmują więcej czasu na przetworzenie, ale robi to prawdziwe porównanie znak po znaku bez sprawdzania linii po linii.
źródło
Kolorowe wyjście na poziomie postaci
diff
Oto, co możesz zrobić z poniższym skryptem i diff-highlight (który jest częścią git):
( Podziękowania dla odpowiedzi @ retracile za
sed
wyróżnienie)źródło
command | gvim -
zrobisz, co chcesz.git
ścieżki, ale nie jest na niej umieszczony. Jedna moja maszyna w tym życiu/usr/share/doc/git/contrib/diff-highlight
.Difflib Pythona może to zrobić.
Dokumentacja zawiera przykładowy program wiersza poleceń .
Dokładny format nie jest taki, jak podałeś, ale byłoby proste albo przeanalizować wyjście w stylu ndiff, albo zmodyfikować przykładowy program w celu wygenerowania notacji.
źródło
Oto narzędzie do porównywania tekstu online: http://text-compare.com/
Może wyróżnić każdy inny znak i kontynuować porównywanie pozostałych.
źródło
catdog
icat\ndog
będzie pasował dopierocat
Myślę, że prostsze rozwiązanie jest zawsze dobrym rozwiązaniem. W moim przypadku poniższy kod bardzo mi pomaga. Mam nadzieję, że pomoże to komukolwiek innemu.
Możesz porównać dwa pliki o następującej składni na swoim ulubionym terminalu:
źródło
Jeśli przechowujesz swoje pliki w Git, możesz porównywać wersje za pomocą skryptu diff-highlight , który pokaże różne linie, z podświetlonymi różnicami.
Niestety działa to tylko wtedy, gdy liczba usuniętych wierszy jest zgodna z liczbą dodanych wierszy - istnieje kod pośredniczący, który oznacza, że wiersze nie pasują, więc prawdopodobnie można to naprawić w przyszłości.
źródło
Nie jest to pełna odpowiedź, ale jeśli
cmp -l
wynik nie jest wystarczająco jasny, możesz użyć:źródło
Większość z tych odpowiedzi wspomina o użyciu diff-highlight , modułu Perla. Ale nie chciałem wymyślić, jak zainstalować moduł Perla. Więc wprowadziłem kilka drobnych zmian, aby był samodzielnym skryptem Perla.
Możesz go zainstalować za pomocą:
I użycie (jeśli masz Ubuntu
colordiff
wymienione w odpowiedzi zhanxw):I użycie (jeśli nie):
źródło