Git Stash Fehler: Git Stash Pop und endete mit Zusammenführungskonflikten

200

Ich habe eine git stash popund endete mit Zusammenführungskonflikten. Ich habe die Dateien aus dem Dateisystem entfernt und wie git checkoutunten gezeigt ausgeführt, aber es wird angenommen, dass die Dateien noch nicht zusammengeführt sind. Ich habe dann versucht, die Dateien zu ersetzen und git checkoutwieder ein und dasselbe Ergebnis zu erzielen. Ich habe versucht, es mit -fFlagge zu erzwingen . Jede Hilfe wäre dankbar!

chirag-patels-macbook-pro:haloror patelc75$ git status
app/views/layouts/_choose_patient.html.erb: needs merge
app/views/layouts/_links.html.erb: needs merge
# On branch prod-temp
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   db/schema.rb
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       unmerged:   app/views/layouts/_choose_patient.html.erb
#       unmerged:   app/views/layouts/_links.html.erb

chirag-patels-macbook-pro:haloror patelc75$ git checkout app/views/layouts/_choose_patient.html.erb
error: path 'app/views/layouts/_choose_patient.html.erb' is unmerged
chirag-patels-macbook-pro:haloror patelc75$ git checkout -f app/views/layouts/_choose_patient.html.erb
warning: path 'app/views/layouts/_choose_patient.html.erb' is unmerged
Chirag Patel
quelle
Hinweis: Das Wiederherstellen des Status vor dem git stash apply/popsollte mit Git 2.5 (Q2 2015) einfacher sein, da der Arbeitsbaum jetzt sauber sein muss: siehe meine Antwort unten
VonC

Antworten:

219

Siehe man git merge ( SO LÖSEN SIE KONFLIKTE ):

Nachdem Sie einen Konflikt gesehen haben, können Sie zwei Dinge tun:

  • Entscheide dich nicht zusammenzuführen. Die einzige Bereinigung, die Sie benötigen, besteht darin, die Indexdatei auf das HEAD-Commit zurückzusetzen, um 2. umzukehren, und die durch 2. und 3 vorgenommenen Änderungen am Arbeitsbaum zu bereinigen.; git-reset --hard kann dafür verwendet werden.

  • Lösen Sie die Konflikte. Git markiert die Konflikte im Arbeitsbaum. Bearbeiten Sie die Dateien in Form und fügen Sie sie dem Index hinzu. Verwenden Sie git commit, um den Deal zu besiegeln.

Und unter TRUE MERGE (um zu sehen, worauf sich 2. und 3. beziehen):

Wenn nicht klar ist, wie die Änderungen abgeglichen werden sollen, geschieht Folgendes:

  1. Der HEAD-Zeiger bleibt gleich.

  2. Die Referenz MERGE_HEAD ist so eingestellt, dass sie auf den anderen Verzweigungskopf zeigt.

  3. Pfade, die sauber zusammengeführt wurden, werden sowohl in der Indexdatei als auch in Ihrem Arbeitsbaum aktualisiert.

  4. ...

Also: Verwenden git reset --hardSie diese Option, git resetwenn Sie die Stash-Änderungen aus Ihrem Arbeitsbaum entfernen möchten oder wenn Sie nur den Index bereinigen und die Konflikte in Ihrem Arbeitsbaum manuell zusammenführen möchten.

Unter man git stash ( OPTIONEN, Pop ) können Sie zusätzlich lesen:

Das Anwenden des Staates kann mit Konflikten fehlschlagen. In diesem Fall wird es nicht aus der Stash-Liste entfernt. Sie müssen die Konflikte von Hand lösen und anschließend git stash drop manuell aufrufen.

Tanascius
quelle
9
Selbst nachdem Sie einen Stash gelöscht haben, ist es immer noch möglich (wenn auch schwieriger), ihn erneut abzurufen, da der Änderungssatz noch im Repository vorhanden ist. stackoverflow.com/search?q=git+recover+dropped+stash
phils
3
@nalply: ist das gut oder schlecht? Sie können gerne meine Antwort verbessern, wo Sie sie überhaupt nicht verstanden haben ...
Tanascius
1
Ich denke, dass die Überarbeitung des Quellcodes eine komplexe Problemdomäne ist. Es ist leicht, verwirrt zu werden. Ich denke immer noch, dass Ihre Antwort gut ist, weil sie meinen Ansatz bestätigt hat.
Nalply
1
Es hat mir nicht nur sehr geholfen zu erkennen, dass der Vorrat nicht so entfernt wurde, wie ich angenommen hatte, sondern dies erklärt auch, warum mein Vorrat weiter gewachsen ist, obwohl ich sicher war, dass ich nicht vergessen hatte, Dinge daraus abzurufen.
Thor84no
11
"Das Anwenden des Status kann mit Konflikten fehlschlagen. In diesem Fall wird er nicht aus der Versteckliste entfernt." Dies ist meiner Meinung nach der wichtigste Teil des Beitrags. Überlegen Sie, ob Sie Ihre Antwort so bearbeiten möchten, dass sie zusammen mit den Worten DON'T PANIC in großen, freundlichen Buchstaben angezeigt wird . (+1 aber schon.) Danke.
Patrick M
42

Mir war etwas Ähnliches passiert. Ich wollte die Dateien noch nicht inszenieren, also fügte ich sie hinzu git addund tat es dann einfach git reset. Dies hat im Grunde nur meine Änderungen hinzugefügt und dann aufgehoben, aber die nicht zusammengeführten Pfade gelöscht.

Aaron
quelle
4
Dies scheint besser zu sein als die Verwendung, reset --hardda Ihre Dateien nicht überschrieben werden (außer bei Dateien mit Zusammenführungsproblemen). Vielen Dank!
Sinelaw
Ich wollte nicht nur noch die Dateien , auf der Bühne , damit ich sie hinzugefügt - nicht addStufe Inhalt aus dem Arbeits Baum auf den Index? Ich glaube nicht, dass ich verstehe, warum Ihre Antwort anhand der Beschreibung funktioniert.
Drew Noakes
2
git addinszeniert sie aber git reset, was ich unmittelbar danach mache, setzt sie frei. Im Wesentlichen räumt es die nicht zusammengeführten Pfade und bringt mich zu meinem normalen Arbeitsbaum zurück, indem es Git vortäuscht.
Aaron
3
Sie müssen nicht, git addwenn Sie gehen git reset. Das git reset"macht" effektiv rückgängig git add. git reset( --mixed<- Standard) berührt das Arbeitsverzeichnis effektiv nicht, sodass genau das, was sich in Ihrem Arbeitsverzeichnis befand, Konflikte zusammenführen und alles in Ruhe gelassen wird. Der Index (und technisch gesehen der Verzweigungskopf) wird jedoch zurückgesetzt (ohne Ref werden sie zurückgesetzt HEAD, was wahrscheinlich keine Änderung für den Verzweigungskopf bedeutet und alle git addam Index vorgenommenen Änderungen rückgängig macht sowie den Status der nicht zusammengeführten Pfade löscht). .
Bambams
3
Die Sequenz , bearbeitet / beheben , git resetund git stash dropfunktioniert gut. Es macht das, was git stash popohne Konflikte geschehen wäre. Es scheint, dass das git addnicht benötigt wird; Obwohl es vielleicht nützlich ist, haben Sie viele Dateien mit Konflikten. Sobald jedes Problem behoben ist , können sie hinzugefügt werden und git statusverfolgen sie.
Kunstloser Lärm
13

Wenn Sie wie ich normalerweise den Inhalt des Arbeitsverzeichnisses mit dem der verwahrten Dateien überschreiben möchten und dennoch ein Konflikt auftritt, möchten Sie den Konflikt mithilfe git checkout --theirs -- .des Stammverzeichnisses lösen .

Danach können Sie git resetalle Änderungen aus dem Index in das Arbeitsverzeichnis übernehmen, da die Änderungen an nicht in Konflikt stehenden Dateien anscheinend im Konfliktfall im Index verbleiben.

Möglicherweise möchten Sie auch git stash drop [<stash name>]danach ausführen , um den Stash zu entfernen, da git stash poper bei Konflikten nicht gelöscht wird.

Pedro Gimeno
quelle
2

Beachten Sie, dass Git 2.5 (2. Quartal 2015) Ein zukünftiger Git könnte versuchen, dieses Szenario unmöglich zu machen.

Siehe Commit ed178ef von Jeff King ( peff), 22. April 2015.
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 05c3967 , 19. Mai 2015)

Hinweis: Dies wurde zurückgesetzt. Siehe unten .

stash: Zum Anwenden von / pop ist ein sauberer Index erforderlich

Problem

Wenn Sie Inhalte in Ihrem Index bereitgestellt und " stash apply/pop" ausgeführt haben, können Konflikte auftreten und neue Einträge in den Index aufgenommen werden.
Die Wiederherstellung des ursprünglichen Zustands ist zu diesem Zeitpunkt schwierig, da Tools wie "git reset --keep" alles, was inszeniert wurde, wegblasen .

Mit anderen Worten:

" git stash pop/apply" Ich habe vergessen sicherzustellen, dass nicht nur der Arbeitsbaum sauber ist, sondern auch der Index.
Letzteres ist wichtig, da eine Stash-Anwendung Konflikte verursachen kann und der Index zur Konfliktlösung verwendet wird.

Lösung

Wir können dies sicherer machen, indem wir uns weigern, uns bei stufenweisen Änderungen zu bewerben.

Das heißt, wenn es zuvor Zusammenführungen gab, weil geänderte Dateien mit einem Stash versehen (hinzugefügt, aber nicht festgeschrieben) wurden, handelt es sich jetzt nicht mehr um Zusammenführungen, da der Stash Apply / Pop sofort beendet wird mit:

Cannot apply stash: Your index contains uncommitted changes.

Wenn Sie gezwungen werden, die Änderungen festzuschreiben, können Sie im Falle von Zusammenführungen den Ausgangszustand (vorher git stash apply/pop) mit a problemlos wiederherstellen git reset --hard.


Siehe Commit 1937610 (15. Juni 2015) und Commit ed178ef (22. April 2015) von Jeff King ( peff) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit bfb539b , 24. Juni 2015)

Dieses Commit war ein Versuch, die Sicherheit beim Anwenden eines Stashs zu verbessern, da der Anwendungsprozess möglicherweise widersprüchliche Indexeinträge erstellt. Danach ist es schwierig, den ursprünglichen Indexstatus wiederherzustellen.

Leider schadet dies einigen gängigen Workflows um " git stash -k", wie:

git add -p       ;# (1) stage set of proposed changes
git stash -k     ;# (2) get rid of everything else
make test        ;# (3) make sure proposal is reasonable
git stash apply  ;# (4) restore original working tree

Wenn Sie zwischen den Schritten (3) und (4) "git commit" ausführen, funktioniert dies einfach. Wenn diese Schritte jedoch Teil eines Pre-Commit-Hooks sind, haben Sie diese Möglichkeit nicht (Sie müssen den ursprünglichen Status wiederherstellen, unabhängig davon, ob die Tests bestanden wurden oder nicht).

VonC
quelle