Combinar cambios con git diff y patch

Los administradores del sistema modifican muchos archivos. A veces estos son códigos. Otras veces, son archivos de configuración, libros de jugadas YAML, XML, documentos de políticas, archivos kickstart y probablemente algunos pedidos de comida para llevar. Es importante realizar un seguimiento de lo que ha cambiado y compartir sus cambios con otras personas que puedan necesitar ajustar sus copias locales de archivos.

Para que este proceso sea transparente, muchos proveedores de repositorios Git en línea han adoptado el modelo de "solicitud de combinación" o "solicitud de extracción", en el que esperan que los contribuyentes clonen (a menudo denominado "bifurcación"), aunque la intención no es en realidad bifurcar el proyecto) todo el repositorio, luego enviar una solicitud a través de la plataforma en línea para volver a incrustar la rama modificada en el repositorio original. Pero, ¿qué hace cuando no está utilizando un proveedor de Git Platform as a Service (PaaS) o cuando desea un proceso simplificado para enviar cambios?

Tu utilizas diff y patch. Estas son las herramientas que todos usaban antes de que los anfitriones de Git en línea trasladaran el proceso al navegador, y siguen siendo válidas hoy en día. Con el git diff comando, puede crear un registro de cómo ha cambiado el archivo, y el propietario de un repositorio puede usar el patch para "reproducir" estas modificaciones en comparación con la versión anterior para actualizarla con la nueva versión.

Índice

Configurar un archivo de ejemplo

Suponga que usted y yo estamos colaborando en un proyecto de cálculo de números primos. Usaré un ejemplo escrito en Lua porque es fácil de leer. No necesita conocer a Lua para que este ejemplo sea relevante. Hasta ahora el archivo prime.lua contiene:

function prime(num)
  if num%2 == 0 then
    return false
  end
  return true
end

Este es un código válido, funciona como se esperaba, pero está incompleto. Así que me envías el archivo y lo guardo como prime_revision.lua y hacer algunos cambios. Estoy modificando parte de su código existente y agregando el mío:

function prime(num)
  if num<2 or num%2 == 0 and not num == 2 then
    return false
  end
  return true
end

num=0

while ( num >= 0 ) do
   if prime(num) then
      print(num .. " is prime")
   end
   num=num+1
end

Con un archivo pequeño como este, es relativamente trivial ver qué ha cambiado. el if Se actualizó la declaración y se agregó un montón de código al final. Sin embargo, con archivos más grandes, actualizar el archivo original para que coincida con el nuevo sería difícil y propenso a errores. el git diff y patch los comandos resuelven este problema.

Crear un parche con git diff

Cuando edita un archivo confirmado en Git, puede ver los cambios que realizó usando la Ayuda git diff:

$ git diff prime.lua
diff --git a/prime.lua b/prime.lua
index b4c3d7c..6dea598 100644
--- a/prime.lua
+++ b/prime.lua
@@ -1,6 +1,15 @@
 function prime(num)
-  if num%2 == 0 then
+  if num<2 or num%2 == 0 and not num == 2 then
     return false
   end
   return true
 end
+
+num=0
+
+while ( num >= 0 ) do
+   if prime(num) then
+      print(num .. " is prime")
+   end
+   num=num+1
+end

Este es el mismo punto de vista que el proporcionado por el diff comando usando --unified y esta es también la sintaxis correcta para usar con la opción patch pedido. Un signo más (+) al comienzo de una línea indica algo agregado al archivo anterior. Un signo menos (-) al comienzo de una línea indica una línea que ha sido eliminada o modificada.

Crear archivo de parche con git diff

el git diff El resultado del comando es un archivo de parche válido, además de ser informativo para el propietario del repositorio de Git. Puedes hacer esto usando la redirección estándar de Bash:

$ git diff prime.lua > prime.patch

El contenido del archivo es exactamente el mismo que el que se envió al terminal.

[ Download the free Bash shell scripting cheat sheet to keep the basics close at hand. ]

Crear un parche con diff

Una vez que tenga un archivo de parche con todos mis cambios, puedo enviárselo para que lo revise y, opcionalmente, aplicarlo a su archivo anterior. Te aplicas un parche con el patch pedido:

$ patch prime.lua prime.patch

Se agregaron líneas, se restaron líneas y, al final, terminas con un archivo idéntico a mi versión:

$ cat prime.lua
function prime(num)
  if num<2 or num%2 == 0 and not num == 2 then
    return false
  end
  return true
end

num=0

while ( num >= 0 ) do
   if prime(num) then
      print(num .. " is prime")
   end
   num=num+1
end

Ahora puede agregar y confirmar la nueva versión, y la "solicitud de combinación" está satisfecha, ¡sin alojamiento Git externo a la vista!

Dif y Git

No hay límite para la cantidad de veces que puede parchear un archivo. Puede iterar a través de los cambios, generar nuevas correcciones y enviarlas a colaboradores y gerentes. El envío de cambios en lugar de resultados finales permite a cada colaborador revisar lo que se ha cambiado, decidir qué quiere aceptar o rechazar y aplicar los cambios fácilmente.

Artículos de interés

Subir