Verstecke nur eine einzige Datei


172

Ich möchte in der Lage sein, nur die Änderungen aus einer einzigen Datei zu speichern:

git stash save -- just_my_file.txt

Das obige funktioniert jedoch nicht. Irgendwelche Alternativen?



Für einzelne Dateien ist es viel einfacher, einzelne Dateien zu kopieren, als Stash-Befehle zu jonglieren, und wenn Sie sie zurückbringen möchten, kopieren Sie sie einfach über das Original. z.B. cp just_my_file.txt just_my_file.txt.manualstash Jetzt können Sie alle Kassen und Sachen erledigen und da die Kopie eine "nicht verfolgte Datei" ist, können Sie problemlos über Zweige und Commits wechseln. Wenn Sie sich in der richtigen Verzweigung / Festschreibung befinden, in der Sie "die einzelne Datei zusammenführen" möchten, tun mv just_my_file.txt.manualstash just_my_file.txtSie dies einfach und jetzt können Sie Änderungen überprüfen und bei Bedarf
Dimitry K

Antworten:


171

Ich denke, es stash -pist wahrscheinlich die Wahl, die Sie wollen, aber für den Fall, dass Sie in Zukunft auf andere, noch schwierigere Dinge stoßen, denken Sie daran:

Stashist wirklich nur eine sehr einfache Alternative zu den nur etwas komplexeren branchSets. Stash ist sehr nützlich, um Dinge schnell zu bewegen, aber Sie können komplexere Dinge mit Zweigen erledigen, ohne viel mehr Kopfschmerzen und Arbeit.

# git checkout -b tmpbranch
# git add the_file
# git commit -m "stashing the_file"
# git checkout master

Gehen Sie herum und tun Sie, was Sie wollen, und später einfach rebaseund / oder mergedie tmpbranch. Es ist wirklich nicht so viel zusätzliche Arbeit, wenn Sie sorgfältiger nachverfolgen müssen, als es das Versteck zulässt.


2
Auf der anderen Seite können Sie Verstecke ohne große Schmerzen in echte Zweige verwandeln.
Wes Hardaker

85

Wenn Sie keine Nachricht mit Ihren versteckten Änderungen angeben möchten, übergeben Sie den Dateinamen nach einem Doppelstrich.

$ git stash -- filename.ext

Wenn es sich um eine nicht verfolgte / neue Datei handelt, müssen Sie sie zuerst bereitstellen.

Wenn Sie jedoch eine Nachricht angeben möchten, verwenden Sie push.

git stash push -m "describe changes to filename.ext" filename.ext

Beide Methoden funktionieren in Git-Versionen 2.13+


1
Diese Antwort scheint die mir gerade nach vorne , wenn die Änderungen ändern: git stash -- filename.ext, git commit --amend, git stash pop
Brandon Dewey

1
Ich denke, dies muss auf einigen sehr neuen Funktionen beruhen. In Git 2.1.4 funktioniert es nicht.
Richard Smith

Es führt zu einem seltsamen Verhalten für mich, bei dem der Stash gespeichert wird, aber gleichzeitig dieselben Dateien zum Staging hinzugefügt werden (git v2.20.1)
paradroid

58

Sie können einzelne Zeilen interaktiv mit git stash -p(analog zu git add -p) verstauen .

Es wird kein Dateiname benötigt, aber Sie können einfach andere Dateien mit überspringen, dbis Sie die Datei erreicht haben, die Sie speichern möchten, und alle Änderungen dort mit speichern a.


3
Dies dauert lange, wenn Sie viele Dateien haben, die Sie nicht speichern möchten.
JJJ

23
Ich weiß nicht, wann sich dies geändert hat, aber ab jetzt git 2.14.1können Sie den Dateinamen angebengit stash -p <filename>
Myon

21

Die beste Option ist, alles außer dieser Datei zu inszenieren git stash save --keep-indexund stash anzuweisen , den Index beizubehalten, um so Ihre nicht bereitgestellte Datei zu verstauen:

$ git add .
$ git reset thefiletostash
$ git stash save --keep-index

Wie Dan betont, thefiletostashist es das einzige, das vom Stash zurückgesetzt wird, aber es versteckt auch die anderen Dateien, so dass es nicht genau das ist, was Sie wollen.


2
Obwohl dies den Index im gleichen Zustand hält, werden dadurch nicht auch die Dateien im Index gespeichert? Mit anderen Worten, wenn Sie danach den Index für den aktuellen Zweig festschreiben, dann zu einem anderen Zweig wechseln und dies tun git stash pop, werden dann nicht alle Dateien angewendet, nicht nur die eine Datei, die wir speichern wollten?
Dan Moulding

@ DanMoulding: Du hast absolut Recht, darüber habe ich nicht nachgedacht.
CharlesB

16

Nur für den Fall, dass Sie tatsächlich "Änderungen verwerfen" meinen, wenn Sie "Git Stash" verwenden (und nicht wirklich Git Stash verwenden, um es vorübergehend zu speichern), können Sie in diesem Fall verwenden

git checkout -- <file>

Beachten Sie, dass Git Stash nur eine schnellere und einfachere Alternative zum Verzweigen und Ausführen von Dingen ist.


Ich denke, dies ist die beste Antwort, wenn Sie alle Ihre geänderten Änderungen an einer einzelnen Datei entfernen möchten.
Mohamed Haseel

und ich würde, dies ist die beste Antwort für diese spezielle Aufgabe
Zakir Hussain

6
Die Frage war klar genug und es wurde nicht gefragt, wie Änderungen an einer Datei rückgängig gemacht werden sollen. Abgestimmt.
Richard Smith

Dies ist eine gute Antwort, die als Alternative klar erkennbar ist. Aber einige Leute werden hartnäckig genug sein, um Downvote als missbräuchliche Funktion zu verwenden: +1
Mukul Jain

@MukulJain Ich musste den Stash-per-File tatsächlich nur vorübergehend verwenden (im Grunde genommen wurden einige Änderungen in zwei Commits, die dieselben Zeilen betrafen, für eine Datei getrennt). Ich werde nicht wirklich abstimmen, sondern nur sagen, dass es für mich nutzlos ist.
Paul Stelian
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.