2012-01-12 11 views
11

Actualmente estoy buscando muchas de las funciones de seguimiento de contenido de git. Es muy bueno saber que git me permite descifrar el código que se ha movido de un archivo a otro, pero me pregunto cómo se puede usar esta función cuando se realiza la resolución de conflictos en las fusiones.Cómo obtener git para fusionar correctamente el contenido movido (no solo archivos)

Aquí está el panorama:

Tengo dos archivos hello.cc y bye.cc creado. Comienzo una rama topic y muevo un código de hello.cc a bye.cc. Si ahora hago un git blame -C bye.cc puedo ver que este código vino originalmente de hello.cc, que es bueno saber. Sin embargo ahora cambio a la rama original sin el contenido movido y cambio algún código dentro de la sección en hello.cc que se ha movido en la otra confirmación. Si ahora hago un git merge topic obtengo un conflicto por hello.cc. Sin embargo, a menos que use un estilo diff3 (lo cual usualmente hago), solo puedo ver que este método ha sido eliminado de hello.cc en la otra rama, pero no que haya sido modificado posteriormente. Lo que sería bueno sería también obtener un conflicto en bye.cc porque sería necesario verificar si los cambios de la otra rama tendrán que volver a aplicarse al código. ¿Es esto de alguna manera posible?

Sé que puedo averiguar manualmente, que el código se ha movido haciendo un git blame --reverse -C topic.... Sin embargo, para uno me tomó bastante tiempo descubrir esta posibilidad y la mayoría probablemente no lo sepa. Por segunda vez soy flojo y probablemente olvide que el código podría haberse movido. Además, no estoy seguro de que esto funcione cuando el código se haya movido a más de un archivo.

¿Cuál sería su forma de mantener esta situación lo más segura posible?

Editar:

Me acabo de enterar que git blame --reverse -C hello.cc $(git merge-base HEAD topic)..topic también trabaja para localizar el origen del contenido se movió. Y si entiendo correctamente git, probablemente sea más rápido, porque no hará una búsqueda completa del contenido en el repositorio completo.

Editar:

he subido al repositorio estoy usando para jugar a github para que pueda probar la fusión por sí mismo. El compromiso donde moví la función está en la rama de tema. El compromiso donde se cambia la misma función en el maestro en HEAD de la rama merge_here. Hay un commit adicional en master en el que estaba jugando con algunas otras técnicas de fusión, que debes ignorar para esta pregunta.

Respuesta

-4

Puedes usar git para poner lo que quieras en tu confirmación. Funcionará bien.

+0

Sí Seguro . Lo sé. Pero, ¿cuál es la mejor manera de hacer que GIT me dé pistas y advertencias sobre qué incluir en el compromiso, ya sea a través del uso de herramientas o mediante conflictos de fusión? – LiKao

0

Desafortunadamente, llegué a la misma trampa con mi código, después de mover el archivo en git, no reconoce el cambio durante la fusión de la rama.Parece , la regla de oro uno tiene que guiar el trabajo con movimiento es: movimiento de código

mantenerse separadas de los cambios

GIT no puede realizar un seguimiento de este tipo de los casos, como por ahora. Y parece que no hay una solución rápida/automatizada para resolver problemas potenciales después de mover el archivo y luego fusionar.

Incluso si usted sabrá tanto las confirmaciones cuando ocurrió el problema, y ​​tratará de aplicar el parche o revertir los cambios perdidos después del movimiento + fusionar, todavía tendrá rechaza por igual desde git:

'git apply' failed with code 1:'error: patch failed: filename.js:81' 
Cuestiones relacionadas