Git fusiona las marcas HEAD izquierdas en mis archivos

101

Intenté fusionar un archivo en la línea de comandos usando Git, cuando apareció un mensaje de error que me decía que la fusión se había cancelado.

Pensé que eso era el final, pero luego me di cuenta de que hay gitmarks en mis archivos. Al igual que:

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

Los archivos no han sido editados por mí y muestran líneas insertadas con:

  • HEAD después de menos que signos (<<<<<<< HEAD )
  • líneas de código cambiado
  • una cadena de signos iguales======= )
  • la nueva versión del código
  • otra línea que comienza con signos mayores que y el nombre de la rama ( >>>>>>> gh-pages)

Lo peor es que el contenido del archivo ya no está en orden. ¿Alguien sabe cómo puedo hacer que esos archivos vuelvan a la normalidad y los cambios que hice en la rama gh se fusionaron con la rama maestra?

tecla inferior
fuente

Respuestas:

96

Esos son marcadores de conflicto . Todavía está en el proceso de fusión, pero hubo algunas partes que Git no pudo fusionar automáticamente. Deberá editar manualmente esas partes para que sean lo que desea que sean y luego confirmar los resultados.


Por ejemplo, en su caso particular, probablemente desee resolverlo de esta manera (nota: las flechas / texto de la derecha son solo mis notas, no algo que escribiría en el archivo):

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

y así guardarías el archivo como ...

integer = 
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
Ámbar
fuente
4
@lowerkey Exactamente cómo desea que se vea el resultado final combinado. Supongo que realmente solo desea la parte en la gh-pagesversión, por lo que simplemente eliminaría las cosas de <<<<<<a ======y también eliminaría la >>>>>>línea única , dejando las dos líneas de código real entre =======y >>>>>>.
Ámbar
Gracias, creo que me estoy acostumbrando. Elimine todo, desde la cabeza hasta ====== y luego elimine las marcas HEADmarks restantes.
clave inferior
1
Sí, eso es correcto. (No hay un "descanso" real del que ocuparse, solo está confirmando los resultados de la fusión, lo que Git normalmente haría automáticamente si no hubiera conflictos).
Amber
2
@lowerkey, también considere leer un libro sobre el tema. Recomendaría leer ese libro en su totalidad, ya que parece que no tiene ciertos conocimientos básicos sobre cómo funcionan los VCS y es mejor prepararse para posibles problemas en el futuro.
kostix
1
Qué gracioso es eso. Señala una respuesta de la pregunta que se está marcando como un duplicado de esta, aunque la respuesta a esta pregunta se puede encontrar en la otra pregunta.
t3chb0t
22

Absolutamente comienza con 'git status' para ver lo que tienes. Si abortó una combinación (o tuvo una combinación abortada) y tiene archivos en conflicto en el directorio de trabajo, entonces algo salió mal. El estado de Git le dirá dónde se encuentra. Después de eso, tiene varias opciones. Debe resolver el compromiso de fusión a mano, lo que puede ser un desafío, o usando una herramienta como:

git mergetool

La herramienta de combinación funcionará si sus archivos se enumeran como que necesitan una combinación.

También puede realizar uno de:

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

Puede ver las diferentes versiones usando la sintaxis: 1: nombre de archivo. Ver aqui para obtener una explicación. Pero todo lo anterior asume que 'git status' muestra que los archivos necesitan una combinación.

Finalmente, siempre tienes la opción de:

git reset --hard   # sounds like --hard is what you need but check other options
GoZoner
fuente
6
Absolutamente me gustaría git statusapoyar el consejo de "empezar con para ver lo que tienes": es fascinante en algunos círculos culpar a Git por su complejidad imaginaria, pero de hecho, una lectura cuidadosa del resultado de git statuses suficiente para entender qué hacer a continuación. en situaciones más comunes. Por lo tanto, realmente: si algo sale mal, deténgase, lea git status, piense.
kostix
4

Todas las respuestas son correctas, pero si desea eliminar automáticamente todas las marcas de conflicto y desea autocambiar los archivos para mantener HEAD, entonces puede crear su propio script bash como: -

Ejemplo de guión:

# vim /usr/sbin/solve.git

(Anexar lo siguiente)

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

y simplemente ejecútelo en su repositorio / ruta GIT para resolver:

$ cd <path_to_repo>
$ solve.git

Aviso: - Las extensiones de archivo mencionadas anteriormente son php, css, js, html, svg y txt.

Señor pundir
fuente
0

En Atom tuve el problema de que algunos archivos no guardaban los conflictos de fusión resueltos en la unidad, así que tuve que hacer clic manualmente en "guardar". Me tomó bastante tiempo averiguarlo.

Timar Ivo Batis
fuente
0

Vengo de esta pregunta . Y quería algún método automatizado para fusionar los archivos medio fusionados, en lugar de editar manualmente los archivos ( como se sugiere en otras respuestas, lo cual no me siento cómodo haciendo ). Así que esto es lo que terminé haciendo a través de netbeans, pero también se puede hacer a través de la línea de comandos.

Ahora, tenga en cuenta que esto solo funciona si inmediatamente después del merge->add->commit, se dio cuenta de que cometió un error y desea volver a pasar por el proceso.

PASO 1: Restablecer a una confirmación anterior.

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

PASO 2: Vuelva a intentar fusionar la rama

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

En este punto, se le solicitará la ventana de combinación si está utilizando una GUI. y luego puede proceder normalmente.

Mohd Abdul Mujib
fuente