Wenn ich ein Git-Diff mache, werden Linien hinzugefügt, die hinzugefügt wurden:
+ this line is added
Linien, die entfernt wurden:
- this line is removed
es werden aber auch viele Zeilen angezeigt, die nicht geändert werden:
this line is not modified
this line is also not modified
Dies führt dazu, dass der tatsächliche Git-Diff ungefähr so aussieht:
+ this line is added
this line is not modified
- this line is removed
this line is not modified
Kann ich git bitten, nur geänderte Zeilen anzuzeigen und den gesamten anderen Code zu ignorieren, der nicht geändert wurde? Ich habe eine Methode geschrieben, mit der alle Zeilen entfernt werden, vor denen kein "+" oder "-" steht, aber ich bin sicher, dass es einen einfacheren Weg geben muss, dies zu tun.
In meinem Git Diff bin ich nur daran interessiert, die Zeilen zu sehen, die geändert wurden.
Danke im Voraus.
git diff | egrep "^(\+|-) "
.git config --global diff.context 0
um es global einstellen zu lassenEin weiterer Hack (auf un * x), um nur die Zeilen anzuzeigen, die mit
+
und beginnen-
:Der obige Code bewirkt Folgendes:
git diff -U0
: Wählen Sie 0 Kontextzeilen+
oder beginnen-
--- a/
oder beginnen+++ b/
Farbe
Versuchen Sie Folgendes, um farbige Unterschiede anzuzeigen:
^\e\[[^m]*m[-+]
sucht nach dem Anfang von Zeile (^
), dann nach dem Escape-Zeichen (\e
), gefolgt von[
dem gemeinsamen Start der Escape-Sequenz, dann nach jedem Zeichen, das kein "m" ist (Zahlen, Semikolons oder nichts), gefolgt von einem " m ", wodurch die Escape-Sequenz beendet wird.\e[0m
(Zurücksetzen),\e[m
(auch Zurücksetzen),\e[1m
(Fettdruck),\e[31m
(Rot),\e[32m
(Grün),\e[9;31m
(Durchgestrichen + Rot),\e[31;9m
(Rot + Durchgestrichen),\e[1;4;9;31m
(Fett + unterstreichen + streichen + rot). Die Standard-Git-Farben verwenden Rot und Grün, können jedoch neu konfiguriert werden.--color
ist das gleiche wie--color=always
.--- a/
oder+++ b/
am Anfang der Zeile wurde entfernt, um die Escape-Sequenzen zu berücksichtigen, und dies könnte zu einem Randfall führen.Zusätzliche Bemerkungen:
-R
,--src-prefix
,--dst-prefix
,--no-prefix
, usw.grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )'
, aber ich finde die Double Grep-Version leichter zu verstehen.quelle
git diff
Zeilen vom Typ "Header", die mit beginnen@@
, aber was sindgit diff
Zeilen, die mit---
oder beginnen+++
? Ich war mir dieser nicht bewusst.+++
) oder deletions (---
) enthalten. Ich sehe das jetzt hier: git-scm.com/docs/git-diff#_combined_diff_format .--- a/filename
Scheint die "Datei links" oder die Datei wie zuvor+++ b/filename
zu bezeichnen und scheint die "Datei rechts" oder die Datei zu bezeichnen, wie sie jetzt mit Ihren Änderungen ist. Ich bin es so gewohnt,git difftool
mit meld zu arbeiten , das schöne Vergleiche nebeneinander zeigt, dass ich mich nie wirklich daran gewöhnt habe, es anzuschauengit diff
, also sieht es für mich immer noch seltsam aus, und ich habe diese Nuancen noch nie wirklich angeschaut.Nach Chris 'jüngstem Kommentar besteht das Hauptproblem bei der Nachbearbeitung darin, dass Sie die Zeilen am Anfang halten möchten,
-|+
aber auch diejenigen herausfiltern möchten, die mit beginnen---|+++
. Wenn Sie Patch-Dateien in Ihrem Repo speichern (ich in Pydoop ), möchten Sie andererseits Zeilen--|++
beibehalten , die mit beginnen , damit der reguläre Ausdruck ein wenig kompliziert wird:Der reguläre Ausdruck verwendet einen negativen Lookahead: Eine ausführliche Erklärung finden Sie in der Antwort von Peter Boughton auf diese Frage .
Wenn Sie dies häufig tun, möchten Sie möglicherweise einen Git-Alias dafür einrichten:
quelle
-P
oder--perl-regexp
wird verwendet, um das Muster als regulären Perl-Ausdruck zu interpretieren, wird jedoch nicht immer implementiert. Unter OSX hat es bei mir nicht funktioniert. gnu.org/software/grep/manual/grep.html#grep-ProgramsIch denke, in einfachen Fällen kann der reguläre Ausdruck viel kürzer und leichter zu merken sein, mit der Einschränkung, dass dies nicht funktioniert, wenn Sie Linienänderungen haben, bei denen die Linie selbst mit
+
oder beginnt-
Die Regex sagt, dass die Zeile mit
+
oder beginnen-
sollte und das unmittelbar folgende Zeichen keines von diesen sein sollte. Ich habe die gleichen Ergebnisse erzielt, ob ich hier entkommen bin+
oder nicht, übrigens ...Beispiel:
Sagen wir, ich wechsle
C
zuX
,E
zuY
undG
zuZ
.Wie ich oben sagte, ist dies jedoch nur für die meisten Fälle. Wenn Sie diese Ausgabe an eine Datei
dout
weiterleiten und denselben regulären Ausdruck verwenden, funktioniert dies nicht.Wie auch immer, hoffe das hilft in deinem Fall
quelle
- name: No pdb
In einer Yaml-Datei.Diese Antwort behält die ursprünglichen rot / grünen Farben zur besseren Lesbarkeit bei. Ich habe einige Variationen in der Syntax angegeben:
Erläuterung:
git diff --color
ist notwendig , git , um zu verhindern , die Farbe zu deaktivieren , wenn es kochend.grep --color=never
soll verhindern , grep die ursprüngliche Farbe zu entfernen und Hervorhebung der gefundenen String.\e[31m
) oder grünen (\e[32m
) Escape-Codes beginnen.$'...'
(ANSI-C-Anführungszeichen-Syntax) oder-P
(Perl-Syntax) istgrep
zu interpretieren\e
oder\033
alsESC
Zeichen.quelle
$''
Teil hat mir besonders geholfen. stackoverflow.com/a/61929887/4561887So verwenden Sie
awk
nur die+
und-
-Linien unter Berücksichtigung von Farb- oder Textformatierungengit diff
:Keine der anderen Antworten hier (einschließlich meiner anderen Antwort ) wird genau das tun, was Sie zu 100% wollen. Diese Antwort wird jedoch. Hier ist ein 1-Liner, den Sie kopieren und in Ihr Terminal einfügen können. Ich habe es aus Gründen der Lesbarkeit nur aus mehreren Zeilen gemacht - Sie können es auf die gleiche Weise kopieren und einfügen, damit ich es genauso gut lesbar machen kann! Es basiert auf der
awk
Programmiersprache:Hier sind seine Funktionen. Alle diese Merkmale lösen zusammen die Mängel jeder anderen Antwort hier:
^(\033\[(([0-9]{1,2};?){1,10})m)?
git config
Einstellungen festlegen können . Deshalb ist der regex oben hat;?
und{1,10}
darin: wenn es den Beginn einer Farbe oder Textformatierung Code erkennt, wird es bis zu 10 Sequenzen dieses kombinierten ANSI - Codes entspricht.Es enthält NICHT auch Zeilen, die mit
@@
und dem Wort beginnendiff
, wie es die akzeptierte Antwort tut. Wenn Sie diese Zeilen wollen (was ich ehrlich gesagt für nützlich halte :)), tun Sie stattdessen Folgendes:oder
Es zeigt die Ausgabe genauso an wie
git diff
imless
Pager mit optionaler Farbausgabe (-R
) und nur, wenn der Text> 1 Seite (-F
) ist und während Sie die aktuelle Textseite auf dem Bildschirm beibehalten, wenn Sieq
uit (-X
) .Es hat auch den Vorteil, dass es leistungsstark und einfach zu konfigurieren ist, da es die Programmiersprache awk verwendet.
Wenn Sie awk lernen möchten , finden Sie hier einige Ressourcen:
gawk
(GNUawk
) Handbuch: https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contentsgit diffn
und die darin enthaltenen Kommentare: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.shgit diffn
, wasgit diff
mit Zeilennummern ist, sehen Sie hier: Git Diff mit Zeilennummern (Git-Protokoll mit Zeilennummern)Als Bonus habe ich auch das Obige eingepackt, um es als zu verwenden
git diffc
, was bedeutet "git diff, um NUR 'c'hanges zu zeigen". Verwendung ist identisch mitgit diff
; benutzegit diffc
stattdessen einfach ! Es unterstützt ALLE Optionen. Die Farbe ist standardmäßig eingeschaltet. Zum Ausschalten verwenden Sie einfachgit diffc --no-color
odergit diffc --color=never
. Sieheman git diff
für Details.Da ich gestern Abend gerade fertig war
git diffn
(ein Tool zumgit diff
Anzeigen mit Zeilen und Zahlen), war das Schreibengit diffc
trivial. Ich dachte, ich mache es jetzt besser, während das Wissen in meinem Kopf frisch ist.Installieren
git diffc
:Befolgen Sie die Anweisungen am Ende dieser Antwort hier , außer überall, wo Sie
git-diffn
in den Anweisungen sehen, verwenden Siegit-diffc
stattdessen. Das schließt auch denwget
Befehl ein. Das Herunterladen und Installierengit diffc
ist einfach: Es sind nur ein paar Befehle.quelle
Hier ist eine andere, einfachere Möglichkeit, nur Linien zu finden, die geändert wurden, und daher mit einem einzelnen
+
oder zu beginnen-
, während die Farbausgabe beibehalten wird:-U0
sagt, dass 0 Kontextzeilen um die geänderten Zeilen eingeschlossen werden sollen - dh: nur die geänderten Zeilen selbst einschließen. Sieheman git diff
.-E
for grep kann mit erweiterten regulären Ausdrücken gearbeitet werden$''
Syntax erlaubt anscheinend ANSI-Anführungszeichen, wodurch das ESC-Zeichen (Escape oder 0x1b) richtig interpretiert wird. Siehe hier .^
dem Zeilenanfang,\e
stimmt mit dem Escape-Zeichen überein, das der Beginn eines Farbcodes im Terminal ist,\[
stimmt mit dem nächsten Zeichen im Farbcode überein[
, und dann(this|that)
stimmt die Syntax mit "dies" oder "das" überein. , wobei "dies" ist32m+
, was eine grüne + Linie und31m-
eine rote Linie ist.\e[32m
folgt : ist grün und\e[31m
ist rot.+
zeigtgit diff
natürlich Zeilen an, die als hinzugefügt markiert sind , und-
zeigt Zeilen, diegit diff
als gelöscht markiert sind .--color=never
ist ,grep
um zu verhindern, dass Übereinstimmungen hervorgehoben werden, da sonstgit diff
die von links eingehenden Farbcodes durcheinander geraten.+
muss ebenfalls maskiert werden,\+
da es sich ansonsten+
um ein spezielles reguläres Ausdruckszeichen (Regex) handelt, das ein oder mehrere Vorkommen des vorhergehenden Elements angibt . Siehe hier: https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts .Verweise:
Verbunden:
git-filechange-search.sh
- Ein Skript, mit dem Sie eine Datei nach einem Variablen- oder Funktionsnamen durchsuchen und herausfinden können, welche Commits Änderungen an diesem Variablen- oder Funktionsnamen enthalten. Ex. Verwendung: Hier./git-filechange-search.sh path/to/my/file.cpp variable_name
finden Sie alle Commits mit Änderungen an file.cpp, die darin enthaltenvariable_name
sind. Dies ist nützlich, um zu sehen, wo und wann bestimmte Funktionen geändert wurden. Es ist, als wäre es eine Suche, die Abschnitte einer Datei beobachten könnte, die imgit blame
Laufe der Zeit angezeigt werden .quelle