Pregunta

He estado usando Git en Windows (msysgit) para rastrear los cambios de algunos trabajos de diseño que he estado haciendo.

Hoy he estado trabajando en una PC diferente (con repositorio remoto brian) y ahora estoy tratando de fusionar las ediciones realizadas hoy en mi versión local regular en mi computadora portátil.

En mi computadora portátil, he usado git pull brian master para llevar los cambios a mi versión local. Todo estaba bien, aparte del documento principal de InDesign, esto se muestra como un conflicto.

La versión en la PC (<=>) es la última que quiero mantener, pero no sé qué comandos le dice al repositorio que use esta.

Intenté copiar directamente el archivo en mi computadora portátil, pero esto parece interrumpir todo el proceso de fusión.

¿Alguien puede señalarme en la dirección correcta?

¿Fue útil?

Solución

git checkout acepta una opción --ours o --theirs para casos como este. Entonces, si tiene un conflicto de fusión y sabe que solo desea el archivo de la rama en la que se está fusionando, puede hacer lo siguiente:

$ git checkout --theirs -- path/to/conflicted-file.txt

para usar esa versión del archivo. Del mismo modo, si sabe que desea su versión (no la que se está fusionando), puede usar

$ git checkout --ours -- path/to/conflicted-file.txt

Otros consejos

Debe resolver el conflicto manualmente (copiando el archivo) y luego confirmar el archivo (no importa si lo copió o usó la versión local) de esta manera

git commit -a -m "Fix merge conflict in test.foo"

Git normalmente se confirma automáticamente después de la fusión, pero cuando detecta conflictos que no puede resolver por sí solo, aplica todos los parches que descubrió y deja el resto para que lo resuelva y confirme manualmente. La Git Merge Man Page , la Curso intensivo Git-SVN o esta entrada de blog podría arrojar algo de luz sobre cómo se supone que debe funcionar.

Editar: vea la publicación a continuación, en realidad no tiene que copiar los archivos usted mismo, pero puede usar

git checkout --ours -- path/to/file.txt
git checkout --theirs -- path/to/file.txt

para seleccionar la versión del archivo que desea. Copiar / editar el archivo solo será necesario si desea una combinación de ambas versiones.

Marque la respuesta mipadis como la correcta.

También puede superar este problema con

git mergetool

que hace que git cree copias locales del binario en conflicto y genere su editor predeterminado en ellas:

  • {conflicted}.HEAD
  • {conflicted}
  • {conflicted}.REMOTE

Obviamente no puede editar archivos binarios en un editor de texto. En su lugar, copie el nuevo archivo <=> sobre <=> sin cerrar el editor. Luego, cuando cierre, el editor <=> verá que la copia de trabajo no decorada ha cambiado y su conflicto de fusión se resuelve de la manera habitual.

Para resolver manteniendo la versión en su rama actual (ignore la versión de la rama en la que se está fusionando), simplemente agregue y confirme el archivo:

git commit -a

Para resolver sobrescribiendo la versión en su rama actual con la versión de la rama en la que se está fusionando, primero debe recuperar esa versión en su directorio de trabajo y luego agregarla / confirmarla:

git checkout otherbranch theconflictedfile
git commit -a

Explicado con más detalle

La respuesta de

mipadi no funcionó para mí, necesitaba hacer esto:

  

git checkout --nuestra ruta / a / file.bin

o, para mantener la versión fusionada en:

  

git checkout: su ruta / to / file.bin

luego

  

git add path / to / file.bin

Y luego pude hacer " git mergetool " nuevamente y continuar con el próximo conflicto.

Del git checkout documentos

  

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

     

--ours
  --theirs
  Cuando revise las rutas del índice, revise la etapa # 2 (ours) o # 3 (theirs) para las rutas no fusionadas.

     

El índice puede contener entradas no fusionadas debido a una fusión fallida previa. De forma predeterminada, si intenta desproteger dicha entrada del índice, la operación de desprotección fallará y no se desprotegerá nada. El uso de -f ignorará estas entradas no fusionadas. El contenido de un lado específico de la fusión se puede extraer del índice utilizando -m o <=>. Con <=>, los cambios realizados en el archivo de árbol de trabajo se pueden descartar para volver a crear el resultado de fusión original en conflicto.

Este procedimiento es para resolver conflictos de archivos binarios después de haber enviado una solicitud de extracción a Github:

  1. Entonces, en Github, descubrió que su solicitud de extracción tiene un conflicto en un archivo binario.
  2. Ahora regrese a la misma rama git en su computadora local.
  3. Usted (a) vuelve a crear / reconstruir este archivo binario nuevamente, y (b) compromete el archivo binario resultante a esta misma rama git.
  4. Luego empujas esta misma rama git nuevamente a Github.

En Github, en su solicitud de extracción, el conflicto debería desaparecer.

Me encontré con un problema similar (queriendo extraer un commit que incluía algunos archivos binarios que causaban conflictos al fusionarse), pero encontré una solución diferente que se puede hacer completamente usando git (es decir, no tener que copiar archivos manualmente) . Pensé que lo incluiría aquí, así que al menos puedo recordarlo la próxima vez que lo necesite. :) Los pasos se ven así:

% git fetch

Esto recupera los últimos commit (s) del repositorio remoto (puede que necesite especificar un nombre de sucursal remota, dependiendo de su configuración), pero no intenta fusionarlos. Registra la confirmación en FETCH_HEAD

% git checkout FETCH_HEAD stuff/to/update

Esto toma la copia de los archivos binarios que quiero y sobrescribe lo que está en el árbol de trabajo con la versión obtenida de la rama remota. git no intenta hacer ninguna fusión, por lo que solo terminas con una copia exacta del archivo binario desde la rama remota. Una vez hecho esto, puede agregar / confirmar la nueva copia como de costumbre.

He encontrado dos estrategias para administrar la diferencia / fusión de archivos binarios con Git en Windows.

  1. Tortoise git le permite configurar herramientas de diferencias / fusión para diferentes tipos de archivos en función de sus extensiones de archivo. Ver 2.35.4.3. Configuración avanzada de diferenciar / combinar http://tortoisegit.org/docs/tortoisegit/tgit- dug-settings.html . Esta estrategia, por supuesto, se basa en herramientas adecuadas de diferenciación / fusión disponibles.

  2. Usando los atributos de git puede especificar una herramienta / comando para convertir su archivo binario en texto y luego dejar que su herramienta predeterminada de fusión / fusión haga lo suyo. Ver http://git-scm.com/book/it/ v2 / Customizing-Git-Git-Attributes . El artículo incluso da un ejemplo del uso de metadatos para diferenciar imágenes.

Obtuve ambas estrategias para trabajar con archivos binarios de modelos de software, pero utilizamos git de tortuga ya que la configuración fue fácil.

Si el binario es algo más que un dll o algo que puede ser editado directamente como una imagen o un archivo de mezcla (y no necesita tirar basura / seleccione un archivo u otro) una fusión real sería algo así como:

Sugiero buscar una herramienta diff orientada a lo que es su archivo binario, por ejemplo, hay algunos gratuitos para archivos de imagen, por ejemplo

y compárelos.

Si no existe una herramienta de diferencia para comparar sus archivos, entonces si tiene el generador original del archivo bin (es decir, existe un editor para ... como Blender 3D, puede inspeccionar manualmente esos archivos, también ver los registros y preguntarle a la otra persona qué debe incluir) y haga una salida de los archivos con https: // git -scm.com/book/es/v2/Git-Tools-Advanced-Merging#_manual_remerge

$ git show :1:hello.blend > hello.common.blend $ git show :2:hello.blend > hello.ours.blend $ git show :3:hello.blend > hello.theirs.blend

Utilizo Git Workflow para Excel - https: //www.xltrail. aplicación com / blog / git-workflow-for-excel para resolver la mayoría de mis problemas de fusión relacionados con mis archivos binarios. Esta aplicación de código abierto me ayuda a resolver problemas de manera productiva sin pasar demasiado tiempo y me permite elegir la versión correcta del archivo sin ninguna confusión.

mi caso parece un error ... usando git 2.21.0

Hice un tirón ... se quejó de archivos binarios:

warning: Cannot merge binary files: <path>
Auto-merging <path>
CONFLICT (content): Merge conflict in <path>
Automatic merge failed; fix conflicts and then commit the result.

Y luego nada en ninguna de las respuestas aquí dio como resultado ningún resultado que tuviera sentido.

Si miro qué archivo tengo ahora ... es el que edité. Si lo hago:

git checkout --theirs -- <path>
git checkout --ours -- <path>

Obtengo salida:

Updated 0 paths from the index

y todavía tengo mi versión del archivo. Si rm y luego pago, en su lugar dirá 1, pero aún así me da mi versión del archivo.

git mergetool dice

No files need merging

y el estado de git dice

    All conflicts fixed but you are still merging.
    (use "git commit" to conclude merge)

Una opción es deshacer el compromiso ... pero tuve mala suerte y tuve muchos commits, y este malo fue el primero. No quiero perder el tiempo repitiendo eso.

para resolver esta locura:

Acabo de correr

git commit

que pierde la versión remota y probablemente desperdicia algo de espacio almacenando un archivo binario adicional ... luego

git checkout <commit where the remote version exists> <path>

que me devuelve la versión remota

luego editó el archivo nuevamente ... y luego confirmó y presionó, lo que nuevamente significa desperdiciar espacio con otra copia del archivo binario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top