¿Qué es un parche en el control de versiones de git?

137

Soy nuevo tanto en git como en control de versiones, así que estoy tratando de descubrir qué es un parche y en qué se diferencia del resto de actividades que hago en git.

¿Cuándo aplico un parche? ¿Sucede cada vez que me comprometo?

Amit Erandole
fuente

Respuestas:

116

Puede ver en esta publicación de blog cómo puede crear un parche (colección de cambios que desea comunicar y aplicar a otro repositorio)

parche git
(imagen de la publicación de blog de 2008 " Bioruby con git: ¿cómo funcionaría eso? ", publicado por Jan AERTS )

Vea también Contribuir a Rails con Git como otro ejemplo concreto.

Hoy en día, la solicitud de extracción de GitHub hace que sea realmente fácil aplicar parches en repositorios de GitHub, lo cual es útil cuando no es un contribuyente directo (es decir, no tiene derecho a enviar directamente a un repositorio).
En realidad, recientemente, GitHub introdujo " Mejores correos electrónicos de solicitud de extracción " para mejorar la notificación de nuevos parches.

VonC
fuente
44
Una buena respuesta, y una que me dice que un 'parche' GIT no es lo que estoy buscando.
RonLugge
91

Patch es un programa de Unix que actualiza los archivos de texto de acuerdo con las instrucciones contenidas en un archivo separado, llamado archivo de parche.

En otras palabras, puede significar el archivo con instrucciones o un programa que procesa ese archivo y lo aplica a algo.

Ahora, ¿qué es un archivo de parche? Digamos que tiene un archivo de texto con 2 líneas:

This is line A.
This is line B, or otherwise #2.

Luego cambia la primera línea, y ahora su archivo se ve así:

This is SPARTA.
This is line B, or otherwise #2.

¿Cómo describirías el cambio en el contenido del archivo? Puede decir que la primera línea "Esta es la línea A". fue reemplazado por "Esto es SPARTA", o incluso la última palabra "A" de la primera línea fue reemplazada por otra palabra "SPARTA". Y eso es exactamente lo que nos dice diff . Digamos que tengo dos versiones de este archivo, una llamada file1.txt y otra file2.txt, luego ejecuto diff y obtengo esto:

$ diff -u file1.txt file2.txt 
--- file1.txt   2011-11-26 11:07:03.131010360 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.

Al tener una descripción de los cambios, puede aplicarlo a un contenido inicial y obtener un contenido modificado. Y esos cambios, en un formato unificado que los programas tipo "parche" pueden entender, se denominan archivos de parche. Es como, en lugar de obtener un pez de alguien que te enseñe a pescar, para que puedas sacar ese pez de las aguas tú mismo. Ahora, apliquemos nuestro parche a file1.txt para que se vea exactamente como file2.txt:

$ cat file1.txt 
This is line A.
This is line B, or otherwise #2.
$ cat file2.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ diff -u file1.txt file2.txt > changes.patch
$ cat changes.patch 
--- file1.txt   2011-11-26 11:09:38.651010370 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.
$ patch < changes.patch 
patching file file1.txt
$ cat file1.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ 

Puede pensar que es más fácil tener solo dos versiones de este archivo. Bueno, en este caso simple eso es cierto. Pero cuando tiene muchos archivos, y esos archivos son muy grandes, es mucho más eficiente tener algunas líneas de cambios en lugar de dos copias de todo.

Cuando se habla en términos de git, el archivo de parche todavía significa lo mismo, pero usar diff + patch sería una pesadilla. Por ejemplo, siempre tendrá que tener dos versiones del archivo (o incluso todo el repositorio) desprotegidas para poder compararlas. No suena tan bien, ¿verdad? Así que git se encarga de todo el trabajo duro por usted: compara su archivo local con lo que hay en el repositorio con el que está trabajando y puede mostrárselo como un "diff", o aplicar ese "diff" como un parche también conocido como confirmar sus cambios, o incluso le permite aplicar algún archivo de parche que ya tiene. Sin profundizar en los detalles, en este sentido, git es absolutamente igual a otros sistemas de control de versiones como SVN, o incluso CVS o forzosamente.

¡Espero eso ayude!


fuente
Nunca supe que git usa el patchprograma incorporado . Pensé que git tenía su propia implementación.
radiantshaw
43

Un parche es un pequeño archivo que indica los cambios realizados en un repositorio. Generalmente se usa cuando alguien externo a su equipo tiene acceso de solo lectura pero tiene un buen cambio de código disponible. Luego crea un parche y te lo envía. Lo aplica y lo empuja al repositorio de git. Todos se benefician de la versión actualizada, y el autor del parche no necesitaba acceso de lectura / escritura.

Realmente es principalmente una cuestión de seguridad (al menos, para eso la gente lo usa).

Tom van der Woerdt
fuente
1
Información adicional: si bien git no usa parches internamente, un objetivo de diseño para git es facilitar el intercambio de parches (porque muchos proyectos funcionan de esa manera, por ejemplo, Linux y git). Entonces, git tiene comandos especiales para manejar parches ( git diffmuestra los cambios como parches de forma predeterminada, le git applypermite aplicar un parche, etc.).
sleske
Felicidades! Realmente lo logró para qué parches se utilizan, es decir, un medio para enviar cambios a los repositorios para los cuales el autor de los cambios no tiene acceso de escritura. Por lo tanto, el modelo de solicitud de tenedor y extracción de GitHub es un reemplazo del modelo de parche de distribución de cambios. Por lo tanto, creo que los parches solo son útiles fuera del contexto de herramientas como GitHub.
mljrg
8

Un archivo de parche representa un conjunto único de cambios que se pueden aplicar a cualquier rama, en cualquier orden. Al usar el parche, obtendrá diferencias entre uno o más archivos. Y luego, puede aplicar las diferencias (parche) para obtener los cambios en los nuevos archivos. Hay muchos usos para un parche en Git. Si tiene cambios no confirmados en su directorio de trabajo y necesita obtener esos cambios para aplicarlos en otro lugar, simplemente cree un parche y aplíquelo.

git diff > mypatch.patch

Si tiene archivos nuevos en su repositorio (sin seguimiento), entonces debe organizar el archivo antes de crear un parche (no confirmar) y usar el siguiente comando

git diff --cached > mypatch.patch 

Luego puede aplicar el parche:

git apply mypatch.patch

Si desea realizar algunos cambios en un repositorio de git, que no tiene un permiso de escritura, simplemente realice los cambios y cree un parche entre ambos, y envíe el parche a alguien que tenga el permiso para aplicar el parche. sus cambios deben agregarse a ese repositorio de git.

Anuraj
fuente
Mejores demostraciones: robots.thoughtbot.com/… . Mi resumen de ejemplo básico: git format-patch <base_commit_or_branch_name>= envuelva todas las confirmaciones desde ahora de nuevo a <base_commit_or_branch_name> en archivos agradables y limpios que contengan los mensajes diff así como los mensajes de confirmación, para enviarlos fácilmente (por ejemplo, por correo electrónico) a otra persona que quiera parchearlos su código base Luego, el destinatario parchea su sistema con su archivo:cat *.patch | git am
Gabriel Staples
7

Un parche es un conjunto de diferencias entre uno o más archivos, para mostrar lo que es diferente entre ellos. Por lo general, solo generaría un parche para mostrarle a alguien lo que ha cambiado. Un ejemplo de cuándo puede hacer esto es cuando encuentra y repara un error en una aplicación de código abierto y luego publica la solución en su rastreador de errores.

Steve Rukuts
fuente