Git merge no fusiona un file por segunda vez

Tengo una twig principal con algunas cosas, digamos file README. También tengo una twig dev, hija de maestro, con algunos files adicionales, digamos file README2. Yo hago lo siguiente:

git merge dev 

de master y get el file README2 combinado en master. Ahora lo elimino:

 git rm README2 

Ahora cuando fusioné Dev nuevamente, esperaba que obtuviera el file README2 fusionado en master, porque ya no está en el master. Pero Git informa que no hay cambios y nada que fusionar. Esto realmente me conviene, pero no entiendo cómo es esto, ya que el desarrollo de la twig en este punto claramente tiene el file README2, mientras que el maestro no.

Estás malinterpretando lo que hace git merge . Funciona al nivel del tree de commits, no al nivel de files individuales.

Digamos que comenzó aquí, con dos confirmaciones A y B en dos twigs:

 master --- A # this has *no* README2 file dev ------ B # this has README2 

Luego fusionaste la twig dev en master .

 master --- A ----+--- C / dev ------ B --/ 

Esto crea una nueva confirmación de fusión ( C ) en la twig maestra. C tiene la historia de sus padres, A y B Aquí es donde README2 se lleva a la twig master .

Más tarde, eliminó README2 de la twig master . Esta eliminación de files generaría una nueva confirmación ( D ) en la twig master .

 master --- A ----+--- C --- D / dev ------ B --/ 

Este nuevo compromiso D tiene el historial de master y dev (debido a la fusión en C ), más el hecho de que eliminó el file README2 . Supongamos que también ha realizado un cambio en dev (commit E continuación), pero no implica el file README2 .

 master --- A ----+--- C --- D / dev ------ B --+--- E 

Ahora fusionas dev con master nuevamente.

 master --- A ----+--- C --- D --+-- F / / dev ------ B --+--- E --------/ 

Usted tiene una nueva combinación F commit, que tiene el historial de D y E La twig principal no recupera un file README2 porque el file ya se eliminó en el master (en D ) y el nuevo dev commit E no contiene actualizaciones en README2 .


En este punto, si modifica el file README2 en la twig dev , luego trata de fusionarlo de nuevo a master , terminaría con un conflicto de fusión. Se vería algo como esto.

 $ git merge dev CONFLICT (modify/delete): README2 deleted in HEAD and modified in dev. Version dev of README2 left in tree. Automatic merge failed; fix conflicts and then commit the result. 

Como sugiere el text, hay un conflicto entre los dos estados. En una twig, el file ha sido modificado, pero en el otro ha sido eliminado. No estoy seguro de cuál aceptar, se da por vencido y le pide que le diga qué hacer a continuación.

Esto sucede porque al eliminar el file README2 del sistema de seguimiento de git ignorará cualquier cambio que pueda hacerle en el futuro, que también puede implicar fusiones que contendrían el file. Si haces el git status probablemente verás el file allí como un file sin seguimiento.

Espero que esto haya sido útil, si quisieras eliminar el file en esa confirmación en lugar de hacerlo en git rm README2 podrías haber eliminado el file y git lo registraría como una eliminación de files y no como un command de descarte.