2012-06-20 10 views
18

Digamos que tengo un archivo que es¿Por qué git no intenta combinar los cambios en los archivos renombrados?

  1. modificados en la principal
  2. Modificado en una rama de la característica
  3. Renombrado en una rama de la característica

Cuando intento fusionar hasta de maestro a la función de rama, combinación falla con

CONFLICTO (modificar/eliminar): X eliminado en HEAD y modificado en origen/maestro. Versión origen/maestro de X en el árbol.

Entiendo que hay un conflicto, pero ¿por qué ni siquiera intenta fusionar los cambios y colocar marcadores de conflicto en el archivo? Previous answers seem to imply that it should. Todo lo que obtengo es dos versiones diferentes del archivo, donde tengo que descubrir la diferencia manualmente y los cambios de puerto línea por línea desde la versión maestra a mi versión.

Pasos para reproducir:

git init 
touch a 
git add a 
git commit -m 'initial import' 

git checkout -b feature1 
echo feature1 > a 
git add a 
git commit -m feature1 
git mv a b 
git commit -m feature1 

git checkout master 
echo bugfix > a 
git add a 
git commit -m bugfix 

git checkout feature1 
git merge master 
+0

Posible [duplicado] (http://stackoverflow.com/q/2701790/720999) – kostix

Respuesta

31

Debido a que en realidad no existe el concepto de la operación de cambio de nombre de primera clase en git, sólo se "detecta" cambia el nombre utilizando un umbral para las diferencias de archivos. Tus archivos son probablemente demasiado diferentes.

Trate fusión con: git merge master -s recursive -X rename-threshold=5%

+0

Cuando inicialmente se compromete un cambio de nombre, parece que hay un umbral ya se utiliza desde el archivo renombrado puede contener diferencias menores. ¿Alguna idea de por qué no usaría simplemente el mismo umbral? Esperaría que, dado que recogió el cambio de nombre en la confirmación inicial, debería mantener esto en una fusión o una rebase. –

+1

@SeanAdkinson Debido a que la estrategia de fusión predeterminada fusiona solo los resultados finales, no cada confirmación. Por lo tanto, si el archivo se modificó en otra confirmación después de cambiar el nombre, puede que ya no cumpla el umbral, incluso si lo hizo antes. – gcscaglia

+0

Tenga en cuenta que el '%' en 'rename-threshold' es crucial. –

Cuestiones relacionadas