Folgen Sie nicht den anderen Antworten...
Nun, man kann ihnen natürlich folgen. Aber ich glaube nicht, dass ein Commit und das anschließende Zurücksetzen der Verzweigung, um den Commit zu entfernen, den Sie gerade erstellt haben, und ähnliche in anderen Antworten vorgeschlagene Workarounds der saubere Weg sind, dieses Problem zu lösen.
Saubere Lösung
Die folgende Lösung scheint mir viel sauberer zu sein, und sie ist auch von der Git selbst vorgeschlagen - versuchen, auszuführen git status
im Repository mit einem Konflikt:
Unmerged paths:
(use "git restore --staged <file>..." to unstage)
(use "git add <file>..." to mark resolution)
Anmerkung: Die restore
Befehl ist in Git eingeführt worden Version 2.23.0 . Ältere Versionen von Git schlugen vor, den Befehl git reset HEAD <file>...
anstelle von git restore --staged <file>...
. Sie können auch Folgendes verwenden git reset
um alle Dateien im Staging-Bereich zu entsperren (genannt die Index ). Das Äquivalent des Befehls Restore ist git restore --staged .
(der Punkt ist notwendig und gibt eine beliebige Datei an). Derzeit, jeder dieser Befehle kann verwendet werden und das Ergebnis ist das gleiche . Wenn Sie mehr über die Unterschiede zwischen diesen Befehlen erfahren möchten, lesen Sie die Dokumentation .
Tun wir also, was Git vorschlägt ( ohne sinnlose Übertragungen vorzunehmen und rückgängig zu machen ):
- Manuell (oder idealerweise mit Hilfe einer Merge-Tool (siehe unten) den Konflikt/die Konflikte lösen.)
- 使用方法
git restore --staged .
Konflikt(e) als gelöst und ungelöst markieren alle Dateien im Staging-Bereich. Wenn Sie nur bestimmte Dateien aus dem Staging-Bereich entfernen möchten, verwenden Sie den Befehl git restore --staged <file>
stattdessen. Sie müssen nicht ausführen git add
vor.
- Schließlich entfernen Sie das Versteck mit
git stash drop
weil Git dies bei Konflikten nicht automatisch tut.
Übersetzt in die Befehlszeilenbefehle:
$ git stash pop
# ...resolve conflict(s)
$ git restore --staged .
$ git stash drop
Erläuterung des Standardverhaltens
Es gibt zwei Möglichkeiten, Konflikte als gelöst zu markieren: git add
y git restore --staged <file>...
. Während git restore --staged <file>...
markiert die Konflikte als gelöst und entfernt die Dateien aus dem Index, git add
markiert die Konflikte ebenfalls als gelöst, behält aber die Dateien im Index.
Das Hinzufügen von Dateien zum Index, nachdem ein Konflikt behoben wurde, ist beabsichtigt. Auf diese Weise können Sie zwischen den Änderungen aus dem vorherigen Versteck und den Änderungen, die Sie nach der Konfliktlösung vorgenommen haben, unterscheiden. Wenn Ihnen das nicht gefällt, können Sie jederzeit git restore --staged .
um alles aus dem Index zu entfernen.
Tools zum Zusammenführen
Ich empfehle dringend die Verwendung einer der 3-Wege-Zusammenführungswerkzeuge zur Lösung von Konflikten, z.B. KDiff3 , Melden usw., anstatt dies manuell zu tun. In der Regel löst es alle oder die meisten Konflikte automatisch selbst. Es ist riesig Zeitersparnis!