3230 Stimmen

Ich bin auf einen Merge-Konflikt gestoßen. Wie breche ich den Merge ab?

Ich habe git pull benutzt und hatte einen Merge-Konflikt:

nicht zusammengeführt:   some_file.txt

Du befindest dich mitten in einem konfliktbehafteten Merge.

Wie kann ich meine Änderungen an der Datei aufgeben und nur die gezogenen Änderungen behalten?

48 Stimmen

Ich weiß, dass dies eine superalte Frage ist, aber möchtest du den gesamten Zusammenführungsvorgang abbrechen und den Branch, den du zusammenführen wolltest, nicht zusammenführen lassen? Oder möchtest du einfach nur diese eine Datei ignorieren als Teil eines größeren Zusammenführungsvorgangs, bei dem alle anderen Dateien normal zusammengeführt werden? Für mich impliziert dein Titel Ersteres, der Text deiner Frage möchte Letzteres. Die Antworten geben keine klare Antwort.

0 Stimmen

Ich habe einen ähnlichen Fall beim Commit, der besagt, dass der automatische Merge fehlgeschlagen ist; Konflikte beheben und dann das Ergebnis committen: [abgelehnt] gh-pages -> gh-pages (nicht-fast-forward)

4 Stimmen

Gwyn, es könnte nützlich sein, hier eine akzeptierte Antwort auszuwählen. Die am besten bewertete Antwort ist etwas weniger sicher als einige der aktuellen Lösungen, daher denke ich, dass es hilfreich wäre, andere hervorzuheben :)

21voto

Alain O'Dea Punkte 19581

Eine Alternative, die den Zustand der Arbeitskopie erhält, ist:

git stash
git merge --abort
git stash pop

Ich rate im Allgemeinen davon ab, da es im Grunde genommen wie ein Merge in Subversion ist, da es die Zweigbeziehungen im folgenden Commit verwirft.

0 Stimmen

Ich fand diesen Ansatz nützlich, als ich versehentlich einen git-svn-Zweig zusammengeführt habe, was nicht schön funktioniert. Squash-Merges oder Cherry-Picks sind besser, wenn man mit git-svn-Tracking-Zweigen arbeitet. Im Grunde genommen verwandelt meine Lösung einen Zusammenführung in einen Squash-Merge nachträglich um.

1 Stimmen

Beste Antwort auf die Frage

0 Stimmen

Wie würde sich das von einem Soft-Reset unterscheiden? Ein Soft-Reset setzt auch das Repository auf den Kopf zurück, berührt jedoch nicht die Arbeitskopie.

18voto

Alain O'Dea Punkte 19581

Seit Git 1.6.1.3 git checkout kann von beiden Seiten eines Merges aus gechecked werden:

git checkout --theirs _widget.html.erb

8voto

sastorsl Punkte 1831

Um Probleme dieser Art zu vermeiden, kann man den git merge --abort-Ansatz erweitern und einen eigenen Testzweig vor dem Zusammenführen erstellen.

Fall: Du hast einen Thema-Zweig, der nicht zusammengeführt wurde, weil du abgelenkt warst/es gab Unterbrechungen/du weißt aber es ist (oder war) bereit.

Jetzt ist es möglich, dies mit dem Master zusammenzuführen?

Arbeite in einem Test-Zweig, um eine Lösung abzuschätzen/zu finden, dann verwerfe den Testzweig und wende die Lösung im Thema-Zweig an.

# Thema-Zweig auschecken
git checkout topic-branch-1

# Einen _Test_ Zweig darauf erstellen
git checkout -b test

# Versuch, den Master-Zweig zu mergen
git merge master

# Wenn es fehlschlägt, kannst du den Merge abbrechen
git merge --abort
git checkout -
git branch -D test  # wir kümmern uns wirklich nicht um diesen Zweig...

Arbeite an der Behebung des Konflikts.

# Thema-Zweig auschecken
git checkout topic-branch-1

# Einen _Test_ Zweig darauf erstellen
git checkout -b test

# Versuch, den Master-Zweig zu mergen
git merge master

# Konflikte lösen, durch Tests führen, usw.
# dann
git commit 

# Jetzt könntest du sogar einen separaten Testzweig auf dem Master-Zweig erstellen
# und schauen, ob du zusammenführen kannst
git checkout master
git checkout -b master-test
git merge test

Schließlich den Thema-Zweig wieder auschecken, die Korrektur vom Testzweig anwenden und mit dem PR fortfahren. Zuletzt den Test- und Master-Test-Zweig löschen.

Beteiligt? Ja, aber es wird nicht in meinen Thema- oder Master-Zweig eingreifen, bis ich wirklich bereit bin.

4voto

Malcolm Boekhoff Punkte 912

Ich habe festgestellt, dass Folgendes für mich funktioniert hat (eine einzelne Datei in den Zustand vor dem Merge zurücksetzen):

git reset *aktuelleZweigstelleInDieSieGemergtHaben* -- *zuRücksetzendeDatei*

-11voto

Kamil Kiełczewski Punkte 69048

Sourcetree

Weil du deinen Merge nicht committest, doppelklicke einfach auf einen anderen Branch (was bedeutet, dass du ihn auscheckst) und wenn Sourcetree dich fragt, ob du alle Änderungen verwerfen möchtest, stimme zu.

Hinweis

Diese Antwort richtet sich an diejenigen, die SourceTree als Git-Client verwenden.

2 Stimmen

Der OP verwendet offensichtlich die Befehlszeile. Dein Beitrag hat keinen Mehrwert.

0 Stimmen

Ich stimme zu, dass es offensichtlich ist, dass OP die Befehlszeile verwendet - aber Leute, die die Befehlszeile nicht verwenden, sondern Sourcetree benutzen und ein ähnliches Problem haben, finden diese Frage ganz oben bei Google (wie ich) - daher hat diese Antwort für solche Personen einen Wert - deshalb habe ich sie hier gelassen :)

0 Stimmen

Nicht wirklich, denn ein Merge-Konflikt kann aus verschiedenen Gründen entstehen. Dennoch werden hinter dem, was Sie in der GUI von SourceTree tun, Befehlszeilenbefehle ausgeführt. Ich würde sagen, seien Sie vorsichtig mit der GUI, denn jede unerwartete Störung wie eine schlechte Internetverbindung kann dazu führen, dass Ihre GUI nicht mehr synchron mit dem Git-Index läuft, und Sie könnten auf ein beschädigtes Fluss mit einem git.lock stoßen, das schwer "zu beheben" ist, es sei denn, Sie entfernen es und brechen den Merge-Konflikt ab.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X