2010-11-03 10 views
5

Supongamos que un archivo está en conflicto con git.git: almacena diferentes etapas de un archivo en el árbol de índice/trabajo después del conflicto

Significa que el índice contiene 3 versiones del archivo, la anterior, la de una rama, la de la otra rama.

Me gustaría verificar la versión 3 ("theirs") en el directorio de trabajo, y la versión 2 ("our") en el índice.

¿Hay alguna manera sencilla de hacerlo?

+0

Actualmente es la versión 'nuestra' (de la rama actual en la que se fusiona), la versión 'suya' (de la rama que se está fusionando) y la versión 'ancestro' (antecesor común de ambas ramas) - no la versión anterior en general. –

Respuesta

4

Probablemente la forma más libre de dolor sea la siguiente.

# Checkout 'their' version from the index into the working tree 
git checkout --theirs file 

# reset the index to the HEAD version, i.e 'our' branch 
git reset HEAD file 

perder el tiempo con el índice con la update-index tuberías no debería ser necesario a menos que usted ha perdido su HEAD (por así decirlo).

+0

Excelente. Mucho más simple +1 – VonC

1

El truco está en "agregar una versión al índice": eso marcaría el archivo como resuelto (es decir, no más "nuestro" o "suyo").
Así que debe ser el último paso.

Tal vez algo como:

git show :3:<filename> > <filename>.theirs # save the "theirs" version in a tmp file 
git show :2:<filename> > <filename>  # display the "ours" version in the working dir 
git add <filename>       # add it to the index 
              # (marking the conflicting file as resolved) 
move <filename>.theirs <filename>  # erasing the file with the "theirs" version 
              # in the working directory 

No exactamente "sin dolor" ...


Para evitar el archivo temporal, Jakub Narębski sugiere el uso de git update index (un comando de plomería) para manipular directamente El índice.

--replace --cacheinfo <mode> <object> <path> 

--cacheinfo se utiliza para registrar un archivo que no está en el directorio de trabajo actual. Esto es útil para la fusión de la comprobación mínima.

De forma predeterminada, cuando existe una ruta de archivo en el índice, git update-index rechaza un intento de agregar path/file. De manera similar, si existe un archivo path/file, no se puede agregar una ruta de archivo. Con el indicador --replace, las entradas existentes que entran en conflicto con la entrada que se agrega se eliminan automáticamente con mensajes de advertencia.

+0

VonC: tienes el truco bien: agregar destruye las etapas de índice. ¡Ya había averiguado tu solución! :-) No es indoloro, pero gracias de todos modos! Estoy buscando más comandos de git plomería que logren esto sin el problema de almacenar un archivo temporal. –

+0

@Olivier: bien, solo espere a Jakub o Jefromi o Charles o ... en cualquier momento;) – VonC

+0

Puede usar bajo nivel ['git update-index'] (http://www.kernel.org/pub /software/scm/git/docs/git-update-index.html) para manipular el índice: vea '--cacheinfo ' (quizás con las opciones '--replace') y' --force-remove'. –

Cuestiones relacionadas