56

Ich habe versucht, eine Datei in der Befehlszeile mit Git zusammenzuführen, als eine Fehlermeldung erschien, die mir mitteilte, dass die Zusammenführung abgebrochen wurde.Git füge linke HEAD-Markierungen in meine Dateien ein

Ich dachte, das war das Ende, aber dann erkannte ich, dass es Gitmarks in meinen Dateien gibt. Wie so:

start = 
    expression 

validchar = 
    [0-9a-zA-Z_?!+\[email protected]#$%^&*/.] 

integer = 
<<<<<<< HEAD 
    digits:[0-9]+ 
     { return digits.join(""); } 
======= 
    sign:"-"* digits:[0-9]+ 
     { return sign + digits.join(""); } 
>>>>>>> gh-pages 

Die Dateien wurden nicht von mir bearbeitet und zeigen Zeilen eingefügt mit:

  • HEAD nach weniger als Zeichen (<<<<<<< HEAD)
  • Linien geänderten Code
  • einen String von Gleichzeichen (=======)
  • die neue Version des Codes
  • eine andere Zeile beginnend mit Größer als Zeichen und dem Namen des Zweiges (>>>>>>> gh-pages)

Was schlimmer ist, ist, dass die Dateiinhalte nicht mehr in Ordnung sind. Weiß jemand, wie ich diese Dateien wieder zum normalen zurückbekomme, und die Änderungen, die ich im gh-Zweig gemacht habe, in den Hauptzweig verschmolzen?

Antwort

66

Das sind conflict markers. Sie befinden sich noch im Prozess der Zusammenführung, aber es gab einige Teile, die Git nicht automatisch zusammenführen konnte. Sie werden need to hand-edit those parts zu dem, was Sie wollen, und dann die Ergebnisse festschreiben.


Zum Beispiel in Ihrem speziellen Fall, würden Sie wahrscheinlich es so lösen wollen (Anmerkung - die Pfeile/Text auf der rechten Seite sind nur meine Notizen, nicht etwas, das Sie in die Datei geben würde) :

integer = 
<<<<<<< HEAD         <-+ remove the bits here 
    digits:[0-9]+        | 
     { return digits.join(""); }    | 
=======          <-+ 
    sign:"-"* digits:[0-9]+ 
     { return sign + digits.join(""); } 
>>>>>>> gh-pages        <-- and this 

und damit würden Sie mit 'git status' speichern starten Sie die Datei als ...

integer = 
    sign:"-"* digits:[0-9]+ 
     { return sign + digits.join(""); } 
+0

Wie sollte die Datei aussehen, wenn ich mit der Bearbeitung fertig bin? – lowerkey

+3

@lowerkey Genau wie Sie möchten, dass das Ergebnis der Endverknüpfung aussieht. Meine Vermutung ist, dass Sie wirklich nur den Teil in der 'gh-pages' Version wollen, also würden Sie einfach die Sachen von' <<<<<< nach '======' löschen und auch die Single entfernen '>>>>>>' line, wobei die beiden Zeilen des eigentlichen Codes zwischen '=======' und '>>>>>>' stehen. – Amber

+0

Danke, ich denke, ich bekomme den Dreh raus. Löschen Sie alles vom Kopf bis ====== und entfernen Sie dann die übrig gebliebenen HEADmarks. – lowerkey

19

Absolut zu sehen, was du hast. Wenn Sie eine Zusammenführung abgebrochen haben (oder eine Zusammenführung abgebrochen wurde) und in Ihrem Arbeitsverzeichnis widersprüchliche Dateien vorliegen, ist etwas nicht in Ordnung. Der Git Status wird dir sagen wo du bist. Danach haben Sie eine Reihe von Optionen. Sie sollten die Zusammenführung verpflichten entweder von Hand lösen, die schwierig sein kann, oder mit einem Werkzeug wie:

git mergetool 

Das Merge-Tool funktioniert, wenn Ihre Dateien benötigen einen Merge aufgeführt sind.

können Sie führen auch zu:

git checkout --ours -- /path/to/conflicted-file  # this is probably the one you want 
git checkout --theirs -- /path/to/conflicted-file 

können Sie die verschiedenen Versionen sehen mit der: 1: Dateiname Syntax. Eine Erläuterung finden Sie unter here. Aber alles oben genannte geht davon aus, dass "git status" zeigt, dass die Dateien eine Zusammenführung benötigen.

Schließlich haben Sie immer die Möglichkeit:

git reset --hard # sounds like --hard is what you need but check other options 
+4

Ich möchte unbedingt den "Start mit' git status' um zu sehen, was Sie haben "Rat: Es ist in einigen Kreisen fasionable, Git für seine imaginäre Komplexität verantwortlich zu machen, aber in der Tat sorgfältig die Ausgabe von' git-Status zu lesen 'ist genug, um zu verstehen, was als nächstes in den meisten üblichen Situationen zu tun ist. Also, wirklich: wenn etwas schief geht, hör auf, lies 'git status', denke nach. – kostix

1

Alle Antworten sind richtig, aber wenn Sie alle Konflikt Noten autoremove wollen & wollen die Dateien auf die automatische Wechsel HEAD zu halten, dann können Sie erstellen Ihre eigener bash-Skript wie: -

Beispiel Script:

# vim /usr/sbin/solve.git

(Anfügen Im Anschluss)

#!/bin/bash 
for f in $(grep -Rl '^>>>>>>> ' --include="*.php" --include="*.css" --include="*.js" --include="*.html" --include="*.svg" --include="*.txt" .) 
do 
sed -i -e '/^=======/,/^>>>>>>> /d' -e '/^<<<<<<< /d' $f 
sed -i -e '/^>>>>>>> /d' $f 
echo "$f Fixed" 
done 
git add . ; git commit -am "[+] Resolved on `date` from `hostname` by `whoami`" --no-verify 

# chmod 755 /usr/sbin/solve.git

& führen Sie es nur in Ihrem GIT-Repo/Pfad zu beheben:

$ cd <path_to_repo>
$ solve.git

Hinweis: - Above Dateierweiterungen erwähnt sind php, css, js, html, svg & txt.