2070 Stimmen

Wie verstaut man eine nicht verfolgte Datei?

Ich habe Änderungen an einer Datei und eine neue Datei und möchte git stash verwenden, um sie wegzulegen, während ich zu einer anderen Aufgabe wechsle. Aber git stash selbst speichert nur die Änderungen an der bestehenden Datei; die neue Datei verbleibt in meinem Arbeitsbaum und bringt meine zukünftige Arbeit durcheinander. Wie kann ich diese nicht verfolgte Datei auslagern?

58 Stimmen

Wenn Sie nur nicht verfolgte Dateien in Ihrem Versteck haben, sieht es so aus, als wäre es ein leeres Versteck, wie in git stash show gibt nichts zurück und man könnte versucht sein, es zu löschen (wie ich es gerade getan habe, obwohl es ein nützliches Skript enthielt, das ich vor einigen Monaten geschrieben habe wie man einen verlorenen Vorrat wiederfindet )

20voto

lindes Punkte 8956

Wie bereits an anderer Stelle gesagt wurde, besteht die Antwort darin git add die Datei. z.B.:

git add path/to/untracked-file
git stash

Die Frage wird jedoch auch in einer anderen Antwort gestellt: Was ist, wenn Sie die Datei nicht wirklich hinzufügen wollen? Nun, soweit ich das beurteilen kann, müssen Sie das tun. Und das Folgende wird PAS Arbeit:

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

wird dies wie folgt fehlschlagen:

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

Was können Sie also tun? Nun, Sie müssen die Datei wirklich hinzufügen, jedoch können Sie sie später wieder entfernen, und zwar mit git 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, und zwar in demselben Zustand, in dem Sie sich vor der git add (und zwar mit einer nicht verfolgten Datei namens path/to/untracked-file (sowie alle anderen Änderungen, die Sie an verfolgten Dateien vorgenommen haben).

Eine andere Möglichkeit für einen Arbeitsablauf in diesem Bereich wäre etwa so:

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, können Sie Folgendes hinzufügen --exclude-standard zum git ls-files Befehl (also, git ls-files -o --exclude-standard ).]

... was auch leicht geskriptet werden könnte - sogar Aliase würden es tun (dargestellt in zsh-Syntax; passen Sie es nach Bedarf an) [außerdem habe ich den Dateinamen gekürzt, damit alles auf den Bildschirm passt, ohne in dieser Antwort zu scrollen; Sie können einen alternativen Dateinamen Ihrer Wahl verwenden]:

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 letzteres besser als Shell-Skript oder -Funktion geeignet ist, damit Parameter an git stash für den Fall, dass Sie nicht wollen pop sondern apply und/oder die Möglichkeit haben möchten, einen bestimmten Vorrat anzugeben, anstatt nur den obersten zu nehmen. Vielleicht dies (anstelle des zweiten Alias, oben) [Leerzeichen entfernt, damit es ohne Scrollen passt; für bessere Lesbarkeit neu einfügen]:

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

Hinweis : In dieser Form müssen Sie neben dem Bezeichner auch ein Aktionsargument angeben, wenn Sie einen Bezeichner für ein Versteck angeben wollen, z. B. unstashall apply stash@{1} o unstashall pop stash@{1}

Die Sie natürlich in Ihre Tasche stecken würden. .zshrc oder gleichwertig zu machen, langfristig bestehen.

Ich hoffe, dass diese Antwort für jemanden hilfreich ist, da sie alles in einer einzigen Antwort zusammenfasst.

1 Stimmen

Git ls-files -o zeigt viel mehr Dateien als die, an denen ich interessiert bin. Git-Status Ich habe festgestellt, dass das Hinzufügen von --exclude-standard funktioniert. git ls-files -o --exclude-standard. Ich verstehe das so, dass es nur die nicht verfolgten Dateien "einschließt", die du normalerweise nicht ignorieren würdest, d.h. es werden nur die nicht verfolgten Dateien angezeigt, die dein .gitignore nicht herausfiltern würde

17voto

Ryan Punkte 20027

Aktualisierte Antwort im Jahr 2020

Ich war überrascht, dass keine anderen Antworten auf dieser Seite Folgendes erwähnten git stash push .

Dieser Artikel half mir zu verstehen:

Der Befehl git stash ist die Kurzform für git stash push . In diesem Modus sind Nicht-Options-Argumente nicht erlaubt, um zu verhindern, dass ein falsch geschriebener Unterbefehl einen unerwünschten Stash-Eintrag erzeugt. Es gibt auch einen weiteren Alias für diesen Befehl git stash save das zugunsten der folgenden Methode veraltet ist git stash push .

Standardmäßig ignoriert Git nicht verfolgte Dateien beim Stash. Wenn diese Dateien zu stash hinzugefügt werden müssen, können Sie -u Optionen, die Git anweisen, nicht verfolgte Dateien einzuschließen. Ignorierte Dateien können ebenfalls hinzugefügt werden, wenn -a Option angegeben ist. -a werden sowohl nicht verfolgte als auch ignorierte Dateien einbezogen.

Ich lege Wert auf die Benennung meiner Stashes, und ich möchte, dass sie nicht verfolgte Dateien enthalten, daher ist der Befehl, den ich am häufigsten ausführe, folgender: git stash push -u -m "whatIWantToNameThisStash"

0 Stimmen

Siehe auch diesen Alias: stackoverflow.com/q/64823742/470749

1 Stimmen

Für den Fall, dass Sie viele nicht verfolgte Dateien haben und nur einige von ihnen aufbewahren möchten: git stash push path/to/some/file -u

12voto

Oded Punkte 895

Ich konnte Folgendes verstecken nur die nicht verfolgten Dateien zu tun:

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}

Mit der letzten Option werden die verfolgten Dateien gelöscht, so dass nur noch die nicht verfolgten Dateien im Speicher verbleiben.

0 Stimmen

git stash save -u speichert nicht nur die untracked Dateien, speichert es sowohl die tracked y untracked . Ich denke, die erste Sicherung, die Sie durchführen, ist in diesem Fall nicht notwendig. Es gibt ein gutes Diagramm in atlassian.com/git/tutorials/saving-changes/

2 Stimmen

Die Frage ist, wie man nur die nicht verfolgten Dateien aufbewahrt. Wenn man das erste Versteck überspringt, was soll man dann auslagern? Die Idee ist folgende: 1) Verfolgte Dateien auslagern. 2) Unverfolgte Dateien auslagern. 3) Verfolgte Dateien auslagern. Ergebnis: Unverfolgtes bleibt versteckt.

9voto

Mike Punkte 124

Neu in Version 2.35

Der neue --staged-Modus von git stash macht es einfach, das zu verstauen, was Sie bereits im Staging-Bereich haben, und nichts anderes. Man kann es sich wie git commit vorstellen (das nur Änderungen in den Staging-Bereich schreibt), aber anstatt einen neuen Commit zu erstellen, wird ein neuer Eintrag in den Stash geschrieben. Wenn Sie dann fertig sind, können Sie Ihre Änderungen (mit git stash pop) wiederherstellen und weiterarbeiten.

git add -A
git stash --staged

4voto

Tdy Punkte 588

Wenn Sie nicht verfolgte Dateien auslagern, aber indizierte Dateien behalten wollen (zum Beispiel die, die Sie gerade übertragen wollen), fügen Sie einfach -k (Index beibehalten) an die Option -u

git stash -u -k

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X