Git fusionne les marques HEAD gauche dans mes fichiers

102

J'ai essayé de fusionner un fichier dans la ligne de commande à l'aide de Git, lorsqu'un message d'erreur est apparu m'indiquant que la fusion avait été abandonnée.

Je pensais que c'était la fin, mais j'ai ensuite réalisé qu'il y avait des gitmarks dans mes fichiers. Ainsi:

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

Les fichiers n'ont pas été modifiés par moi et affichent les lignes insérées avec:

  • HEAD après moins de signes ( <<<<<<< HEAD)
  • lignes de code modifié
  • une chaîne de signes égal ( =======)
  • la nouvelle version du code
  • une autre ligne commençant par des signes supérieur à et le nom de la branche ( >>>>>>> gh-pages)

Le pire, c'est que le contenu du fichier n'est plus en ordre. Est-ce que quelqu'un sait comment je ramène ces fichiers à la normale, et les modifications que j'ai apportées dans la branche gh ont fusionné dans la branche master?

touche inférieure
la source

Réponses:

96

Ce sont des marqueurs de conflit . Vous êtes toujours en train de fusionner, mais il y avait certaines parties que Git ne pouvait pas fusionner automatiquement. Vous devrez modifier manuellement ces parties pour ce que vous voulez qu'elles soient, puis valider les résultats.


Par exemple, dans votre cas particulier, vous voudrez probablement le résoudre comme ceci (note - les flèches / le texte à droite ne sont que mes notes, pas quelque chose que vous tapez dans le fichier):

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

et ainsi vous enregistrez le fichier sous ...

integer = 
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
ambre
la source
4
@lowerkey Exactement à quoi vous voulez que le résultat final fusionné ressemble. Je suppose que vous voulez vraiment juste la partie de la gh-pagesversion, donc vous supprimeriez simplement les éléments de <<<<<<à ======et supprimeriez également la >>>>>>ligne unique , laissant les deux lignes de code réel entre =======et >>>>>>.
Ambre
Merci, je pense que je comprends bien. Supprimez tout de la tête à ======, puis supprimez les marques HEAD restantes.
lowerkey
1
Oui, c'est correct. (Il n'y a pas de vrai "repos" à prendre en charge - vous ne faites que valider les résultats de la fusion, ce que Git ferait normalement automatiquement s'il n'y avait pas de conflits.)
Ambre
2
@lowerkey, pensez également à lire un livre sur le sujet. Je recommanderais de lire ce livre dans son intégralité car vous semblez manquer de certaines connaissances de base sur le fonctionnement des VCS et il est préférable de vous préparer à d'éventuels problèmes à l'avenir.
kostix
1
Comme c'est drôle. Vous indiquez une réponse à la question qui est marquée comme un double de celle-ci, bien que la réponse à cette question se trouve dans l'autre question.
t3chb0t
22

Commencez absolument par «git status» pour voir ce que vous avez. Si vous avez abandonné une fusion (ou si une fusion a été interrompue) et que vous avez des fichiers en conflit dans le répertoire de travail, c'est que quelque chose s'est mal passé. Le statut Git vous indiquera où vous êtes. Après cela, vous avez un certain nombre d'options. Vous devez résoudre le commit de fusion soit manuellement, ce qui peut être difficile, soit en utilisant un outil comme:

git mergetool

L'outil de fusion fonctionnera si vos fichiers sont répertoriés comme nécessitant une fusion.

Vous pouvez également effectuer l'une des opérations suivantes:

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

Vous pouvez voir les différentes versions en utilisant la syntaxe: 1: filename. Voir ici pour une explication. Mais tout ce qui précède suppose que «git status» montre les fichiers comme nécessitant une fusion.

Enfin, vous avez toujours la possibilité de:

git reset --hard   # sounds like --hard is what you need but check other options
GoZoner
la source
6
Je voudrais absolument git statusappuyer le conseil "Commencez avec pour voir ce que vous avez": il est courant dans certains cercles de blâmer Git pour sa complexité imaginaire, mais en fait, une lecture attentive du résultat de git statussuffit pour comprendre ce qu'il faut faire ensuite dans les situations les plus courantes. Par conséquent, vraiment: si quelque chose ne va pas, arrêtez, lisez git status, réfléchissez.
kostix
4

Toutes les réponses sont correctes, mais si vous souhaitez supprimer automatiquement toutes les marques de conflit et que vous souhaitez modifier automatiquement les fichiers pour conserver HEAD, vous pouvez créer votre propre script bash comme: -

Exemple de script:

# vim /usr/sbin/solve.git

(Ajouter après)

#!/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

et exécutez-le simplement dans votre dépôt / chemin GIT pour résoudre:

$ cd <path_to_repo>
$ solve.git

Remarque: - Les extensions de fichiers mentionnées ci-dessus sont php, css, js, html, svg et txt.

M. Pundir
la source
0

Dans Atom, j'ai eu le problème que certains fichiers ne sauvegardaient pas les conflits de fusion résolus sur le lecteur, je devais donc cliquer manuellement sur "Enregistrer". Il m'a fallu un certain temps pour comprendre.

Timar Ivo Batis
la source
0

Je viens de cette question . Et je voulais une méthode automatisée de fusion des fichiers à moitié fusionnés, au lieu de modifier manuellement les fichiers ( comme suggéré dans d'autres réponses, ce que je ne suis pas vraiment à l'aise de faire ). Voici donc ce que j'ai fini par faire via netbeans, mais cela peut également être fait via la ligne de commande.

Maintenant, gardez à l'esprit que cela ne fonctionne que si immédiatement après le merge->add->commit, vous vous rendez compte que vous vous êtes trompé et que vous voulez recommencer le processus.

ÉTAPE 1: réinitialisez à un commit précédent.

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

ÉTAPE 2: réessayer de fusionner la branche

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

À ce stade, vous serez invité avec la fenêtre de fusion si vous utilisez une interface graphique. et vous pouvez ensuite procéder normalement.

Mohd Abdul Mujib
la source