Wie verstaut man eine nicht verfolgte Datei?

1437

Ich habe Änderungen an einer Datei sowie eine neue Datei und möchte Git Stash verwenden, um sie zu entfernen, während ich zu einer anderen Aufgabe wechsle. Aber git stash selbst verwahrt nur die Änderungen an der vorhandenen Datei. Die neue Datei verbleibt in meinem Arbeitsbaum und überfüllt meine zukünftige Arbeit. Wie verstecke ich diese nicht verfolgte Datei?

Skiphoppy
quelle
27
Beachten Sie, dass wenn Sie nur nicht verfolgte Dateien in Ihrem Vorrat haben, diese wie eine leere aussehen, da sie git stash shownichts zurückgibt und Sie möglicherweise versucht sind, sie zu löschen (wie ich es gerade getan habe, als sie ein nützliches Skript enthielt, das ich vor einigen Monaten geschrieben habe → wie man einen abgelegten Vorrat wiederherstellt )
Maxime R.

Antworten:

1925

Um Ihr Arbeitsverzeichnis einschließlich nicht verfolgter Dateien (insbesondere der im .gitignore) zu speichern, möchten Sie wahrscheinlich dieses cmd verwenden:

git stash --include-untracked

Mehr Details:

Update 17. Mai 2018:

Neue Versionen von git haben jetzt git stash --allalle Dateien, einschließlich nicht verfolgter und ignorierter Dateien.
git stash --include-untrackedBerührt ignorierte Dateien nicht mehr (getestet unter Git 2.16.2).

Ursprüngliche Antwort unten:

Warnung: Wenn Sie dies tun, werden Ihre Dateien dauerhaft gelöscht, wenn Ihre gitignore-Datei Verzeichnis- / * -Einträge enthält.

Ab Version 1.7.7 können Sie nicht verfolgte Dateien verwenden git stash --include-untrackedoder git stash save -uspeichern, ohne sie bereitzustellen.

Fügen Sie git adddie Datei hinzu ( ) und beginnen Sie, sie zu verfolgen. Dann verstauen. Da der gesamte Inhalt der Datei neu ist, werden sie gespeichert, und Sie können sie nach Bedarf bearbeiten.

Sykora
quelle
4
Warum hat stash immer noch vorhandene Dateien geändert, obwohl diese Änderungen nicht bereitgestellt wurden?
Alan Christensen
6
@ alan-christensen Lesen Sie die BESCHREIBUNG von kernel.org/pub/software/scm/git/docs/git-stash.html . Es geht darum, nach dem Verstauen einen sauberen Arbeitsbaum zu haben.
Kelvin
3
@ Kelvin Was ich in meinem Kommentar gemeint habe, war, dass neue Dateien nur dann gespeichert werden, wenn sie bereitgestellt wurden. Vorhandene Dateien werden jedoch gespeichert, auch wenn sie nicht bereitgestellt wurden. Scheint mir inkonsistent.
Alan Christensen
11
@AlanChristensen Der Punkt ist, Dinge zu verstauen, die durch das Auschecken eines anderen Zweigs überschrieben werden könnten.
JWG
3
Da Sie hier die beste Antwort haben, würde ich Sie aus zwei Gründen bitten, diese git stash --include-untrackedzuvor git stash --allin Ihrer Antwort aufzulisten. Erstens beantwortet es die Frage des OP jetzt im Jahr 2019 besser und zweitens, weil - alles etwas tut, was die meisten Benutzer wahrscheinlich nicht wollen, indem es alle Dateien entfernt, die .gitignored sind
Daniel Flippance
411

Ab Git 1.7.7 wird git stashdie --include-untrackedOption (oder Short-Hand -u) akzeptiert . Verwenden Sie einen der folgenden Befehle, um nicht verfolgte Dateien in Ihren Vorrat aufzunehmen:

git stash --include-untracked
git stash -u

Warnung: Wenn Sie dies tun, werden Ihre Dateien dauerhaft gelöscht, wenn Ihre gitignore-Datei Verzeichnis- / * -Einträge enthält.

John Kary
quelle
15
Cool - es funktioniert endlich wie auf der Handbuchseite beschrieben. Das Nichtverstecken (und Bereinigen) neuer Dateien ist ein fehlerhaftes Verhalten.
Steve Bennett
1
Meine Version von Git ist 1.9.1 und selbst wenn das, was ich in habe, so .gitignoreaussieht ignoredDirectoryund nicht ignoredDirectory/*, löscht es immer noch die nicht verfolgten. Auch nicht verfolgte Dateien nicht nur Verzeichnisse.
theUnknown777
22
Können Sie bitte die Warnung erklären? Warum sollte es diese Dateien löschen? Löscht es sie und versteckt sie nicht? Ich habe Git eine Weile benutzt und bin nicht auf dieses Problem gestoßen.
Aleksandr Dubinsky
Gilt die Warnung auch für *.extensionEinträge?
Arekolek
3
@ aleksandr-dubinsky, @arekolek - git1.8.3 -u( --include-untracked) Option kann nicht verfolgte Dateien in Ordnung verstauen und einfügen, aber git stash shownicht die nicht verfolgten Dateien
auflisten
77

Fügen Sie die Datei dem Index hinzu:

git add path/to/untracked-file
git stash

Der gesamte Inhalt des Index sowie alle nicht bereitgestellten Änderungen an vorhandenen Dateien werden in den Stash aufgenommen.

Skiphoppy
quelle
Was ist, wenn Sie Änderungen, die bereits im Index enthalten sind, nicht speichern möchten? Ist das Verstauen der neuen Datei noch möglich?
Allyourcode
Übernehmen Sie den Index, speichern Sie die neue Datei, setzen Sie das Festschreiben zurück und / oder checken Sie die Dateien aus dem Festschreiben aus. Es ist eine klobige Lösung, aber es sollte funktionieren.
Gdalya
git add .
Ich habe
53

In Git Bash wird das Verstauen von nicht verfolgten Dateien mithilfe des Befehls erreicht

git stash --include-untracked

oder

git stash -u

http://git-scm.com/docs/git-stash

git stash entfernt nicht verfolgte oder nicht festgeschriebene Dateien aus Ihrem Arbeitsbereich. Und Sie können Git Stash mit den folgenden Befehlen zurücksetzen

git stash pop

Dadurch wird die Datei wieder in Ihrem lokalen Arbeitsbereich abgelegt.

Meine Erfahrung

Ich musste eine Änderung an meiner gitIgnore-Datei vornehmen, um zu vermeiden, dass .classpath- und .project-Dateien in das Remote-Repo verschoben werden. Ich darf diese modifizierte .gitIgnore ab sofort nicht mehr in Remote Repo verschieben.

.classpath- und .project-Dateien sind wichtig für Eclipse - das ist mein Java-Editor.

Ich habe zunächst selektiv meine restlichen Dateien hinzugefügt und mich für die Bereitstellung verpflichtet. Der endgültige Push kann jedoch nur ausgeführt werden, wenn die modifizierten .gitIgnore-Felder und die nicht verfolgten Dateien vorhanden sind. .project und .classpath sind nicht versteckt.

ich benutzte

 git stash 

zum Verstecken der geänderten .gitIgnore-Datei.

Zum Verstauen von .classpath- und .project-Dateien habe ich verwendet

git stash --include-untracked

und es entfernte die Dateien aus meinem Arbeitsbereich. Das Fehlen dieser Dateien beeinträchtigt meine Fähigkeit, an meinem Arbeitsort in Eclipse zu arbeiten. Ich fuhr mit dem Abschluss des Verfahrens zum Übertragen der festgeschriebenen Dateien auf Remote fort. Sobald dies erfolgreich durchgeführt wurde, habe ich verwendet

git stash pop

Dadurch wurden dieselben Dateien wieder in meinen Arbeitsbereich eingefügt. Dies gab mir meine Fähigkeit zurück, in Eclipse an demselben Projekt zu arbeiten. Hoffe, dies beseitigt Missverständnisse.

DolphinJava
quelle
2
Warum verwenden Sie den globalen Gitignore nicht für IDE-Dateien? Dh. verwenden ~/.gitignore.
Antti Pihlaja
20

Wie bereits an anderer Stelle erwähnt, lautet die Antwort auf git adddie Datei. z.B:

git add path/to/untracked-file
git stash

Die Frage wird jedoch auch in einer anderen Antwort aufgeworfen: Was ist, wenn Sie die Datei nicht wirklich hinzufügen möchten? Soweit ich das beurteilen kann, müssen Sie. Und der folgende Wille NICHT funktionieren:

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

Dies wird wie folgt fehlschlagen:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

Also was kannst du tun? Nun, Sie müssen die Datei wirklich hinzufügen, aber Sie können sie später effektiv mit hinzufügengit rm --cached :

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

Und dann können Sie weiterarbeiten, in dem Zustand, in dem Sie vor dem waren git add (nämlich mit einer nicht verfolgten Datei namenspath/to/untracked-file ; plus allen anderen Änderungen, die Sie möglicherweise an den verfolgten Dateien vorgenommen haben).

Eine andere Möglichkeit für einen Workflow dazu wäre etwa:

git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack

[Hinweis: Wie in einem Kommentar von @mancocapac erwähnt, möchten Sie möglicherweise hinzufügen --exclude-standard den git ls-filesBefehl (also,git ls-files -o --exclude-standard ) .]

... was auch leicht skriptfähig sein könnte - sogar Aliase würden ausreichen (in zsh-Syntax dargestellt; nach Bedarf anpassen) [außerdem habe ich den Dateinamen gekürzt, damit alles auf den Bildschirm passt, ohne in dieser Antwort zu scrollen; Fühlen Sie sich frei, einen alternativen Dateinamen Ihrer Wahl zu ersetzen]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

Beachten Sie, dass diese vielleicht besser als ein Shell - Skript oder eine Funktion, Parameter zu ermöglichen, geliefert werden soll git stash, falls Sie nicht wollen , popaber apply, und / oder wollen eine bestimmte Stash in der Lage sein zu spezifizieren, anstatt nur die Spitze nehmen einer. Vielleicht dies (anstelle des zweiten Alias ​​oben) [Leerzeichen ohne Scrollen entfernt; zur besseren Lesbarkeit erneut hinzufügen]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

Hinweis : In diesem Formular müssen Sie ein Aktionsargument sowie den Bezeichner angeben, wenn Sie einen Stash-Bezeichner angeben möchten, z. B. unstashall apply stash@{1}oderunstashall pop stash@{1}

Welches würden Sie natürlich in Ihre setzen .zshrc oder ein gleichwertiges einfügen würden, um langfristig zu existieren.

Hoffentlich ist diese Antwort für jemanden hilfreich, der alles in einer Antwort zusammenfasst.

Lindes
quelle
1
git ls-files -o zeigt viel mehr Dateien als die, an denen ich interessiert bin. Aus dem folgenden Git-Status habe ich das Hinzufügen von --exclude-standard works gefunden. git ls-files -o --exclude-standard. Ich gehe davon aus, dass es nur die nicht verfolgten Dateien "enthält", die Sie normalerweise nicht ignorieren würden, dh nur nicht verfolgte Dateien anzeigen, die Ihr .gitignore nicht herausfiltern würde
mancocapac
20

Auf Git Version 2.8.1: Folgendes funktioniert für mich.

So speichern Sie geänderte und nicht verfolgte Dateien im Stash ohne Namen

git stash save -u

Speichern von geänderten und nicht verfolgten Dateien im Stash mit einem Namen

git stash save -u <name_of_stash>

Sie können entweder Pop verwenden oder später wie folgt anwenden .

git stash pop

git stash apply stash@{0}
user1012513
quelle
Dadurch wurden die nicht verfolgten Dateien nicht von meinem Computer entfernt, obwohl sie nicht mehr als nicht verfolgt aufgeführt waren. git stash showzeigte sie nicht. Als ich es versuchte git stash apply, bekam ich "Fehler: Nicht verfolgte Dateien konnten nicht aus dem Stash wiederhergestellt werden". Die Dateien wurden dann jedoch erneut als nicht verfolgt aufgeführt, aber Änderungen an verfolgten Dateien wurden nicht wiederhergestellt. Ich denke, diese Dateien könnten einzeln wiederhergestellt werden, indem sie aus dem Vorrat ausgecheckt werden, aber diese Lösung war nicht das, was ich mir erhofft hatte.
hBrent
9

Ich konnte nur die nicht verfolgten Dateien verstauen , indem ich Folgendes tat:

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

Beim letzten wird der Speicher der verfolgten Dateien geöffnet, sodass nur die nicht verfolgten Dateien gespeichert werden.

Oded
quelle
git stash save -uspeichert nicht nur die untrackedDateien, sondern auch die trackedund untracked. Ich denke, die erste Rettung, die Sie machen, ist in diesem Fall nicht notwendig. Es gibt ein gutes Diagramm in atlassian.com/git/tutorials/saving-changes/…
Drenai
2
Die Frage ist, wie nur die nicht verfolgten Dateien gespeichert werden können. Wenn Sie das erste Versteck überspringen, was werden Sie dann platzen lassen? Die Idee ist: 1) Stash verfolgt. 2) Verstecken Sie nicht verfolgt. 3) Pop verfolgt. Ergebnis: Unverfolgt bleibt versteckt.
Oded
3

Wenn Sie nicht verfolgte Dateien speichern möchten, aber indizierte Dateien behalten möchten (die Sie beispielsweise festschreiben möchten), fügen Sie einfach die -kOption (Index beibehalten) hinzu-u

git stash -u -k
Tdy
quelle
2

Nehmen wir an, die neue und nicht verfolgte Datei heißt "views.json". Wenn Sie den Zweig ändern möchten, indem Sie den Status Ihrer App speichern, gebe ich im Allgemeinen Folgendes ein:

git add views.json

Dann:

git stash

Und es würde verstaut werden. Dann kann ich einfach den Zweig wechseln mit

git checkout other-nice-branch
martline1
quelle
1

Es gibt mehrere richtige Antworten hier, aber ich wollte , dass für neue ganze Verzeichnisse , darauf hinzuweisen, 'git add path'wird nicht arbeiten. Wenn Sie also eine Reihe neuer Dateien im Pfad ohne Spur haben und dies tun:

git add untracked-path
git stash "temp stash"

Dies wird mit der folgenden Meldung gespeichert:

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

und wenn der nicht verfolgte Pfad der einzige Pfad ist, den Sie verstecken, ist der "temporäre" Stash ein leerer Stash. Der richtige Weg besteht darin, den gesamten Pfad hinzuzufügen, nicht nur den Verzeichnisnamen (dh den Pfad mit einem '/' zu beenden):

git add untracked-path/
git stash "temp stash"
DrStrangepork
quelle
Zumindest auf meinem System ist Ihre Annahme falsch. Es funktioniert ohne den Schrägstrich! Leere Verzeichnisse werden sowieso ignoriert. (Macos Git 2.6.2)
Phobie
0

Ich dachte, dies könnte gelöst werden, indem git mitgeteilt wird, dass die Datei vorhanden ist, anstatt den gesamten Inhalt in den Staging-Bereich zu übertragen und dann aufzurufen git stash. Araqnid beschreibt, wie man das erstere macht.

git add --intent-to-add path/to/untracked-file

oder

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

Letzteres funktioniert jedoch nicht:

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
Andrew Grimm
quelle
1
Soweit ich das beurteilen kann, funktioniert Ersteres auch nicht. In meiner Antwort finden Sie eine Lösung für dieses Problem.
Lindes
0
git stash --include-untracked

Mein Favorit, da es auch die Dateien speichert, die Sie hinzugefügt und nicht bereitgestellt haben.

Hovhannes Babayan
quelle
0

Bei der Verwendung von Sourcetree mit neu erstellten Dateien ist ein ähnliches Problem aufgetreten (diese würden auch nicht in den Vorrat aufgenommen).

Als ich zum ersten Mal "Alle inszenieren" wählte und dann die neu hinzugefügten Komponenten verwahrte, wurden sie verfolgt und daher in den Vorrat aufgenommen.

Ivo van Leeuwen
quelle
Diese Frage ist 11 Jahre alt und hat bereits 14 Antworten. Hast du sie vor dem Posten gelesen?
Mickael B.
-7

Früher habe ich über das gleiche Feature nachgedacht und es mir gewünscht. Aber im Laufe der Zeit bemerkte ich, dass es wirklich nicht benötigt wird. Wenn Sie sich verstecken, ist es in Ordnung, die neuen Dateien zu belassen. Ihnen kann nichts "Schlimmes" passieren (wenn Sie etwas anderes auschecken, wird git einen Fehler machen und die vorhandene nicht verfolgte Datei nicht überschreiben).

Und da der Zeitrahmen zwischen git stashund und normalerweise git stash popeher klein ist, benötigen Sie die nicht verfolgte Datei schnell wieder. Ich würde also sagen, dass die Unannehmlichkeit der Datei, die angezeigt wird, git statuswährend Sie an etwas anderem (zwischen dem git stashund dem git stash pop) arbeiten, geringer ist als die Unannehmlichkeit, die durch die Arbeit verursacht wird und die Aufmerksamkeit erfordert, die es sonst kosten würde, zu versuchen, die nicht verfolgte Datei hinzuzufügen dein Vorrat.

Dieter_be
quelle
15
Das hängt vom Projekt ab. Angenommen, die nicht verfolgte Datei ist ein (halbgeschriebener) Komponententest, und das Testkabel führt alle Komponententests im Verzeichnis aus. Usw.
Steve Bennett
1
Ein anderes Beispiel ist, wenn Sie auf zwei Computern arbeiten und Daten von A nach B verschieben dürfen, jedoch nicht von B nach A. Wenn Sie einen neuen Code erstellen, um ein Problem zu lösen, das zuerst bei B auftritt, aber bei Ihnen Wenn Sie sowohl auf A als auch auf B möchten, möchten Sie in der Lage sein, die Datei auf B zu speichern. Wenn Sie diese Datei auf A neu erstellen und dann in einem Bundle übertragen, können Sie die versteckte Version unterscheiden, um zu überprüfen, ob Sie dies nicht getan haben einen Fehler machen.
Gdalya
7
Nur weil eine Datei nicht in einem Zweig verfolgt wird, bedeutet dies nicht, dass sie nicht mit einer verfolgten Datei in einem anderen Zweig in Konflikt steht.
JWG
3
einfaches Gegenbeispiel: Konfigurationsdatei im Verzeichnis .conf.d oder eine andere, die nur durch ihre Anwesenheit das Verhalten der Software ändert.
Fotanus
Natürlich wird die Funktionalität benötigt. Als zusätzliches Beispiel ist es nicht möglich, von einem Zweig zu einem anderen zu wechseln, wenn Sie lokal nicht verfolgte Dateien haben, die Sie speichern möchten.
Demitrian