135 votes

La fusion Git a laissé des marques HEAD dans mes fichiers

J'ai essayé de fusionner un fichier en ligne de commande en utilisant Git, lorsqu'un message d'erreur est apparu m'indiquant que la fusion avait été interrompue.

Je pensais que c'était fini, mais je me suis rendu compte qu'il y avait des gitmarks dans mes fichiers. Comme ça :

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é édités par moi et présentent des lignes insérées avec :

  • HEAD après les signes moins que ( <<<<<<< HEAD )
  • lignes de code modifiées
  • une chaîne de signes égaux ( ======= )
  • la nouvelle version du code
  • une autre ligne commençant par des signes plus grands que et le nom de la branche ( >>>>>>> gh-pages )

Pire encore, le contenu des fichiers n'est plus en ordre. Quelqu'un sait-il comment faire pour que ces fichiers redeviennent normaux, et que les changements que j'ai faits dans la branche gh soient fusionnés dans la branche master ?

121voto

Amber Points 159296

Il s'agit de marqueurs de conflit . Vous êtes toujours en train de fusionner, mais il y a des parties que Git n'a pas pu fusionner automatiquement. Vous allez nécessité d'éditer ces parties à la main à ce que vous voulez qu'ils soient, puis engagez les résultats.


Par exemple, dans votre cas particulier, vous souhaiteriez probablement résoudre le problème de la manière suivante (note - les flèches/le texte sur la droite sont juste mes notes, et non quelque chose que vous taperiez 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 vous enregistrerez donc le fichier sous...

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

27voto

GoZoner Points 15679

Commencez absolument par 'git status' pour voir ce que vous avez. Si vous avez interrompu une fusion (ou fait interrompre une fusion) et que vous avez des fichiers en conflit dans le répertoire de travail, c'est que quelque chose n'a pas fonctionné. L'état de Git vous dira où vous en êtes. Après cela, vous avez un certain nombre d'options. Vous devez résoudre le commit de fusion soit à la main, 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:nom de fichier. Voir aquí pour une explication. Mais tout ce qui précède suppose que 'git status' indique que les fichiers ont besoin d'être fusionnés.

Enfin, vous avez toujours la possibilité de.. :

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

5voto

Mr. Pundir Points 186

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

Exemple script :

# vim /usr/sbin/solve.git

(Annexe suivante)

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

& il suffit de l'exécuter dans votre repo/path GIT pour le résoudre :

$ cd <path_to_repo>
$ solve.git

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

0voto

Timar Ivo Batis Points 361

Dans Atom, j'avais le problème que certains fichiers n'enregistraient pas les conflits de fusion résolus sur le disque, et que je devais donc cliquer manuellement sur "enregistrer". Il m'a fallu un certain temps pour trouver la solution.

0voto

abbujaansboy Points 31

Si vous souhaitez prendre en compte les nouvelles modifications (provenant de la branche à fusionner), supprimez tout le code appartenant à la branche HEAD. Et si vous voulez garder votre propre code et non celui de la nouvelle branche, alors supprimez l'autre et gardez le code du HEAD

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X