Wie in dieser Frage gestellt , möchte ich auch wissen, wie ein Konflikt gelöst werden kann, git stash pop
ohne dass alle Änderungen an einem Commit hinzugefügt werden (genau wie bei "git stash pop" ohne Konflikt).
Mein aktueller Ansatz ist sehr unkühl, weil ich es so mache:
git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>
[Update] Eine Möglichkeit, es zu reproduzieren:
mkdir foo; cd foo; git init
echo "1" > one
echo "2" > two
git add -A; git commit -m "first"
echo "1.1" > one
echo "2.1" > two
git stash
echo "2.2" > two
git commit -a -m "second"
echo "Only this file would stay in HEAD without the conflict" > third
git add third
git stash pop
git status
27.06.2016: Dem Beispiel wurde eine neue Datei mit dem Namen "Third" hinzugefügt, um zu zeigen, dass Problemumgehungen wie die Lösung von scy nur für leere HEADs funktionieren, aber das anfängliche Problem nicht beheben, dass der HEAD nicht den gleichen Inhalt hat wie für einen git stash pop
ohne Konflikt.
git add
Ihre gelösten Konfliktdateien, die sie effektiv im Index bereitstellen, und möchten sie nicht in unserem Index haben?git stash pop
das auftritt , wenn kein Konflikt auftritt (aber mit der Benachrichtigung, welche Dateien zusammengeführt werden müssen).Antworten:
Folge keinen anderen Antworten
Nun, du kannst ihnen folgen :). Ich denke jedoch nicht, dass das Festschreiben und anschließende Zurücksetzen des Zweigs zum Entfernen dieses Festschreibens und ähnlicher Problemumgehungen, die in anderen Antworten vorgeschlagen wurden, der saubere Weg ist, um dieses Problem zu lösen.
Saubere Lösung
Die folgende Lösung scheint mir viel sauberer zu sein und wird auch vom Git selbst vorgeschlagen - versuchen Sie, sie
git status
mit einem Konflikt im Repository auszuführen :Machen wir also, was Git vorschlägt (ohne nutzlose Commits zu machen):
git reset
diese Option, um Konflikte als gelöst zu markieren und die Änderungen aufzuheben. Sie können es ohne Parameter ausführen und Git entfernt alles aus dem Index. Sie müssen nicht vorher ausführengit add
.git stash drop
, da Git dies bei Konflikten nicht tut.Übersetzt in die Kommandozeile:
Erläuterung des Standardverhaltens
Es gibt zwei Möglichkeiten, Konflikte als gelöst zu kennzeichnen:
git add
undgit reset
. Währendgit reset
die Konflikte als gelöst markiert und Dateien aus dem Index entfernt werden,git add
werden die Konflikte auch als gelöst markiert, die Dateien bleiben jedoch im Index.Das Hinzufügen von Dateien zum Index nach Behebung eines Konflikts ist absichtlich. Auf diese Weise können Sie die Änderungen vom vorherigen Stash und die Änderungen unterscheiden, die Sie nach der Lösung des Konflikts vorgenommen haben. Wenn es Ihnen nicht gefällt, können Sie jederzeit
git reset
alles aus dem Index entfernen.Werkzeuge zusammenführen
Ich empfehle dringend, eines der 3-Wege-Merge-Tools zur Lösung von Konflikten zu verwenden, z. B. KDiff3 , Meld usw., anstatt dies manuell zu tun. Normalerweise werden alle oder die meisten Konflikte automatisch selbst gelöst. Das spart enorm viel Zeit!
quelle
git stash pop
es mit Konflikten versagt.git stash drop
sei denn, Sie möchten diesen Vorrat behalten.Angenommen, Sie haben dieses Szenario, in dem Sie Ihre Änderungen aufbewahren, um sie vom Ursprung abzurufen. Möglicherweise, weil Ihre lokalen Änderungen nur
debug: true
in einigen Einstellungsdateien enthalten sind. Jetzt ziehen Sie und jemand hat dort eine neue Einstellung eingeführt, die einen Konflikt erzeugt.git status
sagt:Okay. Ich entschied mich für das, was Git vorschlug: Ich löste den Konflikt und verpflichtete mich:
Jetzt befindet sich meine Arbeitskopie in dem gewünschten Zustand, aber ich habe ein Commit erstellt, das ich nicht haben möchte. Wie kann ich dieses Commit entfernen, ohne meine Arbeitskopie zu ändern? Warten Sie, es gibt einen beliebten Befehl dafür!
Meine Arbeitskopie wurde nicht geändert, aber das WIP-Commit ist weg. Genau das wollte ich! (Beachten Sie, dass ich nicht benutze
--soft
hier , denn wenn sich in Ihrem Vorrat automatisch zusammengeführte Dateien befinden, werden diese automatisch bereitgestellt, sodass diese Dateien nachher erneut bereitgestellt werdenreset
.)Aber noch etwas ist übrig: Die Manpage für
git stash pop
erinnert uns daran, dass "das Anwenden des Status mit Konflikten fehlschlagen kann; in diesem Fall wird es nicht aus der Stash-Liste entfernt. Sie müssen die Konflikte von Hand lösen und anschließendgit stash drop
manuell aufrufen ." Genau das machen wir jetzt:Und fertig.
quelle
git add <resolved conflict files>
folgengit reset HEAD
?git stash pop
ohne Konflikt ist. Fügen Sie einfach eine weitere Datei zu HEAD hinzu, bevor Sie den Konflikt ausführen,git stash pop
undgit commit -a -m WIP
fügen Sie dann auch die neue Datei zum Commit hinzu. Ohne einen Konflikt würde jedoch nur die neue Datei in HEAD verbleiben, nicht jedoch diegit stash pop
Dateien.^
wird das als spezielle Zeilenfortsetzung verwendet und lässt Sie an einem More sitzen? Eingabeaufforderung statt Ausführung des Befehls. Verwenden Sie stattdessen :git reset --soft HEAD~1
. Sehen Sie, wie-ich-lösche-unpushed-git-Commits?Anstatt die Änderungen hinzuzufügen, die Sie zur Lösung des Konflikts vornehmen, können Sie sie verwenden
git reset HEAD file
den Konflikt auch ohne Bereitstellung Ihrer Änderungen lösen.Möglicherweise müssen Sie diesen Befehl jedoch zweimal ausführen. Einmal, um den Konflikt als gelöst zu markieren und einmal, um die Änderungen aufzuheben, die von der Konfliktlösungsroutine vorgenommen wurden.
Es ist möglich, dass es einen Reset-Modus gibt, der beide Dinge gleichzeitig ausführt, obwohl es derzeit keinen gibt.
quelle
arbeitete für mich.
Hinweis : Dies kann gefährlich sein, da nicht versucht wird, die Änderungen aus dem Stash in Ihre Arbeitskopie einzufügen, sondern sie stattdessen mit den verstauten Dateien überschreibt . So können Sie Ihre nicht festgeschriebenen Änderungen verlieren.
quelle
git add .
wird ALLE Dateien bereitstellen, die git mitteilen, dass Sie den Konflikt gelöst habengit reset
hebt ALLE bereitgestellten Dateien auf, ohne ein Commit zu erstellenquelle
git add -u
damalsgit reset
Es scheint, dass dies die Antwort ist, nach der Sie suchen. Ich habe dies noch nicht persönlich versucht, aber es scheint, als würde es den Trick tun. Mit diesem Befehl versucht GIT, die Änderungen wie zuvor anzuwenden, ohne alle für das Festschreiben hinzuzufügen.
git stash apply --index
Hier ist die vollständige Erklärung:
http://git-scm.com/book/en/Git-Tools-Stashing
quelle
git stash pop
- oder gibt es eine Möglichkeit, dies rückgängig zu machen und zu tun,git stash apply --index
wenn ich herausgefunden habe, dassgit stash pop
es zu einem Konflikt kommen wird?git stash pop
und es zu Konflikten kommt, der Stash nicht entfernt wird. Sie können also ausführengit reset --hard
, um den Pop rückgängig zu machen, und dann die von mir vorgeschlagene Lösung ausprobieren.git stash branch
will works, das einen neuen Zweig für Sie erstellt, überprüft das Commit, bei dem Sie Ihre Arbeit gespeichert haben, wendet Ihre Arbeit dort erneut an und löscht das Stash, wenn es erfolgreich angewendet wird. Überprüfen Sie diesquelle
Der schnellste Weg, den ich gefunden habe, besteht darin, den Konflikt zu lösen, dann zu tun
git add -u
und dann zu tungit reset HEAD
, ohne dass ein Commit erforderlich ist.quelle
Laut git stash sind Fragen nach Behebung des Konflikts
git add <file>
die richtige Vorgehensweise.Nachdem ich diesen Kommentar gelesen hatte , wurde mir klar, dass die Änderungen automatisch zum Index hinzugefügt werden (beabsichtigt). Deshalb ist
git add <file>
der Konfliktlösungsprozess abgeschlossen.quelle
Es ist nicht der beste Weg, aber es funktioniert:
quelle
file/path/to/your/file
AFAIU