Wie kann ich eine bestimmte Datei verstecken?

1624

Wie kann ich eine bestimmte Datei speichern, wobei die anderen aktuell geänderten Dateien aus dem zu speichernden Speicher entfernt bleiben?

Zum Beispiel, wenn mir der Git-Status Folgendes gibt:

younker % gst      
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   app/controllers/cart_controller.php
#   modified:   app/views/cart/welcome.thtml
#
no changes added to commit (use "git add" and/or "git commit -a")

und ich möchte nur app / views / cart / welcome.thtml verstauen, wie würde ich das machen? So etwas wie (aber das funktioniert natürlich nicht):

git stash save welcome_cart app/views/cart/welcome.thtml
ynkr
quelle
56
Die Frage "Mögliches Duplikat" hat derzeit eine falsche Antwort, die als akzeptiert markiert ist.
Pinguin Brian
6
Sie können es verwenden git checkout -- filenameund auf den ursprünglichen Zustand zurücksetzen.
Visualex
7
@visualex es wird es zwar zurücksetzen, aber nicht verstauen
Jesper
2
Kommentar von Re Penguin Brian: Ja, die akzeptierte Antwort auf die Frage "Mögliches Duplikat" verweist auf diese Frage für aktuelle Versionen von git.
Mars
1
$ Git Stash - Dateiname.Ext
Linielson

Antworten:

2469

BEARBEITEN: Seit Git 2.13 gibt es einen Befehl zum Speichern eines bestimmten Pfads zum Stash : git stash push <path>. Zum Beispiel:

git stash push -m welcome_cart app/views/cart/welcome.thtml

ALTE ANTWORT:

Sie können dies mit git stash --patch(oder git stash -p) tun - Sie gelangen in den interaktiven Modus, in dem Ihnen jedes geänderte Stück angezeigt wird. Verwenden nSie diese Option, um die Dateien zu überspringen, die Sie nicht speichern möchten, ywenn Sie auf die Dateien stoßen, die Sie qspeichern möchten, und um die verbleibenden Hunks zu beenden und nicht zu speichern. awird das angezeigte Stück und den Rest der Stücke in dieser Datei verstecken.

Nicht der benutzerfreundlichste Ansatz, aber er erledigt die Arbeit, wenn Sie sie wirklich brauchen.

svick
quelle
32
Umständlich, funktioniert aber. Ich wünschte, es gäbe eine schnelle Möglichkeit, nur bereitgestellte Änderungen zu speichern und die Änderungen dann in den nicht bereitgestellten Arbeitsbaum zu übernehmen, wenn er später angezeigt wird.
James Johnston
54
Mit @JamesJohnston git stash --keep-indexkönnen Sie alle nicht bereitgestellten Änderungen speichern (das Gegenteil von dem, wonach Sie suchen). stackoverflow.com/a/8333163/378253
Nicolas Wormser
121
Wenn Sie astattdessen sagen y, wird dieses Stück + der Rest der Datei verstaut, was viel schneller ist.
i_am_jorf
53
@ Jeffamaphone großartig! auch ddas Gegenteil tun, dh keine weiteren großen Stücke in der aktuellen Datei bunkern. und in der Tat ?wird alle möglichen Optionen zeigen.
Omnikron
8
@Vencovsky Es steht für "Nachricht" und wird verwendet, um eine optionale Beschreibung des Stashs anzugeben. Wenn Sie das nicht brauchen, können Sie das -m welcome_cartTeil weglassen.
Svick
333

Normalerweise füge ich Indexänderungen hinzu, die ich nicht speichern möchte, und dann mit --keep-indexOption.

git add app/controllers/cart_controller.php
git stash --keep-index
git reset

Der letzte Schritt ist optional, aber normalerweise möchten Sie es. Änderungen werden aus dem Index entfernt.


Warnung Wie in den Kommentaren erwähnt, wird alles inszeniert, sowohl inszeniert als auch nicht inszeniert. Das --keep-indexlässt den Index einfach in Ruhe, nachdem der Stash abgeschlossen ist. Dies kann zu Zusammenführungskonflikten führen, wenn Sie den Stash später öffnen.

Skalee
quelle
5
Dies ist viel besser als die akzeptierte Antwort, wenn Sie viele Änderungen haben, die Sie mit der Option --patch nicht durchgehen möchten.
Quux00
181
Nein, dies bringt alles in den Vorrat, sowohl inszeniert als auch nicht inszeniert. Das --keep-indexlässt den Index einfach in Ruhe, nachdem der Stash abgeschlossen ist. Dies ist also keine gültige Antwort auf die Frage AFAICT.
Raman
2
Siehe meine Antwort auf @ Rachel Frage nach einer Lösung , die Inverse dies zu tun (stashing die Änderungen statt, anstelle der unstaged Änderungen) - stackoverflow.com/questions/3040833/...
JesusFreke
3
Wenn Sie anschließend die von Ihnen gespeicherten Dateien wiederherstellen möchten, ohne die hinzugefügten Dateien festzuschreiben, können Sie sie ausführen git stash; git stash pop stash@{1}.
Yndolok
7
WARNUNG: Beachten Sie den Punkt von @ Raman. Das macht nicht was es sollte. Dadurch werden die gleichen Änderungen in den Vorrat übernommen und im Arbeitsbaum belassen. Wenn Sie später versuchen, den Stash zu öffnen, treten wahrscheinlich Zusammenführungskonflikte auf, die oft sehr verwirrend und schwer zu beheben sind.
rjmunro
17

Um die Antwort von svick zu ergänzen, fügt die -mOption einfach eine Nachricht zu Ihrem Vorrat hinzu und ist völlig optional. Also der Befehl

git stash push [paths you wish to stash]

ist vollkommen gültig. Wenn ich zum Beispiel nur Änderungen im src/Verzeichnis speichern möchte , kann ich sie einfach ausführen

git stash push src/
hydro
quelle