Apretando solo algunas confirmaciones locales después de la fusión

La respuesta a esta pregunta muestra cómo impulsar selectivamente las confirmaciones locales, pero parece que esas son confirmaciones locales en la punta.

Si me he fusionado en nuevos cambios desde el origen de tal forma que estén intercalados con mis commits, (y el último commit es el post 'fusionado'), ¿hay algo que pueda hacer para impulsar solo algunos de estos commits? ¿O debo ramificarme antes de fusionar y restablecer / esconder los commits que quiero omitir?

Necesita crear un refspec que se refiera a la confirmación en cuestión, y presione el refspec.

La razón detrás de esto es un poco desorderada, por así decirlo. El set real de objects transferidos en un push (o cualquier otra secuencia de transporte de objects) no está necesariamente limitado a lo que pueda pensar. A veces, un empuje empujará los objects repo "sin usar", ya que la synchronization entre el cliente (haciendo el empuje) y el server (recibiendo un package de objects) se especifica sin apretar. Garantiza que todos los objects requeridos llegarán allí, pero puede empujar algunos que no son necesarios . En realidad, se necesita más comunicación para descubrir "lo que es necesario" que simplemente presionar todo, especialmente con toda la compression que se produce en la secuencia de envío / recepción.

Por lo tanto, lo que ocurre internamente en un "empuje" es que el cliente envía una gran bola (específicamente, un "package delgado") llena de objects, y luego -después de que esos objects están instalados de manera segura en los repo-envíos del server en un set de "tags de reference":

 refs/heads/zorg = object 00ac1d1f1ab1ec0ffee5c01ec0idf1dd1edeedee refs/tags/skin = object 5011d1f1ab1ebac1110515be11e5be111c05ed0e 

y así. El server ejecuta estas ref-updates a través de los ganchos de git pre-receive y update para verificar que estén bien, y si lo están, los almacena en las references del server. (Los ganchos pueden inspeccionar estos objects, si se desea. Esto permite que un gancho compruebe si las tags son "livianas", refiriéndose directamente a confirmaciones, o "anotadas", haciendo reference a objects de label en el repository, por ejemplo).


Añadiré aquí que creo que su pregunta implica un malentendido sobre cómo funcionan realmente las twigs. Una twig es una estructura de datos "implícita". Git tiene dos conceptos subyacentes que se coordinan para crear una "twig": tiene las tags de punta de twig, que nombran una única confirmación; y tiene commits, que cada uno lleva cero o más ID de "padres comprometidos". Lo que hace, por ejemplo, master una twig es el nombre de la punta de la twig ( refs/heads/master ). Pero eso solo te hace un commit único, la punta de la twig. Para encontrar lo que está "en" la twig, empiezas ahí y miras al padre o padres de ese compromiso. Cada confirmación principal también está "activada" en la twig master en ese instante, y los padres de cada uno de los padres están en ella, y así sucesivamente. Si usted tiene:

 M1 -- M2 -- M3 -- M4 <-- master \ B1 -- B2 -- B3 <-- branchB \ / D1 -- D2 <-- develB 

a continuación, confirma que B3 está "on" branchB porque es la punta de branchB , y D2 y B2 también están "on" en la twig porque B3 tiene ambos commits como sus padres.

Si no quiere D2 en branchB después de todo, pero quiere D1 en él, debe hacer una nueva (y bastante diferente) commit, llamémosla B4 , que tiene B2 y D1 como sus padres:

 M1 -- M2 -- M3 -- M4 <-- master \ | ------B4 <-- branchB | / | B1 -- B2 -- B3 | <-- branchB-old [or abandoned entirely] \ / | D1 -- D2 | <-- develB \ / ---------- 

De nuevo, branchB simplemente nombra un branchB tip-of-branch, pero este es diferente de B3 .

Al presionar lo anterior (el desorder con B4 ), en realidad puede enviar la confirmación B3 al server, pero mientras no haya una label para ello, nadie la verá y, finalmente, será recolectada como basura del server.