Antworten:
Wenn ich versteckte Änderungen auf eine schmutzige Arbeitskopie anwenden muss, z. B. mehr als einen Änderungssatz aus dem Stash entfernen möchte, verwende ich Folgendes:
$ git stash show -p | git apply -3 && git stash drop
Grundsätzlich ist es
Ich frage mich, warum es keine -f
(Kraft-) Option gibt, für git stash pop
die sich genau wie der Einzeiler oben verhalten sollte.
In der Zwischenzeit möchten Sie diesen Einzeiler möglicherweise als Git-Alias hinzufügen:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
Vielen Dank an @SamHasler für den Hinweis auf den -3
Parameter, mit dem Konflikte direkt über 3-Wege-Zusammenführung gelöst werden können.
git stash apply
übernimmt die versteckten Änderungen nicht, wenn Sie eine schmutzige Arbeitskopie haben. Sie können also sehen, git stash show -p | git apply
wie eine Art erzwungenes Versteck angewendet wird .
error: <file> does not match index
jeder geänderten Datei fehlgeschlagen . Eine andere Lösung funktionierte jedoch.
Ich mache es so:
git add -A
git stash apply
und dann (optional):
git reset
git add -u
, was so ist, -A
außer dass es keine nicht verfolgten Dateien hinzufügt.
Sie können dies tun, ohne Ihre aktuellen Änderungen speichern zu müssen, indem Sie den gewünschten Speicher als Patch-Datei exportieren und manuell anwenden.
Angenommen, Sie möchten stash @ {0} auf einen schmutzigen Baum anwenden:
Exportieren Sie stash @ {0} als Patch:
git stash show -p stash @ {0}> Stash0.patch
Übernehmen Sie die Änderungen manuell:
Git anwenden Stash0.patch
Wenn der zweite Schritt fehlschlägt, müssen Sie die Datei Stash0.patch bearbeiten, um Fehler zu beheben, und dann erneut versuchen, git apply anzuwenden.
Bereinigen Sie entweder Ihr Arbeitsverzeichnis mit git reset, übernehmen Sie die Änderungen oder versuchen Sie Folgendes, wenn Sie die aktuellen Änderungen speichern möchten:
$ git stash save "Beschreibung der aktuellen Änderungen" $ git stash pop stash @ {1}
Dadurch werden die aktuellen Änderungen gespeichert und dann der zweite Speicher aus dem Stapel gestapelt.
Die Lösung von Mathias kommt definitiv einer Git-Stash-Pop-Force am nächsten (und wirklich, komm schon, Git-Entwickler, lass uns diese Option schon bekommen!)
Wenn Sie jedoch dasselbe nur mit Git-Befehlen tun möchten, können Sie:
Mit anderen Worten, machen Sie ein Commit (das wir niemals pushen werden) Ihrer aktuellen Änderungen. Jetzt, da Ihr Arbeitsbereich sauber ist, legen Sie Ihren Vorrat ab. Übernehmen Sie jetzt die Stash-Änderungen als Änderung Ihres vorherigen Commits. Nachdem Sie dies getan haben, haben Sie jetzt beide Änderungssätze in einem einzigen Commit zusammengefasst ("Fixme"). Setzen Sie einfach Ihre Kaufabwicklung auf "Eins vor diesem Festschreiben" zurück (--soft NOT --hard, damit tatsächlich nichts verloren geht), und jetzt haben Sie beide Änderungssätze, die nicht festgeschrieben sind.
** BEARBEITEN * *
Mir ist gerade klar geworden, dass es sogar noch einfacher ist. Sie können Schritt 3 vollständig überspringen, also ...
(Übernehmen Sie die aktuellen Änderungen, entfernen Sie die gespeicherten Änderungen und setzen Sie das erste Festschreiben zurück, um beide Änderungssätze in einem nicht festgeschriebenen Zustand zu kombinieren.)
Keine dieser Antworten funktioniert tatsächlich, wenn Sie sich in dieser Situation befinden, wie ich es heute getan habe. Egal wie viele git reset --hard
ich gemacht habe, es hat mich nirgendwohin gebracht. Meine Antwort (keineswegs offiziell) war:
git reflog --all
Ich fand auch, dass die Lösung von Mathias Leppich großartig funktioniert, und fügte meiner globalen .gitconfig einen Alias dafür hinzu
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
Jetzt kann ich einfach tippen
git apply-stash-to-dirty-working-tree
Das funktioniert gut für mich.
(Ihr Kilometerstand kann bei diesem langen Aliasnamen variieren. Aber ich mag eine Portion Ausführlichkeit, wenn es um die Vervollständigung von Bashs geht.)
Sie können einen Versteck auf einen "schmutzigen" Baum anwenden, indem git add
Sie alle vorgenommenen Änderungen vornehmen und so den Baum bereinigen. Dann können Sie git stash pop
die versteckten Änderungen problemlos anwenden.
Sie haben Dateien, die geändert, aber nicht festgeschrieben wurden. Entweder:
git reset --hard HEAD (to bring everything back to HEAD)
oder, wenn Sie Ihre Änderungen speichern möchten:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
Ich konnte die meisten davon nicht zum Laufen bringen; Aus irgendeinem Grund glaubt es immer, dass ich lokale Änderungen an einer Datei habe. Ich kann keinen Stash anwenden, Patches werden nicht angewendet checkout
und reset --hard
schlagen fehl. Was schließlich funktionierte, war, den Stash als Zweig mit zu speichern git stash branch tempbranchname
und dann eine normale Zweigzusammenführung durchzuführen: git checkout master
und git merge tempbranchname
. Von http://git-scm.com/book/en/Git-Tools-Stashing :
Wenn Sie die versteckten Änderungen auf einfachere Weise erneut testen möchten, können Sie den Git-Stash-Zweig ausführen, der einen neuen Zweig für Sie erstellt, das Commit überprüft, bei dem Sie Ihre Arbeit gespeichert haben, Ihre Arbeit dort erneut anwendet und dann den Löschvorgang löscht Verstecken, wenn es erfolgreich angewendet wird
git stash show -p | git apply
anders alsgit stash apply
?