Git-Fehler beim Festschreiben nach dem Zusammenführen - schwerwiegend: Während des Zusammenführens kann kein teilweises Festschreiben durchgeführt werden

280

Ich lief ein git pull , die in einem Konflikt endete. Ich habe den Konflikt gelöst und jetzt ist alles in Ordnung (ich habe auch Mergetool verwendet).

Wenn ich die aufgelöste Datei mit git commit file.php -m "message"festschreibe, wird folgende Fehlermeldung angezeigt:

fatal: cannot do a partial commit during a merge.

Ich hatte das gleiche Problem zuvor und die Verwendung -ain Commit funktionierte perfekt. Ich denke, es ist nicht der perfekte Weg, weil ich nicht alle Änderungen vornehmen möchte. Ich möchte Dateien separat mit separaten Kommentaren festschreiben. Wie kann ich das machen? Warum erlaubt git Benutzern nicht, Dateien nach einer Zusammenführung separat festzuschreiben? Ich konnte keine zufriedenstellende Antwort auf dieses Problem finden.

pMan
quelle
5
Und Sie wissen, die Suche nach git perform "full commit" gibt fast nichts Nützliches zurück. Kein relevantes Dokument aus Gits Manpages. Das ist so ein elendes Werkzeug.
JWW
6
@Torek - sprechen Sie über ein anderes Durcheinander, das von Git erstellt wurde ... Warum ist es so verdammt schwierig, eine Konfliktdatei aus einem anderen Zweig auszuchecken, damit der Konflikt abgewendet wird, fügen Sie sie diesem Zweig hinzu und legen Sie sie dann fest ??? Und WTF ist ein Teil Commit? Ich kann keine Dokumentation dazu finden ... Benutzer sind gezwungen, die folgenden Vermutungen zu versuchen ...
jww
Wie hast du es gemacht? Ich habe einen Konflikt und kann nichts tun
Niklas R.

Antworten:

441

Ich habe festgestellt, dass das Hinzufügen von "-i" zum Commit-Befehl dieses Problem für mich behebt. Das -i weist es grundsätzlich an, vor dem Festschreiben zusätzliche Dateien bereitzustellen. Das ist:

git commit -i myfile.php
MikaelHalen
quelle
18
Was heißt Stage additional filesdas
jcalfee314
9
@ jcalfee314 Staging in Git dient dazu, die Datei für das Commit vorzubereiten. In diesem speziellen Fall wird die Datei vor dem Festschreiben über die Befehlszeile bereitgestellt. Das Flag -i wird hauptsächlich verwendet, wenn Sie eine Zusammenführung abschließen. Weitere Informationen zu den Commit-Flags finden Sie hier .
MikaelHalen
4
@ jcalfee314 überprüfte ich die Dokumentation und es sagt , „als auch der Inhalt der Wege auf der Kommandozeile einen Commit aus inszenierten Inhalten bisher Bevor, Bühne. Dies ist in der Regel nicht , was Sie wollen , wenn Sie einen Konflikt merge sind Abschluss“ . Ich vermute, dass es unter dieser Bedingung eine Art Inkonsistenz im Staging-Bereich gibt, die nicht gelöst werden kann git add, was zum git commitScheitern führt. Das Hinzufügen -iwürde git anweisen, gleichzeitig hinzuzufügen und festzuschreiben. Ich bin mir immer noch nicht sicher warum, aber es scheint sinnvoll zu sein.
JonSlowCN
5
Für Noobs wie mich wird der gleiche Fehler auch angezeigt, wenn Sie eine Nachricht versuchen, die Leerzeichen ohne Anführungszeichen enthält. Z.B. [git commit -m eins zwei drei] Richtig: [git commit -m "eins zwei drei"]
Skychan
2
@ Skychans Kommentar war das Ticket für mich.
Am
106
git commit -am 'Conflicts resolved'

Das hat bei mir funktioniert. Sie können dies auch versuchen.

Pratip Ghosh
quelle
1
Erstaunlich, das wusste ich nicht!
JeanValjean
11
Dadurch werden alle geänderten Dateien zum Commit hinzugefügt , auch solche, die nicht bereitgestellt sind und möglicherweise nicht wünschenswert sind. Benutzer möchten möglicherweise die 'a'-Flagge
Chase Sandmann
4
Dies ist genau das, was der Benutzer nicht tun soll, um zu vermeiden, dass alle Dateien festgeschrieben werden.
Michael
33

Sie können git commit -ifür die meisten Fälle verwenden, aber falls es nicht funktioniert

Du musst tun git commit -m "your_merge_message". Während eines Zusammenführungskonflikts können Sie nicht eine einzelne Datei zusammenführen

  1. Stellen Sie nur die in Konflikt stehende Datei bereit ( git add your_file.txt)
  2. git commit -m "your_merge_message"
aWebDeveloper
quelle
16

Sie haben wahrscheinlich einen Konflikt in etwas, das Sie nicht für das Festschreiben inszeniert haben. Mit git können Sie die Dinge nicht unabhängig festlegen (weil alles Teil der Zusammenführung ist, denke ich), also müssen Sie git adddiese Datei und dann git commit -m "Merge conflict resolution". Das -iFlag für git commiterledigt das Hinzufügen für Sie.

Paul Price
quelle
5
Nicht in 1.9.0 - das hat commit -ifunktioniert, aber nichtgit add; git commit
LeeGee
14

Ich habe dies erhalten, als ich das -min meinem Git Commit vergessen habe, als ich einen Git Merge Konflikt gelöst habe.

git commit "commit message"

sollte sein

git commit -m "commit message"
wgeorge
quelle
2
ah ah! Ich habe es wieder vergessen!
user2705463
9

Wie die Fehlermeldung besagt, können Sie nach einer Zusammenführung keine teilweise Festschreibung durchführen. Anstatt nur zu begehenfile.php festzuschreiben, sollten Sie alle Änderungen festschreiben.

Das sollte funktionieren.

git commit -m "Fixing merge" 
Asim Jalis
quelle
Danke, es hat geholfen
Narendra Pandey
Arbeitete für mich wie es ist
Shashank Bodkhe
6

Ihre Zusammenführung wurde mitten in der Aktion gestoppt. Sie sollten Ihre Dateien hinzufügen und dann 'git commit':

git add file_1.php file_2.php file_3.php git commit

Prost

Moyshe Zuchmir
quelle
5

Wenn Sie nur die gesamte Auswahl an Kirschen pflücken und Dateien in den gewünschten Sätzen festschreiben möchten,

git reset --soft <ID-OF-THE-LAST-COMMIT>

bringt dich dorthin.

Beim Soft-Reset wird der Zeiger, der auf den aktuellen HEAD zeigt, auf das von Ihnen angegebene Commit (ish) verschoben, die Dateien werden jedoch nicht geändert. Ein Hard-Reset würde den Zeiger bewegen und auch alle Dateien auf den Status in diesem Commit (ish) zurücksetzen. Dies bedeutet, dass Sie mit einem Soft-Reset den Zusammenführungsstatus löschen können, aber die Änderungen an den tatsächlichen Dateien beibehalten und sie dann einzeln nach Ihren Wünschen festschreiben oder zurücksetzen können.

Zds
quelle
Könnten Sie das näher erläutern? Dies ist wahrscheinlich das, was ich brauche, aber ich folge nicht, wie es funktionieren würde ... Alle Antworten hier sind nur "Dateien hinzufügen, dann festschreiben!", Aber das ist so trivial offensichtlich; Der Grund, warum ich hier bin, ist, dass ich diese Dateien nicht hinzufügen möchte, bevor ich sie festschreibe. -_-;
Kyle Baker
Das hilft. Vielen Dank. :)
Kyle Baker
5
  1. Gehen Sie zu Ihrem Projektverzeichnis
    1. versteckte Dateien anzeigen (.git-Ordner wird angezeigt)
    2. Öffnen Sie den .git-Ordner
    3. MERGE_HEAD entfernen
    4. erneut festschreiben
    5. Wenn git Ihnen mitteilt, dass git gesperrt ist, kehren Sie zum Ordner .git zurück und entfernen Sie index.lock
    6. erneut festschreiben, diesmal wird alles gut funktionieren.
Ahmed Samir
quelle
Großartig! Das würde für mich funktionieren. Übrigens, wenn Sie unter MacOS vom Terminal aus "open .git" aufrufen könnten, wird der Inhalt von ".git" im Finder
tontonCD
Das funktioniert auch bei mir. Dies sollte als Antwort akzeptiert werden.
Vandu
3

Für mich selbst geschah dies in SourceTree, als ich versuchte, eine Zusammenführung durchzuführen, bevor alle Dateien aufgelöst wurden. Ich habe dann die zuletzt aufgelöste Datei markiert und trotzdem diesen Fehler beim Festschreiben festgestellt. Ich habe SourceTree geschlossen und wieder geöffnet, und dann hat es gut funktioniert.

Justin
quelle
1
danke, aber leider hat das bei mir nicht funktioniert. Ärgerlicherweise musste ich sowohl eine private Ansicht als auch die Zusammenführung festlegen, bevor ich die Zusammenführung vornehmen konnte.
Coxy
3

Ich habe dies mit einem völlig anderen Ansatz gelöst , bei dem nur die Quellcodeverwaltung von Xcode verwendet wurde.

Hintergrund: Ein anderes Team hat Änderungen am Remote-Git-Repository (über Beanstalk) vorgenommen. Meiner Meinung nach kamen die .xcodeproj-Dateien in ein anderes Verzeichnis, und die Änderungen wurden nicht übernommen. Als ich später versuchte, ein Commit durchzuführen, erhielt ich einen Baumkonfliktfehler in Xcode.

Screenshot des Baumkonflikts

Da es mit Xcode fast unmöglich ist, dies zu korrigieren, habe ich die .xcodeprojDatei durch eine vom Git-Server heruntergeladene Version ersetzt. Das Ergebnis ... das Xcode-Projekt schien sich zu klären, aber alle Aktualisierungen des beschädigten Pull wurden als von mir vorgenommene Änderungen angezeigt und für ein Commit bereitgestellt.

Schauen Sie sich all diese Mods und hinzugefügten Dateien an

Beim Versuch, ein Commit durchzuführen, wurde jedoch der hier beschriebene Fehler "Schwerwiegend: Während eines Zusammenführens kann kein partielles Commit ausgeführt werden" angezeigt.

Hier ist, wie ich das Problem gelöst habe ... (Verstehe jetzt, dass ich ein Anfänger-Programmierer bin, so dass mir etwas Verständnis fehlen könnte ... aber meine Unwissenheit hat mich dazu gebracht, einen anderen Weg zu finden, dies zu tun.) Zuerst habe ich meinen Meister geklont Verzweigen Sie in einen sekundären Zweig und wechseln Sie zu diesem Zweig. Dann habe ich eine Arbeitskopie erstellt und das Verzeichnis außerhalb des ursprünglichen Projektverzeichnisses in diese Arbeitskopie verschoben. (Ich weiß nicht, ob dies notwendig war, aber ich habe andere Fehlerbehebungstechniken gelesen.) Dann habe ich die Zweige zum Master gewechselt, wo ich festgestellt habe, dass alle meine bereitgestellten Dateien (Änderungen an Commit) verschwunden sind. Um sicherzustellen, dass alle Dateien auf die neuesten Änderungen der anderen Partei aktualisiert wurden, habe ich einen neuen Zweig namens ThirdBranch erstellt, in dem alle Dateien dupliziert wurden. Pushed es auf den Git Server und ließ Beanstalk meine Serverversion des Master-Zweigs mit dem ThirdBrach-Zweig vergleichen, den ich gerade gepusht habe (Zeile für Zeile), und alle Änderungen der anderen Partei waren auf meinem Xcode vorhanden. Dies bedeutete, dass mein Master-Repository und das Git-Master-Repository identisch waren, was bestätigt, dass ich das Problem nur mit Xcode gelöst habe.

Fragen Sie mich nicht wie, über das hinaus, was ich gerade beschrieben habe ... und füllen Sie auf jeden Fall die Lücken, die ich ausgelassen habe. Ich bin neu in diesem Bereich und verstehe nicht alles. Vielleicht kann ein erfahrener Programmierer die irrelevanten Informationen von den relevanten trennen und diese Technik klarer nachbilden, weshalb ich dies teilweise poste.

Dies ist eine doppelte Antwort auf eine doppelte Frage wie folgt : Fehlgeschlagene Xcode Git-Zusammenführung steckt fest

Plexander
quelle
2
Bitte posten Sie keine doppelten Antworten. Während das zugrunde liegende Problem möglicherweise dasselbe ist, bezieht sich Ihre Antwort auf ein viel spezifischeres Problem und trübt nur die Antworten auf diese allgemeine Frage. Ich denke in diesem Fall ist ein Kommentar zu der Frage, in der Sie auf Ihre ursprüngliche Antwort verweisen, angemessener.
Fookatchu
2

Während einer Zusammenführung möchte Git aus allen möglichen Gründen den Überblick über die übergeordneten Zweige behalten. Was Sie tun möchten, ist keine Zusammenführung, wie Git es sieht. Möglicherweise möchten Sie eine Rebase oder einen Cherry-Pick manuell durchführen.

Talljoe
quelle
1
Ich habe noch nie zuvor Rebase oder Cherry-Pick verwendet. Ich habe jetzt nur das Handbuch durchgearbeitet. Was würden Sie also vorschlagen, "Git Rebase Master" nach dem Zusammenführen von Konflikten wird funktionieren?
pMan
1
Es ist ein paralleler Workflow. Siehe stackoverflow.com/questions/804115/git-rebase-vs-git-merge Wenn Sie möchten, dass die "Zusammenführung" separate Commits sind, müssen Sie den Quellzweig stattdessen auf das Ende des Zielzweigs zurücksetzen.
Talljoe
1
Fügen Sie einfach jede einzelne Datei hinzu und schreiben Sie sie ohne -a fest.
Peter DeWeese
4
Sie haben die Frage nicht wirklich beantwortet, sondern einfach mehr zur Suche gegeben. Jetzt müssen wir wissen, "was Kirschernte ist" und "was Rebase ist".
ftrotter
2
Ich frage mich, warum diese Antwort abgelehnt wurde. Ich war immer neugierig auf das Kind, wenn mir jemand Dinge erzählt, die ich noch nie zuvor gewusst habe. Wie ich oben kommentiert habe, weiß ich jetzt über Cherry Pick and Rebase Bescheid. War das nicht progressiv / hilfreich?
pMan
2

git commit -i -m 'merge message'hat bei mir nicht funktioniert. Es sagte:

fatal: No paths with --include/--only does not make sense.

FWIW, ich bin über diese verwandte Frage hierher gekommen , weil ich diese Nachricht erhalten habe:

fatal: You have not concluded your merge (MERGE_HEAD exists).

Ich habe auch Mergetool ausprobiert No files need merging. Sehr verwirrend! Der MERGE_HEAD befindet sich also nicht in einer Datei, die zusammengeführt werden muss.

Schließlich habe ich diesen Trick verwendet, um nur die geänderten Dateien hinzuzufügen (ich wollte nicht alle Dateien in meinem Baum hinzufügen, da ich einige habe, die ich nicht verfolgen möchte):

git ls-files -m | xargs git add

Dann konnte ich mich endlich (!) Festlegen und hochschieben. Es wäre sicher schön, wenn git Ihnen bessere Tipps geben würde, was in diesen Situationen zu tun ist.

szeitlin
quelle
1

Wenn es sich im Quellbaum befindet , sollten wir eine Datei explizit als gelöst markieren, nachdem die Konflikte gelöst wurden. Wählen Sie eine Datei aus , die gerade ohne Konflikte aufgelöst wurde. Dann Aktionen -> Konflikte lösen -> Gelöst markieren . Wenn Sie mehrere Dateien haben, machen Sie dasselbe für alle. Tue es jetzt.

cgr
quelle
1

Nach dem Lesen aller Kommentare. Dies war mein Vorsatz:
Ich musste es erneut "hinzufügen" als festschreiben:

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html
FelipeNutz
quelle
1

Wenn Sie den Quellbaum oder eine andere GUI verwenden, stellen Sie sicher, dass alle Dateien überprüft werden (nach dem Zusammenführen).

luky
quelle
0

Manchmal während der Zusammenführung, wenn Konflikte auftreten und es Deltas gibt, die manuell gelöst werden müssen. In diesem Fall korrigieren Sie die manuelle Auflösung für die genannten Dateien.

Wenn Sie jetzt ein Problem haben,

git status Lib/MyFile.php

Sie sehen Ausgabe wie

On branch warehouse
Your branch and 'origin/warehouse' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   Lib/MyFile.php

Da Sie das Commit bereits inszeniert haben, müssen Sie es nur ausgeben

git commit

Und Ihr Commit wird ohne Probleme durchgeführt.

Ketan Patel
quelle