Git merge dejó marcas HEAD en mis archivos
Intenté fusionar un archivo en la línea de comando usando Git, cuando apareció un mensaje de error que me indicaba que la fusión había sido cancelada.
Pensé que ese 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 signos menores que (
<<<<<<< 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 el signo mayor que y el nombre de la sucursal (
>>>>>>> gh-pages
)
Lo peor es que el contenido del archivo ya no está en orden. ¿Alguien sabe cómo puedo hacer para que esos archivos vuelvan a la normalidad y los cambios que hice en la rama gh se fusionen con la rama maestra?
Esos son marcadores de conflicto . Todavía estás en el proceso de fusión, pero hubo algunas partes que Git no pudo fusionar automáticamente. Deberá editar manualmente esas partes según lo que desee y luego confirmar los resultados.
Por ejemplo, en su caso particular, probablemente querrá resolverlo de esta manera (nota: las flechas/texto a la derecha son solo mis notas, no algo que usted 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(""); }
Absolutamente comienza con 'estado de git' para ver qué tienes. Si canceló una fusión (o canceló una fusión) y tiene archivos en conflicto en el directorio de trabajo, entonces algo salió mal. El estado de Git te dirá dónde estás. Después de eso, tienes varias opciones. Debe resolver la confirmación de fusión manualmente, lo que puede resultar complicado, o utilizando una herramienta como:
git mergetool
La herramienta de combinación funcionará si sus archivos figuran como que necesitan una combinación.
También puedes 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 utilizando la sintaxis :1:filename. Consulte aquí para obtener una explicación. Pero todo lo anterior supone que el 'estado de git' muestra que los archivos necesitan una fusión.
Finalmente, siempre tienes la opción de:
git reset --hard # sounds like --hard is what you need but check other options
Todas las respuestas son correctas, pero si desea eliminar automáticamente todas las marcas de conflicto y desea cambiar automáticamente los archivos para mantener HEAD, puede crear su propio script bash como:
Guión de ejemplo:
# vim /usr/sbin/solve.git
(Agregar 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.