Git Merge links HEAD Markierungen in meinen Dateien

100

Ich habe versucht, eine Datei in der Befehlszeile mit Git zusammenzuführen, als eine Fehlermeldung angezeigt wurde, dass die Zusammenführung abgebrochen wurde.

Ich dachte, das wäre das Ende, aber dann wurde mir klar, dass meine Dateien Gitmarks enthalten. Wie so:

start =
    expression

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

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:

  • KOPF nach weniger als Zeichen ( <<<<<<< HEAD)
  • Zeilen mit geändertem Code
  • eine Reihe von Gleichheitszeichen ( =======)
  • die neue Version des Codes
  • eine andere Zeile, die mit mehr als Zeichen und dem Namen des Zweigs beginnt ( >>>>>>> gh-pages)

Schlimmer ist, dass der Dateiinhalt nicht mehr in Ordnung ist. Weiß jemand, wie ich diese Dateien wieder normalisiere und die Änderungen, die ich im gh-Zweig vorgenommen habe, in den Hauptzweig verschmolzen sind?

Unterschlüssel
quelle

Antworten:

96

Das sind Konfliktmarker . Sie sind noch im Zusammenführen, aber es gab einige Teile, die Git nicht automatisch zusammenführen konnte. Sie müssen diese Teile von Hand so bearbeiten , wie Sie es möchten, und dann die Ergebnisse festschreiben.


In Ihrem speziellen Fall möchten Sie es beispielsweise wahrscheinlich so auflösen (Hinweis - die Pfeile / der Text rechts sind nur meine Notizen, nicht etwas, das Sie in die Datei eingeben würden):

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 somit würden Sie die Datei speichern als ...

integer = 
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
Bernstein
quelle
4
@lowerkey Genau so soll das Ergebnis des zusammengeführten Endes aussehen. Ich vermute, dass Sie wirklich nur den Teil in der gh-pagesVersion haben möchten , also löschen Sie einfach das Material von <<<<<<bis ======und entfernen auch die einzelne >>>>>>Zeile, wobei die beiden Zeilen des tatsächlichen Codes zwischen =======und verbleiben >>>>>>.
Amber
Danke, ich glaube, ich verstehe es. Löschen Sie alles von head bis ====== und entfernen Sie dann die verbleibenden HEADmarks.
Unterschlüssel
1
Ja, das ist richtig. (Es gibt keine wirkliche "Ruhe", um die man sich kümmern muss - Sie schreiben nur die Ergebnisse der Zusammenführung fest, was Git normalerweise automatisch tun würde, wenn es keine Konflikte gäbe.)
Amber
2
@lowerkey, bitte lesen Sie auch ein Buch zu diesem Thema. Ich würde empfehlen, dieses Buch vollständig zu lesen, da Ihnen anscheinend bestimmte Grundkenntnisse über die Funktionsweise von VCS fehlen und es besser ist, sich auf mögliche zukünftige Probleme vorzubereiten.
Kostix
1
Wie lustig ist das? Sie verweisen auf eine Antwort auf die Frage, die als Duplikat dieser Frage markiert wird, obwohl die Antwort auf diese Frage in der anderen Frage zu finden ist.
t3chb0t
22

Beginnen Sie unbedingt mit 'git status', um zu sehen, was Sie haben. Wenn Sie eine Zusammenführung abgebrochen haben (oder eine Zusammenführung abgebrochen haben) und Sie widersprüchliche Dateien im Arbeitsverzeichnis haben, ist ein Fehler aufgetreten. Der Git-Status zeigt Ihnen, wo Sie sich befinden. Danach haben Sie eine Reihe von Optionen. Sie sollten das Zusammenführungs-Commit entweder manuell auflösen, was eine Herausforderung sein kann, oder ein Tool verwenden als:

git mergetool

Das Zusammenführungstool funktioniert, wenn Ihre Dateien zusammengeführt werden müssen.

Sie können auch Folgendes ausführen:

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

Sie können die verschiedenen Versionen mit der Syntax: 1: Dateiname anzeigen. Sehen Sie hier für eine Erklärung. Bei alledem wird jedoch davon ausgegangen, dass der Git-Status anzeigt, dass die Dateien zusammengeführt werden müssen.

Schließlich haben Sie immer die Möglichkeit:

git reset --hard   # sounds like --hard is what you need but check other options
GoZoner
quelle
6
Ich möchte unbedingt den git statusRatschlag "Beginnen Sie damit, um zu sehen, was Sie haben" unterstützen: In einigen Kreisen ist es unumgänglich, Git für seine imaginäre Komplexität verantwortlich zu machen, aber tatsächlich reicht es aus, die Ausgabe von sorgfältig zu lesen, git statusum zu verstehen, was als nächstes zu tun ist in den meisten Situationen. Also wirklich: Wenn etwas schief geht, hör auf, lies git status, denke nach.
Kostix
4

Alle Antworten sind richtig, aber wenn Sie alle Konfliktmarkierungen automatisch entfernen und die Dateien automatisch ändern möchten, um HEAD beizubehalten, können Sie Ihr eigenes Bash-Skript erstellen, wie: -

Beispielskript:

# vim /usr/sbin/solve.git

(Nachfolgend anhängen)

#!/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 einfach in Ihrem GIT-Repo / Pfad aus, um Folgendes zu beheben:

$ cd <path_to_repo>
$ solve.git

Hinweis: - Die oben genannten Dateierweiterungen sind PHP, CSS, JS, HTML, SVG und TXT.

Herr Pundir
quelle
0

In Atom hatte ich das Problem, dass einige Dateien die gelösten Zusammenführungskonflikte nicht auf dem Laufwerk speicherten, so dass ich manuell auf "Speichern" klicken musste. Ich habe einige Zeit gebraucht, um das herauszufinden.

Timar Ivo Batis
quelle
0

Ich komme von dieser Frage . Und ich wollte eine automatisierte Methode zum Zusammenführen der halb zusammengeführten Dateien, anstatt die Dateien manuell zu bearbeiten ( wie in anderen Antworten vorgeschlagen, was mir nicht wirklich angenehm ist ). Hier ist, was ich letztendlich über Netbeans gemacht habe, aber auch über die Kommandozeile.

Denken Sie jetzt daran, dass dies nur funktioniert, wenn Sie unmittelbar danach merge->add->commitfestgestellt haben, dass Sie es vermasselt haben, und den Prozess erneut durchführen möchten.

SCHRITT 1: Zurücksetzen auf ein vorheriges Commit.

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

SCHRITT 2: Versuchen Sie erneut, den Zweig zusammenzuführen

git merge --ff origin/feature/YOUR-Branch_here

An dieser Stelle werden Sie mit dem Zusammenführungsfenster aufgefordert, wenn Sie eine GUI verwenden. und Sie können dann wie gewohnt fortfahren.

Mohd Abdul Mujib
quelle