¿Cómo hacer un parche de git de más de un commit en un file?

Estoy tratando de hacer un parche, siguiendo https://kernelnewbies.org/FirstKernelPatch

Mi parche debe estar hecho de mis dos últimos commits, no solo el último.

Cuando git format-patch HEAD^^ el resultado es:

 0001-added-pca9570-driver.patch 0002-removed-whitespace.patch 

Solo quiero un parche con todos esos cambios. La página man solo dice:

 DESCRIPTION Prepare each commit with its patch in one file per commit... 

¿Cómo puedo hacer un parche de dos commits?

Depende de lo que necesita (y, en cierto modo, de por qué).

La respuesta de ElpieKay le proporcionará parches para ambas confirmaciones en un solo file, pero eso no es necesariamente lo mismo que un parche único.

Lo que hackerman sugiere en los comentarios no está mal, pero para todos los propósitos prácticos está incompleto. Usar una reescritura del historial para aplastar las confirmaciones es una forma válida de configurarse para que format-patch cree realmente un único parche con todos los cambios; pero hay un par de forms de abordarlo, especialmente si no puede (o no quiere) replace permanentemente sus dos confirmaciones con una nueva confirmación única.

Dado

 X --- A --- B <--(master) 

y queriendo un parche con cambios de A y B , podrías

 git checkout HEAD^^ 

poniéndote en estado de cabeza separada, luego

 git merge --squash master git commit 

creando una confirmación temporal con todos los cambios

 X --- A --- B <--(master) \ AB <--() ^HEAD 

y ahora

 git format-patch HEAD^ 

producirá el parche, y

 git checkout master 

pondrá todo de nuevo a la normalidad. La desventaja potencial de esto es que los metadatos en los encabezados del correo electrónico (por ejemplo, la ID SHA1 de la que dice que se creó el parche) no se alinearán con tu historial real.

Supongo que, dado que está buscando format-patch , ¿necesita el envoltorio del correo electrónico? Quiero decir, si no, puede ser mucho más simple simplemente git diff HEAD^^ o algo similar …

Aquí hay otra variante en la línea de la respuesta de Mark Adelsberger, donde muestro cómo usar (ab) desde una database rebase git rebase -i .

Por lo tanto, debe verificar una twig temática, comprimir las dos confirmaciones en una confirmación y luego crear un parche.

1. Verifica la twig temática

Esto es solo para que tengamos una caja de arena para perder el time.

 $ git checkout -b squashing_commits 

2. Aplaste los dos commits

Le diremos a git que rebase la punta actual de la twig (es decir, la CABEZA). Para hacerlo, git necesita un nuevo HEAD. Podemos pedir al nuevo HEAD que sea "actual less dos confirmaciones". Me gusta esto:

 $ git rebase -i HEAD~2 

En este punto, verás algo como esto:

 pick 21760270369e Your first commit pick 2bf13c197901 Your second commit # Rebase 9f7b54945e64..2bf13c197901 onto 9f7b54945e64 (2 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit 

Y desea aplastar el segundo sobre el primero, por lo que necesita el command s :

 pick 21760270369e Your first commit s 2bf13c197901 Your second commit # Rebase 9f7b54945e64..2bf13c197901 onto 9f7b54945e64 (2 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit 

Guarde esto en su editor y salga ( :wq in vim). Ahora puede verificar el resultado, donde verá una confirmación aplastada con ambos loggings de commit astackdos.

 $ git show HEAD 

3. Crea un parche

 $ git format-patch -1 

¡Lucro!

git format-patch -2 --stdout > last2.patch

Cuando aplique last2.patch través de git am , se realizarán dos confirmaciones.

cat 0001-added-pca9570-driver.patch 0002-removed-whitespace.patch > last2.patch puede funcionar.

Actualizar:

Después de leer la respuesta de @Mark Adelsberger, me doy count de que puedo haber entendido mal tu necesidad.

Si solo necesita el parche diff que incluye la información de confirmación, git diff HEAD^^ > last2.patch es suficiente. El parche se puede aplicar a través de git apply last2.patch .

Si también necesita la información de compromiso, la respuesta de Mark ha proporcionado una solución. Hay varios otros methods similares.

 git checkout -b patch git reset HEAD^^ --soft git commit git format-patch -1 git checkout - git branch -D patch 

Se crea un parche que contiene dos cambios de commits. Puede aplicarlo a través de git am que hace una confirmación automáticamente.

También está bien aplicar los 2 commits primero y luego aplastarlos en uno.