Ich versuche, Änderungen anzuwenden, mit denen ich zuvor verwahrt habe, git stash pop
und erhalte die folgende Nachricht:
Cannot apply to a dirty working tree, please stage your changes
Irgendwelche Vorschläge, wie man damit umgeht?
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 show -p | git apply
anders alsgit stash apply
?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:
und dann (optional):
quelle
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.
quelle
Bereinigen Sie entweder Ihr Arbeitsverzeichnis mit git reset, übernehmen Sie die Änderungen oder versuchen Sie Folgendes, wenn Sie die aktuellen Änderungen speichern möchten:
Dadurch werden die aktuellen Änderungen gespeichert und dann der zweite Speicher aus dem Stapel gestapelt.
quelle
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.)
quelle
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
quelle
Ich fand auch, dass die Lösung von Mathias Leppich großartig funktioniert, und fügte meiner globalen .gitconfig einen Alias dafür hinzu
Jetzt kann ich einfach tippen
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.)
quelle
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 Siegit stash pop
die versteckten Änderungen problemlos anwenden.quelle
Sie haben Dateien, die geändert, aber nicht festgeschrieben wurden. Entweder:
oder, wenn Sie Ihre Änderungen speichern möchten:
quelle
Ich hatte das gleiche Problem, aber Git hatte keine geänderten Dateien. Es stellte sich heraus, dass ich eine index.lock-Datei hatte, die herumlag. Das Löschen löste das Problem.
quelle
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
undreset --hard
schlagen fehl. Was schließlich funktionierte, war, den Stash als Zweig mit zu speicherngit stash branch tempbranchname
und dann eine normale Zweigzusammenführung durchzuführen:git checkout master
undgit merge tempbranchname
. Von http://git-scm.com/book/en/Git-Tools-Stashing :quelle