Bei neueren Git-Versionen können Sie git add -N
die Datei (oder --intent-to-add
) verwenden, die dem Index an dieser Stelle einen Blob mit der Länge Null hinzufügt. Das Ergebnis ist, dass Ihre "nicht verfolgte" Datei jetzt zu einer Modifikation wird, um den gesamten Inhalt zu dieser Datei mit der Länge Null hinzuzufügen. Dies wird in der Ausgabe "git diff" angezeigt.
git diff
echo "this is a new file" > new.txt
git diff
git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file
Wie bereits erwähnt, können Sie dies leider nicht tun, git stash
solange eine --intent-to-add
solche Datei ansteht. Wenn Sie etwas verstauen müssen, fügen Sie einfach die neuen Dateien hinzu und verstauen sie dann. Oder Sie können die Emulationsumgehung verwenden:
git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
(Das Einrichten eines Alias ist dein Freund hier).
git add -N .
Ich glaube, Sie können sich von Dateien in Ihrem Index und von nicht verfolgten Dateien unterscheiden, indem Sie einfach den Pfad zu beiden Dateien angeben.
quelle
git diff --no-index untracked_file_1 untracked_file_2
, umgit diff
Syntaxfarben usw. auf Diffs zu erhalten ... wunderschön./dev/null
stattdessen einfach Folgendes verwenden :git diff --no-index -- /dev/null <untracked_file>
.cat untracked_file_1
, oder vielleicht,printf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"
wenn Sie wirklich grünen Output brauchen. :) (Obwohl im Ernst, bitte beachten Sie, dass Befehlsersetzung die nachfolgenden Zeilenumbrüche aus Ihrer Datei entfernt.)Für mein interaktives tägliches Gitting (bei dem ich den Arbeitsbaum ständig gegen den HEAD differenziere und nicht verfolgte Dateien im Diff haben möchte)
add -N/--intent-to-add
ist es unbrauchbar, weil es kaputt gehtgit stash
.Also hier ist mein
git diff
Ersatz. Es ist keine besonders saubere Lösung, aber da ich sie wirklich nur interaktiv benutze, bin ich mit einem Hack einverstanden:Wenn Sie nur
d
tippen, werden nicht verfolgte Dateien in das Diff aufgenommen (was mir in meinem Workflow wichtig ist) undd args...
es verhält sich wie normalgit diff
.Anmerkungen:
git diff
wirklich nur einzelne Unterschiede verkettet sind, so dass es nicht möglich ist, died
Ausgabe von einem "echten Unterschied" zu unterscheiden - mit Ausnahme der Tatsache, dass alle nicht verfolgten Dateien zuletzt sortiert werden.git diff
. Wenn jemand herausfindet, wie das geht, oder wenngit
irgendwann in der Zukunft eine Funktion hinzugefügt wird, hinterlassen Sie bitte hier eine Notiz!quelle
git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
Problemumgehung, die ich für ältere Gits vorgeschlagen habe , mitgit stash
, vorausgesetzt, Sie haben bereits e69de29bb in Ihrer Datenbank, z. B. indem Sie versuchen, esadd -N
zuvor zu verwenden . Anscheinend ist esgit add -N
in gewisser Weise nicht genau gleichbedeutend mit : Ich bin mir nicht sicher, wie.test
Befehl eher einen Zeichenfolgenvergleich als eine numerische Gleichheitsprüfung durch. Sollte nichts beeinflussen,test "$#" -eq 0
ist aber genauer, was beabsichtigt ist.less
sodass Sie nichtq
für jede Datei drücken müssen, und es fühlt sich genau so an, als würden Sie diegit diff
Paginierung pro Datei (-P
) entfernen und sie anschließend wieder hinzufügen (| less
), Farbe beibehalten (--color=always
) und als Farbe (less -r
oderless -R
) interpretieren . Insgesamt ist es also:do git -P diff --color=always -- /dev/null "$i"; done | less -r
test -t 1
(z. B.if [ -t 1 ]; then color_arg=--color; fi
oder so), kann die Shell auf diese Weise überprüfen, ob es sich bei der Ausgabe um ein Terminal handelt. Dies ist eine nützliche Methode, um über die Farbgebung zu entscheiden. Undxargs
könnte einen Weg geben, um die while-Schleife loszuwerden. Du wirst das immer noch brauchen-n 1
, also wird es immer noch ein paar Mal gestartet und muss immer noch paarweise so sein, aber ... es wird loswhile
undread
vielleicht ist das besser?!? Das überlasse ich dem Leser.Nicht 100% auf den Punkt, aber wenn Sie aus irgendeinem Grund Ihre Dateien nicht zum Index hinzufügen möchten, wie in der akzeptierten Antwort vorgeschlagen, ist hier eine andere Option:
Wenn die Dateien nicht verfolgt werden, ist der Unterschied offensichtlich die gesamte Datei, sodass Sie sie nur mit weniger anzeigen können:
Navigieren Sie zwischen ihnen mit
:n
und:p
für das nächste und vorherige.Update aus den Kommentaren: Wenn Sie ein Patch-Format benötigen, können Sie es auch kombinieren mit
git diff
:Sie können die Ausgabe auch in eine Datei umleiten oder in diesem Fall einen anderen diff-Befehl verwenden.
quelle
git diff /dev/null <untracked_tile>
den Patch auch im Patch-Format ausführen undGenerieren Sie bei Bedarf einen Patch und dann:
quelle
git add -p
sehr oft Gebrauch macht (was ich übrigens generell empfehle) ... Dies gibt eine Möglichkeit, das Grundlegende zu tun, es sollte nur ... beachtet werden, dass es das Potenzial für unerwünschte Seiten hat Auswirkungen.das funktioniert bei mir:
Der letzte Schritt ist optional. Die Datei bleibt im vorherigen Status (nicht verfolgt).
nützlich, wenn Sie auch einen Patch erstellen:
quelle
Änderungen funktionieren, wenn sie mit diesem Befehl bereitgestellt und nicht bereitgestellt werden. Neue Dateien funktionieren beim Bereitstellen:
Wenn sie nicht bereitgestellt werden, werden nur Dateiunterschiede angezeigt.
quelle
HEAD
ist der Standardwert , daher ist dies derselbegit diff
, der das Problem nicht löst.git add
von jeder nicht verfolgten Dateigit add
sie die Antwort enthält , ist es am einfachsten, wenn Ihr Anwendungsfall darin besteht, zu überprüfen, was Sie gerade hinzugefügt haben / hinzufügen möchtenFür eine Datei:
Für alle neuen Dateien:
Als Alias:
Für alle geänderten und neuen Dateien, die als ein Befehl zusammengefasst sind:
quelle
Wenn ich mit Remote-Location-Teams zusammenarbeite, ist es für mich normalerweise wichtig, dass ich vorher weiß, welche Änderungen von anderen Teams in derselben Datei vorgenommen wurden, bevor ich den Git-Phasen folge, die nicht verfolgt -> inszeniert -> festgeschrieben wurden Helfen Sie mir, unnötige Probleme beim Zusammenführen von Konflikten mit dem Remote-Team zu vermeiden, oder erstellen Sie einen neuen lokalen Zweig und vergleichen und führen Sie den Hauptzweig zusammen
Im obigen Skript hole ich den Remote-Hauptzweig (nicht unbedingt den Hauptzweig) nach FETCH_HEAD. Sie erstellen nur eine Liste meiner geänderten Dateien und vergleichen die geänderten Dateien mit git difftool
Hier viele Difftools, die von Git unterstützt werden. Ich konfiguriere 'Meld Diff Viewer' für einen guten GUI-Vergleich.
quelle
Angenommen, Sie haben keine lokalen Commits.
quelle
git diff
Befehl gefragt , der nicht verfolgte Dateien enthält. Dieser Befehl enthält sie nicht. Ob lokale Commits existieren oder nicht, hat absolut nichts mit der Frage zu tun.git merge --squash mybranch
undgit diff master
zeigte mir die Änderungen in nicht verfolgten Dateien.git diff
zeigt keine Unterschiede in nicht verfolgten Dateien: Da sie nicht verfolgt werden, gibt es per Definition keine Unterschiede zu zeigen. So funktioniert Git. :)