Digamos que tengo cambios no confirmados en mi directorio de trabajo. ¿Cómo puedo hacer un parche de esos sin tener que crear una confirmación?
Digamos que tengo cambios no confirmados en mi directorio de trabajo. ¿Cómo puedo hacer un parche de esos sin tener que crear una confirmación?
Respuestas:
git diff
para cambios no organizados. git diff --cached
para cambios por etapas.
git format-patch
También incluye diferencias binarias y alguna metainformación. En realidad, esa sería la mejor apuesta para crear un parche, pero afaik esto solo funciona para fuentes / cambios verificados, ¿verdad?
git diff --relative
Si aún no ha confirmado los cambios, entonces:
git diff > mypatch.patch
Pero a veces sucede que parte de las cosas que está haciendo son archivos nuevos que no se rastrean y no estarán en su git diff
salida. Entonces, una forma de hacer un parche es organizar todo para una nueva confirmación ( git add
cada archivo, o simplemente git add .
) pero no hacer 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
Luego puede aplicar el parche:
git apply mypatch.patch
Nota: También puede usar --staged
como sinónimo de --cached
.
git diff --no-color
. De lo contrario, parece un problema de codificación.
git diff
y git apply
funcionará para archivos de texto, pero no funcionará para archivos binarios.
Puede crear fácilmente un parche binario completo, pero tendrá 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á su (s) confirmación (es) temporal (es). El resultado final deja su copia de trabajo (intencionalmente) sucia con los mismos cambios que tuvo originalmente.
En el lado receptor, puede usar el mismo truco para aplicar los cambios a la copia de trabajo, sin tener el historial de confirmación. Simplemente aplique los parches y git reset --mixed <SHA of commit *before* the patches>
.
Tenga en cuenta que es posible que tenga que estar bien sincronizado para que 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 hay maneras de hacer que funcione, pero no lo he investigado demasiado.
Aquí se explica cómo crear los mismos parches en Tortoise Git (no es que recomiendo usar esa herramienta):
Tortoise Git
->Create Patch Serial
Since
: FETCH_HEAD
funcionará si está bien sincronizado)Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
opcionY cómo aplicarlos:
Tortoise Git
->Apply Patch Serial
Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
opcionPara crear un parche con archivos modificados y nuevos (por etapas), puede ejecutar:
git diff HEAD > file_name.patch
git diff --cached > mypatch.patch
no funciona.
file_name.patch
ser utilizada por el patch
comando? ¿Son compatibles entre sí?
Me gusta:
git format-patch HEAD~<N>
donde <N>
es el número de últimas confirmaciones para guardar como parches.
Los detalles sobre cómo usar el comando están en el DOC
UPD
Aquí puede encontrar cómo aplicarlos luego.
UPD Para aquellos que no tuvieron 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 de su repositorio de proyectos, ejecute:
git make-patch
Este comando creará 0001-uncommited.patch
en su directorio actual. El parche contendrá todos los cambios y archivos no rastreados que son visibles para el siguiente comando:
git status .
También podríamos especificar los archivos, para incluir solo los archivos con cambios relativos, particularmente cuando abarcan múltiples directorios ex
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
Descubrí que esto no se especifica en las respuestas o comentarios, que son todos relevantes y correctos, así que decidí agregarlo. ¡Explícito es mejor que implícito!