web-dev-qa-db-fra.com

Git fusionne à gauche HEAD marques dans mes fichiers

J'ai essayé de fusionner un fichier dans la ligne de commande en utilisant Git, lorsqu'un message d'erreur est apparu me disant que la fusion avait été annulée. 

Je pensais que c'était la fin, mais j'ai ensuite réalisé qu'il y avait des marques git 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 ont été édités pas par moi et montrent les lignes insérées avec: 

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

Le pire est que le contenu du fichier n'est plus en ordre. Est-ce que quelqu'un sait comment je récupère ces fichiers et comment les modifications que j'ai apportées à la branche gh ont été fusionnées dans la branche maître?

72
lowerkey

Ce sont marqueurs de conflit }. Vous êtes encore en train de fusionner, mais certaines parties ne pouvaient pas être fusionnées automatiquement par Git. Vous allez devez éditer ces parties à la main en ce que vous souhaitez qu'elles soient, puis valider les résultats.


Par exemple, dans votre cas particulier, vous voudrez probablement le résoudre comme ceci (remarque - 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 sauvegarderiez le fichier en tant que ...

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

Absolument commencer par «statut git» pour voir ce que vous avez. Si vous avez annulé une fusion (ou si une fusion a été annulée) et que vous avez des fichiers en conflit dans le répertoire de travail, un problème est survenu. Le statut Git vous dira 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 tel que:

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 actions 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 "statut git" indique que les fichiers nécessitent une fusion.

Enfin, vous avez toujours la possibilité de:

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

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

Exemple de script:

# vim /usr/sbin/solve.git

(Ajouter suite)

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

& lancez-le simplement dans votre dépôt/chemin GIT pour résoudre:

$ cd <path_to_repo>
$ solve.git 

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

1
Mr. Pundir

Je viens de cette question . Et je voulais une méthode automatisée pour fusionner les fichiers à moitié fusionnés, au lieu de les éditer manuellement (comme suggéré dans d'autres réponses, ce que je ne suis pas très à l'aise}. Alors voici ce que j'ai fini par faire via netbeans, mais je peux aussi le faire en ligne de commande.

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

STEP 1: Réinitialiser un commit précédent.

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

STEP 2: Re-Try Fusionner la branche 

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

À ce stade, la fenêtre de fusion apparaîtra si vous utilisez une interface graphique. et vous pouvez ensuite procéder comme d'habitude.

0
Mohd Abdul Mujib

Dans Atom, j’ai eu le problème suivant: certains fichiers ne sauvegardaient pas les conflits de fusion résolus sur le lecteur, je devais donc cliquer manuellement sur "enregistrer" .

0
Timar Ivo Batis