2012-10-12 124 views
10

Últimamente he estado usando git show <hash> para crear diffs para referencia posterior porque es más fácil escribir que git diff <hash>~ <hash> y muestra la información de confirmación (marca de tiempo, usuario, hash, comentario) Luego puede usar git apply <filename> para aplicar el parche.Usando `git show` para crear y aplicar parches que abarcan múltiples commits

Descubrí que git show -3 mostrará las últimas tres confirmaciones junto con la misma información adicional. Sin embargo, git apply aplastará todo en el directorio de trabajo como cambios no registrados y perderá toda la información de confirmación.

¿Hay algo en git que aplique toda esa información? Sería mucho más simple simplemente pasar una bandera que dividir el parche en tres archivos, aplicarlos por separado y crear nuevos commits.

Respuesta

5

Puede usar git format-patch para generar correos electrónicos MIME que representan las confirmaciones, incluidos sus metadatos (mensaje, autoría, etc.). A continuación, puede volver a aplicar estos con git am.

Por lo tanto, git format-patch HEAD~3 generará 3 parches para los últimos 3 commits, y luego puede canalizar estos todos en git am. Si quiere ser más simple, git format-patch --stdout HEAD~3 enviará los mensajes MIME en stdout, para que pueda canalizarlos a donde desee en lugar de ocuparse de 3 archivos separados.

Por supuesto, si intentas guardar confirmaciones para hacer referencia más tarde, ¿por qué no simplemente etiquetarlas? A continuación, puede volver a aplicar las confirmaciones mediante el git cherry-pick.

+0

Parece que esto va a funcionar, aunque voy a tener que ve y vuelve a hacer los parches que ya hice usando 'git show'. Probablemente, a partir de ahora, empiece a usar el parche de formato para facilitar las cosas. La razón por la que no estoy usando 'git cherry-pick' es que me estoy mudando a un nuevo servidor de desarrollo y, esencialmente, tengo acceso de solo lectura en git en este momento. En lugar de borrar todos mis directorios de código, solo estoy haciendo parches para copiar. – redbmk

1

prueba git bundle para enviar partes específicas de la historia.

3

En Linux se puede canalizar su delta-generador --- git-show o git-diff, por ejemplo --- con el comando git-apply.

(Es también probable más seguro para habilitar siempre de 3 vías fusionarse con la opción -3)

> git show <sha1> [<path>] | git apply -3 
> git diff <sha1-a> <sha1-b> [<path>] | git apply -3 

Ejemplos:

  • aplican las ediciones en un archivo específico realizado en abcdef:
> git show abcdef dir/file.c | git apply -3 
  • aplican diferencia en un archivo de dos confirmaciones diferentes abcdef y

> git diff abcdef 123456 foo.h | git apply -3

Ver también: https://stackoverflow.com/a/12320940/1329340

Cuestiones relacionadas