"git stash" während einem merge-Konflikt
Wir haben etwas schlimmes gemacht.
Liefen wir git stash save
während einem merge-Konflikt, und jetzt können wir nicht wieder in unsere Arbeit.
Dinge, die wir ausprobiert haben:
git pull -Xours origin master
git stash apply --index
Und:
git pull origin master
git stash save --keep-index "merge conflicts"
git stash apply stash@{1}
Bitte um Hilfe!!
- Hast du eigentlich nichts von Bedeutung? (Tun Sie tatsächlich benötigen, um wieder die verstaut verpasst?) Können Sie nur zurücksetzen entfernt die versucht Zusammenführen, und tun es immer wieder?
- Ja und Nein, beziehungsweise. Die änderungen bestehen aus mehr als einem Tag der merge-Konflikt-Auflösung.
- Wenn Sie mehr brauchen dann einen Tag für den merge-Konflikt-Auflösung kann es Zeit, zu überdenken, Ihre Politik in Bezug auf Niederlassung Handhabung und Arbeit Verteilung (oder merge-Frequenz). Langwierige merge-Auflösungen sind doch eine nette Quelle für schwer zu findende Fehler aufgrund der Menge von änderungen in einem commit
- Welchen Fehler hast du bekommen? Warum nicht ein einfaches "git stash apply'?
- Da
stash save
löscht den index und diestash apply
nicht ändern, werden Sie am Ende mit regelmäßigen unstaged changes, nicht Zusammenführen. Ich möchte diese änderungen während der Zusammenführung, aber nicht sehen können, wie. - Haben Sie versucht, mit einer gui zu prüfen, Ihre repo? gitx zeigt lagern, die manchmal schwer zu finden sind, auf die cli. Helfen könnte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Problem scheint zu sein, dass
git stash
nicht speichern eine Referenz auf die Niederlassung, für die Sie versuchen, zu verschmelzen in. Während eines merge, gespeichert in einem ref-namensMERGE_HEAD
.Es zu beheben und wieder zu Ihrem vorherigen Zustand, Sie brauchen, um zu finden, die revision (lasst uns so tun, es ist d7a9884a380f81b2fbf002442ee9c9eaf34ff68d) die Sie versuchen zu verschmelzen in, und legen Sie MERGE_HEAD, um es, nachdem Sie das Versteck.
Dann können Sie die stash (mit --index zu re-Bühne alles, was inszeniert wurde, bevor), und stellen Sie Ihre
MERGE_HEAD
:.git/MERGE_MSG
gar nicht gibt, die ich erstellt, die Datei mit einer benutzerdefinierten merge-Nachricht und dann beging ich nach. Ich war besorgt, dass ich würde so markiert werden, dass der Autor alle änderungen, die in der Zusammenführung, aber es scheint geklappt wie es sollte. Andere Autoren richtig creditted. Vielen Dank 🙂Habe ich die gleiche Sache heute, und nahm einen anderen Ansatz (nach trial and error), um wieder an den Stand nur vor zu verstauen, so konnte ich weiterhin das lösen von Konflikten und den Seriendruck abzuschließen.
Ersten, nach unstashing die teilweise verschmelzen in der Ziel-Niederlassung, ich eroberte eine Liste der Dateien, die mit dem restlichen Konflikte (text-Datei oder editor-tab). Dies ist nur die Liste der unstaged Dateien nach unstashing, wie die Dateien mit Konflikten bereits aufgelöst gewesen wäre, inszeniert vor zu verstauen.
Als Nächstes habe ich einen patch erstellt und reset-Zweig zurück auf die pre-merge-Zustand:
Dann erstellte ich ein vorübergehender Zweig, der (abgeleitet von der merge-Ziel-Filiale), und den patch angewendet:
So der LEITER der my-temp-Zweig enthält nun alles, was zusammengeführt wurde, einschließlich der Dateien mit dem Konflikte gelöst werden, und Dateien mit dem verbleibenden Konflikte.
Dann wechselte ich zurück zum ursprünglichen Zweig, wieder zusammengeführt, und schaute auf den git status
Den status-zeigt die vollständige Liste von Dateien mit Konflikten:
Nun, ich brauchte den Vergleich dieser beiden Listen von Dateien. Alle Dateien in der zweiten Liste, aber nicht die ersten hatten sich bereits gelöst (in diesem Beispiel Class1.java und Class2.java). So ist für jede dieser Dateien, die ich zog in der version mit dem Konflikte gelöst werden aus der temporären Zweig (wie cherry-pick, aber für einzelne Dateien anstatt einer kompletten commit):
Nachdem dies erledigt war, wurde ich zurück auf den Stand vor dem Versteck, so dass ich konnte wieder die Lösung der verbleibenden Konflikte und commit den merge.
Wenn Sie sich in einem Konflikt befinden ( index-und Arbeitsverzeichnis), die Sie nicht in der Lage sein zu tun
git stash
- es wird eine Fehlermeldung zu geben, die übersättigt individueller Einträge.Stellen Sie sicher, dass Sie wirklich ein Versteck. Siehe die Ausgabe von
git stauts
undgit stash show
git stash
, ich habe das Problem gelöst und weiter verwendengit add
. Es war, nachdem ichgit add
meine Beschlüsse, die ich aus weiter bearbeitet und habe dann einegit stash save msg
. So, dass war erfolgreich.git stash save
tatsächlich Abbrechen, ohne Aufhänger der konfliktbehafteten Datei. So dies ist eigentlich richtig, es ist nicht falsch.Ihrem letzten Kommentar : Sie können
um den index in einem "merge" - Staat, ohne dass die änderungen
dann ändern Sie es mit was Sie wollen :
wenn Sie bereits gearbeitet haben aus Ihrem Seriendruck im stash :
und sobald alles in den gewünschten Zustand,
git commit
Über bukzor's Kommentar : es ist eigentlich ein großer Unterschied zwischen
git checkout <tree-ish>
undgit checkout <tree-ish> -- <files>
.Aus der Referenz auf
git checkout
:git checkout <branch>
: Diese form schaltet Zweige durch die Aktualisierung des index, arbeiten, Baum -, und KOPF zu reflektieren, die von der angegebenen Filiale oder Begehen.git checkout [-p|--patch] <tree-ish> -- <pathspec>
: Wenn <Pfade> oder --patch gegeben, der git checkout nicht wechseln Zweige. Es aktualisiert die benannte Pfade in der Arbeitsgruppe Baum vom index-Datei oder aus einer namens <tree-ish> (meist ein Begehen).git checkout <initial commit>
wäre in der Tat zu verwerfen, das Zusammenführen von Informationen.git checkout <initial commit> -- ./
(beachten Sie die zusätzliche-- ./
), auf der anderen Seite, halten die Informationen zusammenzuführen, und wieder alle verfolgt-Datei in den Zustand, in<initial commit>
.git checkout
entfernen das Zusammenführen der Staat, oder etwa nicht? Ich werde am Ende mit einem normalen commit, der dups alle änderungen in der master.git stash apply
löscht auch das Zusammenführen von Staat, explizit die Einstellung der MERGE_HEAD ref wie vorgeschlagen in Evan ' s Antwort hat den trick für michgit stash merge
🙁Meine Lösung, um aus diesem (git stash pop während einem merge-Konflikt) war:
erstellen und Kasse eine neue (lokale) Zweig mytemporarybranch
Begehen in diesem mytemporarybranch
Kasse myoriginalbranch
merge korrekt (kein squash-pop/anwenden dieser Zeit!)
squash Zusammenführen der mytemporarybranch auf die myoriginal Zweig