git format-patch para generar un parche para un file específico que forma parte de un commit

Estoy intentando fusionar algunos files que se agregaron para una function en una twig llamada dev . Algunos de los files se agregan y algunos se cambian. ¿Hay alguna forma de generar un parche para los files seleccionados como parte de una confirmación para que se puedan aplicar en el maestro? Estoy buscando para luego aplicar el parche a un maestro.

git format-patch -1 SHA1 --stdout está generando un parche para toda la confirmación, pero necesito generar solo el parche de files específicos en la confirmación.

¿Hay alguna forma de generar un parche para los files seleccionados como parte de una confirmación para que se puedan aplicar en el maestro?

Quizás (no estoy seguro de lo que estás pidiendo). Comencemos con el hecho básico de que git diff proporciona, como salida, instrucciones para cambiar el compromiso X en el compromiso Y. Mientras tanto, el git format-patch básicamente solo ejecuta git diff para get los diffs del parche (como hacen casi todos los demás commands de Git que necesitan diffs).

Si ejecuta git diff manual , puede agregar parameters adicionales. En particular, git diff acepta una list de pathspecs (básicamente, nombres de files) después de las opciones y los dos se comprometen a comparar:

 git diff XY -- path/to/file 

Esto limita el resultado de las instrucciones de "cómo cambiar los files" para mostrar solo el (los) file (s) proporcionado (s). Por lo tanto, si "para files seleccionados" significa "todas las instrucciones para los files A, B y C, pero nada para los files D y E", entonces un simple:

 git diff XY -- ABC 

hará el truco

No hay forma de que git format-patch ejecute git diff como este, pero simplemente puede cortar y volver a pegar el parche formateado, es decir, usar git format-patch como de costumbre, luego eliminar el diff y replacelo con uno generado por tu costumbre git diff .

Una mejor manera

Sin embargo, ¿qué pasa si "para los files seleccionados" no es la frase correcta? ¿Qué pasa si necesita el parche para los files A, B y C, excepto que el parche para el file B debe ser algo diferente ? Hay una manera mejor y más flexible de lidiar con esto, que se puede resumir como: No intentes fingir, solo hazlo de verdad.

Es decir, comience revisando el mismo compromiso que desea parchar. (Actualice su propio repository si es necesario ejecutando git fetch , para que tenga su master como origin/master u another_remote/master . Puede agregar su repository como otro control remoto, por ejemplo, git remote add another_remote url , si es necesario). crea una nueva tuya, apuntando a este compromiso particular:

 git checkout -b for-patching-them origin/master 

(Esto también hará que su sucursal for-patching-them tenga la sucursal de seguimiento remoto como su upstream).

Ahora que tiene una sucursal propia , puede git cherry-pick cuidadosamente la confirmación, quizás con -n si lo desea. A continuación, puede modificar los cambios tanto como desee y / o necesite, probarlos y confirmarlos. Puedes comprometerte con --amend , o hacer muchos commits y eventualmente hacer una rebase interactiva y aplastar las confirmaciones, o usar las herramientas de Git que quieras.

Eventualmente, tendrá uno o más commits que está listo para enviarles, y ahora puede ejecutar:

 git format-patch origin/master 

para get el parche preciso para enviarlos, sin tener que editar ese parche y esperar que se aplique. Además, si han actualizado su bifurcación desde que comenzó todo este trabajo, puede ejecutar git fetch nuevamente para recoger sus actualizaciones, y luego git rebase a ajustar la git rebase su parche para ajustarlo en function de sus cambios, de modo que esté nuevamente listo para solo ejecutar git format-patch .