Cree un parche de git a partir de los cambios no confirmados en el directorio de trabajo actual
Digamos que tengo cambios no confirmados en mi directorio de trabajo. ¿Cómo puedo hacer un parche a partir de ellos sin tener que crear un compromiso?
Si aún no ha confirmado los cambios, entonces:
git diff > mypatch.patch
Pero a veces sucede que parte de las cosas que estás haciendo son archivos nuevos que no tienen seguimiento y no estarán en tu git diff
salida. Entonces, una forma de hacer un parche es preparar todo para una nueva confirmación ( git add
cada archivo, o solo git add .
), pero no realizar la confirmación, y luego:
git diff --cached > mypatch.patch
Agregue la opción 'binario' si desea agregar archivos binarios al parche (por ejemplo, archivos mp3):
git diff --cached --binary > mypatch.patch
Posteriormente podrás aplicar el parche:
git apply mypatch.patch
git diff
para cambios no escalonados.
git diff --cached
para cambios escalonados.
git diff HEAD
tanto para cambios escalonados como no escalonados.
git diff
y git apply
funcionará para archivos de texto, pero no para archivos binarios.
Puedes crear fácilmente un parche binario completo, pero tendrás que crear una confirmación temporal. Una vez que haya realizado sus confirmaciones temporales, puede crear el parche con:
git format-patch <options...>
Después de haber realizado el parche, ejecute este comando:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
Esto revertirá sus confirmaciones temporales. El resultado final deja su copia de trabajo (intencionalmente) sucia con los mismos cambios que tenía originalmente.
En el lado receptor, puedes usar el mismo truco para aplicar los cambios a la copia de trabajo, sin tener el historial de confirmaciones. Simplemente aplique los parches y git reset --mixed <SHA of commit *before* the patches>
.
Tenga en cuenta que es posible que deba estar bien sincronizado para que toda esta opción funcione. He visto algunos errores al aplicar parches cuando la persona que los hizo no había realizado tantos cambios como yo. Probablemente haya formas de hacerlo funcionar, pero no lo he investigado mucho.
A continuación se explica cómo crear los mismos parches en Tortoise Git (no es que recomiende usar esa herramienta):
- Confirme sus cambios de trabajo
- Haga clic derecho en el directorio raíz de la rama y haga clic en
Tortoise Git
->Create Patch Serial
- Elija el rango que tenga sentido (
Since
:FETCH_HEAD
funcionará si está bien sincronizado) - Crear los parches
- Elija el rango que tenga sentido (
- Haga clic derecho en el directorio raíz de la rama y haga clic en
Tortise Git
->Show Log
- Haga clic derecho en la confirmación antes de su(s) confirmación(es) temporal(es) y haga clic en
reset "<branch>" to this...
- Seleccione la
Mixed
opción
Y cómo aplicarlos:
- Haga clic derecho en el directorio raíz de la rama y haga clic en
Tortoise Git
->Apply Patch Serial
- Seleccione los parches correctos y aplíquelos
- Haga clic derecho en el directorio raíz de la rama y haga clic en
Tortise Git
->Show Log
- Haga clic derecho en la confirmación antes de las confirmaciones del parche y haga clic en
reset "<branch>" to this...
- Seleccione la
Mixed
opción
Para crear un parche con archivos nuevos y modificados (preparados), puede ejecutar:
git diff HEAD > file_name.patch
Me gusta:
git format-patch HEAD~<N>
donde <N>
está el número de últimas confirmaciones para guardar como parches.
Los detalles sobre cómo utilizar el comando se encuentran en el DOC.
UPD Explicación de la solución cuando se llama a GIT_PREFIX desde el directorio Git de nivel superior
UPD
Aquí podrás encontrar cómo aplicarlos a continuación.
UPD Para aquellos que no entendieron la idea de format-patch
Agregar alias:
git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX:-.};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'
Luego, en cualquier directorio del repositorio de su proyecto, ejecute:
git make-patch
Este comando se creará 0001-uncommited.patch
en su directorio actual. El parche contendrá todos los cambios y archivos sin seguimiento que son visibles para el siguiente comando:
git status .