Wie beende ich die Zusammenführung, nachdem ich meine Zusammenführungskonflikte gelöst habe?

282

Ich habe den Abschnitt " Grundlegendes Verzweigen und Zusammenführen " des Git-Community-Buches gelesen .

Also folge ich ihm und erstelle einen Zweig : experimental.

Dann habe ich:

  1. zum experimentellen Zweig wechseln (git checkout experimentell)
  2. Nehmen Sie eine Reihe von Änderungen vor
  3. Commit it (Git Commit -a)
  4. zum Hauptzweig wechseln (git checkout master)
  5. Nehmen Sie einige Änderungen vor und verpflichten Sie sich dort
  6. wieder experimentell wechseln (git checkout experimentell)
  7. Merge Master Wechsel zu Experimental (Git Merge Master)
  8. Es gibt einige Konflikte, aber nachdem ich sie gelöst habe, habe ich 'git myfile' hinzugefügt.

  9. Und jetzt stecke ich fest, ich kann nicht zurück zum Meister gehen

wenn ich es tue

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

und ich tat:

$ git rebase --abort

Keine Rebase in Bearbeitung?

und ich tat :

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

Was kann ich tun, um zu meiner Hauptniederlassung zurückzukehren?

Michael
quelle
Nachdem ich den Konflikt behoben habe, füge das Hinzufügen hinzu und versuche dann, das Festschreiben mit durchzuführen. Dies git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts"führt zu fatal: cannot do a partial commit during a merge.. Und natürlich scheinen "Partial Commits" nirgendwo auf den Git-Manpages dokumentiert oder diskutiert zu werden. Das Durchführen eines git mergenach dem Fix führt zu Please, commit your changes before you can merge.Was für ein kaputtes
Arschwerkzeug
2
Git Commit mit expliziten Pfaden ist in der Manpage in der BESCHREIBUNG "als" 3 dokumentiert. durch Auflisten von Dateien als Argumente für den Commit-Befehl. In diesem Fall ignoriert das Commit die im Index bereitgestellten Änderungen und zeichnet stattdessen den aktuellen Inhalt der aufgelisteten Dateien auf (die Git bereits bekannt sein müssen). "und auch unter dem '- Ich bin mir ziemlich sicher, dass die Zusammenführungsnachricht von jemandem geschrieben wurde, der davon ausgegangen ist, dass Sie gelesen haben, wie der Commit-Befehl funktioniert, und die Bedeutung des Wortes "teilweise" in dieser Beschreibung erkennen könnte, wenn nicht bereits dann zumindest wieder und sorgfältiger. @jww
jthill
1
Warum sollte diese Fallstudie zum Verständnis sorgfältig gelesen werden, während die Manpages dies nicht tun? @jww
jthill
1
Die Verwendung von Git erfordert eindeutig ein besseres Leseverständnis, als Sie erwerben möchten. Ich bin mir vielleicht noch unsicherer, ob das ein Fehler in Git ist, als Sie sicher sind.
Bis zum
1
Mit Git 2.12 (Q1 2017) werden Sie bald einfach eine machen git merge --continue. Siehe meine Antwort unten
VonC

Antworten:

267

Wenn während einer Zusammenführung ein Konflikt auftritt, müssen Sie das Zusammenführungs-Commit manuell beenden. Es hört sich so an, als hätten Sie die ersten beiden Schritte ausgeführt, um die in Konflikt stehenden Dateien zu bearbeiten und sie dann auszuführen git add, um sie als gelöst zu markieren. Schließlich müssen Sie die Zusammenführung mit tatsächlich festschreiben git commit. An diesem Punkt können Sie die Zweige wieder wechseln.

Jimmy Cuadra
quelle
Wenn Sie "git gui &" verwenden, um das Commit durchzuführen, stellen Sie möglicherweise nicht fest, dass Ihr Zweigstatus nicht mehr "zusammengeführt" wird. Das Nachverfolgen eines "Git-Status" ist hilfreich, um sicherzustellen, dass Ihr Zweigstellenstatus korrekt ist.
Tony Ashworth
4
Versuchen Sie git commit -am "your commit message", das Hinzufügen und Festschreiben gleichzeitig durchzuführen.
Vaheeds
3
git commitfunktioniert. Verwenden Sie es am besten, um die für Sie ausgefüllte Standardnachricht zum Festschreiben von Zusammenführungen zu erhalten. Ich vermeide "git commit -am", da es die Nachricht überschreibt
Arijoon
1
Versuchen Sie es git push.
Alper
Ich habe diese Situation im folgenden Szenario -> Ich habe den X-Zweig mit dem Y-Zweig zusammengeführt. Dann wurde mir klar, dass ich in Zweig Y etwas falsch gemacht habe, also habe ich das behoben und dann meine Änderungen in Zweig Y "geändert". Aufgrund der Änderung hat git kein neues Commit erstellt. Als ich also den X-Zweig mit dem aktualisierten Y-Zweig zusammenführte, gab es einen Konflikt. Übrigens danke für diese Antwort.
Doga
157

Wie beende ich die Zusammenführung, nachdem ich meine Zusammenführungskonflikte gelöst habe?

Mit Git 2.12 (Q1 2017) haben Sie den natürlicheren Befehl:

git merge --continue

Siehe Commit c7d227d (15. Dezember 2016) von Jeff King ( peff) .
Siehe Commit 042e290 , Commit c261a87 , Commit 367ff69 (14. Dezember 2016) von Chris Packham ( cpackham) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 05f6e1b , 27. Dezember 2016)

Siehe 2.12 Versionshinweise .

merge: --continueOption ' ' als Synonym für ' git commit' hinzufügen

Lehren Sie git mergedie --continueOption, mit der Sie eine Zusammenführung fortsetzen können, indem Sie sie abschließen.
Die traditionelle Art, eine Zusammenführung nach der Lösung von Konflikten abzuschließen, ist die Verwendung von ' git commit'.
Mit Befehlen wie ' git rebase' und ' git cherry-pick', die eine ' --continue' Option haben, wird durch Hinzufügen einer solchen Option zu ' git merge' eine konsistente Benutzeroberfläche angezeigt.

VonC
quelle
Ich war gerade dabei, einen Kommentar darüber zu schreiben, wie dies kürzlich in 2.12 im ersten Quartal 2017 hinzugefügt wurde, aber dann habe ich die erste Zeile Ihrer Antwort erneut gelesen. Kein Wunder, dass die Option für mich in Version 2.10 nicht gefunden wurde!
cjsimon
1
Ich habe git merge --continue ausprobiert und Git Bash konnte das nicht als Befehl erkennen. Aber was funktionierte war git commit -m "Commit message"
Mimi
2
@Mimi OK, aber benutzt du ein Git 2.12 oder mehr?
VonC
@VonC du bist richtig, ich benutze eine ältere Version von Git!
Mimi
23

Falls Sie während einer Zusammenführung / Neuausrichtung jemals stecken bleiben, können Sie dies jederzeit tun

git reset --hard

um Ihre Arbeit auf den Stand des letzten Commits zurückzusetzen. Dadurch gehen Ihre Änderungen aus dem Arbeitsbaum verloren. Wenn Sie also vor der Zusammenführung lokale Änderungen vorgenommen haben, werden diese danach gelöscht. Aus diesem Grund ist es ratsam, keine Zusammenführung zu starten, wenn Sie lokale Änderungen vorgenommen haben. :) :)

Bombe
quelle
15
obligatorische Warnung: git reset --hardwirft nicht festgeschriebene Änderungen weg
Geoffrey Hale
2
Warum nicht einfach git merge --abort, was kein Risiko birgt, etwas zu verlieren?
Alexander George
11

Gerade git commit so.

Optional ist git abortes:
Ich bin auf einen Zusammenführungskonflikt gestoßen. Wie kann ich die Zusammenführung abbrechen?

Installieren Sie kdiff3 und konfigurieren Sie es als Mergetool, um das Leben bei Zusammenführungen zu vereinfachen. Anleitung: http://doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-resolved-use-the-command-line/

Diese Seite enthält dieses Video: https://www.youtube.com/watch?v=Cc4xPp7Iuzo

Shimon Doodkin
quelle
11

Wann immer Sie zwei Zweige mit dem Befehl zusammenführen git merge brancha branchb, gibt es zwei Möglichkeiten:

  1. Ein Zweig (sagen wir Zweiga) kann von dem anderen Zweig (sagen wir Zweigb) erreicht werden, indem der Commit-Verlauf verfolgt wird. In diesem Fall spult git den Kopf einfach vor, um auf den letzten Zweig zu zeigen (in diesem Fall Zweigb).

    2.Aber wenn die beiden Zweige an einem älteren Punkt auseinander gegangen sind, erstellt git einen neuen Snapshot und fügt ein neues Commit hinzu, das darauf verweist. Falls also kein Konflikt zwischen den Zweigen besteht, die Sie zusammenführen, erstellt git reibungslos ein neues Commit.

Führen git logSie das Commit aus, um es anzuzeigen, nachdem Sie zwei nicht in Konflikt stehende Zweige zusammengeführt haben.

Kommen wir nun zu dem interessanten Fall zurück, in dem es Zusammenführungskonflikte zwischen den zusammengeführten Zweigen gibt. Ich zitiere dies von der Seite https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

Git hat nicht automatisch ein neues Merge-Commit erstellt. Der Vorgang wurde angehalten, während Sie den Konflikt lösen. Wenn Sie sehen möchten, welche Dateien nach einem Zusammenführungskonflikt zu einem beliebigen Zeitpunkt nicht zusammengeführt werden, können Sie sie ausführengit status


Wenn es also Zusammenführungskonflikte gibt, müssen Sie den Konflikt lösen, dann die Änderungen, die Sie vorgenommen haben, zum Staging-Bereich hinzufügen und die Änderungen git add filenamedann mithilfe des Befehls git commit festschreiben, der aufgrund des Konflikts von git angehalten wurde. Ich hoffe, dies erklärt Ihre Abfrage. Besuchen Sie auch den obigen Link für ein detailliertes Verständnis. Bei Fragen bitte unten kommentieren, ich helfe Ihnen gerne weiter.

Sourav Prem
quelle
7

Die nächsten Schritte nach der manuellen Lösung der Konflikte sind:

  1. git hinzufügen.
  2. Git-Status (dies zeigt Ihnen, welche Befehle erforderlich sind, um den automatischen Zusammenführungsvorgang fortzusetzen)
  3. [Befehl git schlägt vor, zum Beispiel git merge --continue, git cherry-pick --continue, git rebase --continue]
Schüchtern
quelle
16
Es gibt keine Git-Zusammenführung
Hola Soja Edu Feliz Navidad
@HolaSoyEduFelizNavidad Dies ist falsch. Zie Git Ausgabe unten nach Konflikt: - error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
Timidfriendly
5
Es gibt Rebase - Fortsetzung, nicht Zusammenführung
Hola Soja Edu Feliz Navidad
git merge --continue, was ich versuche zu tun, führt zu error: unknown option 'continue'. Ich bin mir ziemlich sicher, dass Ihre Antwort falsch ist, da die git-mergeManpage sie nicht auflistet. Welche Version von Git verwenden Sie? Ich benutze git version 1.8.5.2 (Apple Git-48). Ich habe es auch mit MacPorts versucht git version 2.9.3.
jww
1
Mit Git 2.10 für eine einfache Zusammenführung ist der Befehl einfach altgit commit
Chris Charabaruk
2

Ein Zusammenführungskonflikt tritt auf, wenn zwei Zweige, die Sie zusammenführen möchten, denselben Teil derselben Datei geändert haben. Sie können eine Liste von Konflikten mit erstellen git status.

Wenn die in Konflikt stehende Zeile auftritt, bearbeitet Git den Inhalt der betroffenen Dateien mit visuellen Indikatoren, die beide Seiten des in Konflikt stehenden Inhalts markieren.

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

Wenn Sie Ihre in Konflikt stehenden Dateien repariert haben und zum Zusammenführen bereit sind, müssen Sie nur noch ausführen git addund git commitdas Zusammenführungs-Commit generieren. Sobald das Commit durchgeführt wurde, werden git pushdie Änderungen an der Verzweigung vorgenommen.

Referenzartikel: Git Merge .

Nesha Zoric
quelle
2

Nachdem alle Dateien hinzugefügt wurden, ist der nächste Schritt ein " Git Commit" ".

"git status" schlägt vor, was zu tun ist: Dateien, die noch hinzugefügt werden müssen, werden unten aufgelistet. Wenn alle abgeschlossen sind, wird oben ein Commit vorgeschlagen, in dem der Zusammenführungsstatus des aktuellen Zweigs erläutert wird.

Kobold
quelle
1

Als erstes möchte ich klarstellen, dass Zweigstellennamen nur ein Alias ​​für ein bestimmtes Commit sind. Ein Commit ist das, was Git funktioniert, wenn Sie ziehen, Merge drücken und so weiter. Jedes Commit hat eine eindeutige ID.

Wenn Sie $ git zusammenführen, geschieht tatsächlich, dass git versucht, Ihren aktuellen Zweig schnell zu dem Commit vorzuspulen, auf dem sich der Zweig befindet (mit anderen Worten, beide Filialnamen verweisen auf dasselbe Commit). Dieses Szenario ist für git am einfachsten zu behandeln, da es kein neues Commit gibt. Stellen Sie sich vor, der Meister springt auf den Lilipad, auf dem sich Ihr Zweig abkühlt. Es ist möglich, das Flag --no-ff zu setzen. In diesem Fall erstellt git ein neues Commit, unabhängig davon, ob Codekonflikte aufgetreten sind.

In einer Situation, in der Codekonflikte zwischen den beiden Zweigen bestehen, die Sie zusammenführen möchten (normalerweise zwei Zweige, deren Festschreibungsverlauf in der Vergangenheit ein gemeinsames Festschreiben aufweist), funktioniert der schnelle Vorlauf nicht. git kann die Dateien möglicherweise weiterhin automatisch zusammenführen, solange dieselbe Zeile nicht von beiden Zweigen in einer widersprüchlichen Datei geändert wurde. In diesem Fall führt git die in Konflikt stehenden Dateien für Sie zusammen UND schreibt sie automatisch fest. Sie können eine Vorschau der Arbeit von git anzeigen, indem Sie $ git diff --cached ausführen. Oder Sie können das Flag --no-commit an den Befehl merge übergeben, wodurch geänderte Dateien in Ihrem Index verbleiben, die Sie hinzufügen und festschreiben müssen. Sie können diese Dateien jedoch unterscheiden, um zu überprüfen, wie sich die Zusammenführung ändert.

Das dritte Szenario ist, wenn es Konflikte gibt, die Git nicht automatisch lösen kann. In diesem Fall müssen Sie sie manuell zusammenführen. Meiner Meinung nach ist dies am einfachsten mit einer Zusammenführung wie Araxis Merge oder p4merge (kostenlos) zu tun. In jedem Fall müssen Sie jede Datei einzeln ausführen. Wenn die Zusammenführung jemals hängen bleibt, verwenden Sie $ git merge --continue, um sie voranzutreiben. Git sollte dir sagen, ob es nicht weitergehen kann und wenn ja, warum nicht. Wenn Sie das Gefühl haben, dass Sie die Zusammenführung irgendwann verloren haben, können Sie $ git merge --abort ausführen. Jede Zusammenführung wird rückgängig gemacht und Sie können von vorne beginnen. Wenn Sie fertig sind, ist jede Datei, die Sie zusammengeführt haben, eine geänderte Datei, die hinzugefügt und festgeschrieben werden muss. Sie können überprüfen, wo sich die Dateien mit dem Status $ git befinden. Wenn Sie die zusammengeführten Dateien noch nicht festgeschrieben haben. Sie müssen dies tun, um die Zusammenführung abzuschließen.

Harry Robbins
quelle
0

Es kann spät sein. Es ist passiert, weil dein Git HEAD nicht aktualisiert wird. Dieses Lob würde das lösen git reset HEAD.

s.morteza malekabadi
quelle