GIT Cómo hacer un parche de un commit(s) dado

Introducción

Relacionado: GIT: Cómo hacer un parche con los cambios actuales

El caso en esta entrada puede ser conocido por muchos usurios veteranos de git y por los nóveles que no hayan conocido cómo solucionarlo.

En nuestro trabajo diario, tenemos que compartir uno o varios cambios que están en el histórico de git o en una rama local de trabajo y queremos compartir esos combios ya sea como solución a un problema o para pasarle una tarea a un compañero o lo que sea, ¿cómo lo hacemos?

Procedimiento

En nuestro caso de prueba tenemos un sencillo proyecto Java que ha sufrido los siguientes cambios:

λ git log --oneline --decorate --stat
1acfa11 (HEAD -> master) Añado Greeter a main()
my-app/src/main/java/com/mycompany/app/App.java | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
6390003 Añado README y CHANGELOG
CHANGELOG.txt | 1 +
README.txt | 1 +
2 files changed, 2 insertions(+)
a1026ac Añado el saludo y el test
my-app/src/main/java/com/mycompany/app/Greeter.java | 8 ++++++++
my-app/src/test/java/com/mycompany/app/GreeterTest.java | 17 +++++++++++++++++
2 files changed, 25 insertions(+)
0b9b666 Proyecto creado
my-app/pom.xml | 75 ++++++++++++++++++++++
my-app/src/main/java/com/mycompany/app/App.java | 13 ++++
.../src/test/java/com/mycompany/app/AppTest.java | 20 ++++++
3 files changed, 108 insertions(+)
3f1a831 Commit inicial
.gitignore | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)

Para el caso que nos ocupa, he resaltado el commit con id “a1026ac” que añade dos ficheros, un POJO y un test.

La forma de obtener un parche que incluya los cambios de este commit es:

λ git format-patch -1 a1026ac
0001-A-ado-el-saludo-y-el-test.patch

Que genera el siguiente fichero (0001-A-ado-el-saludo-y-el-test.patch) de parche (en realidad es un diff de git):

From a1026acd8163159a3702c8f79c148c672beaaaba Mon Sep 17 00:00:00 2001
From: Jose PEREZ <XXXXXXX@XXXXXXXXXX.com>
Date: Tue, 12 Dec 2023 11:27:44 +0100
Subject: [PATCH] =?UTF-8?q?A=C3=B1ado=20el=20saludo=20y=20el=20test?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
.../main/java/com/mycompany/app/Greeter.java | 8 ++++++++
.../java/com/mycompany/app/GreeterTest.java | 17 +++++++++++++++++
2 files changed, 25 insertions(+)
create mode 100644 my-app/src/main/java/com/mycompany/app/Greeter.java
create mode 100644 my-app/src/test/java/com/mycompany/app/GreeterTest.java

diff --git a/my-app/src/main/java/com/mycompany/app/Greeter.java b/my-app/src/main/java/com/mycompany/app/Greeter.java
new file mode 100644
index 0000000..a17c7f1
--- /dev/null
+++ b/my-app/src/main/java/com/mycompany/app/Greeter.java
@@ -0,0 +1,8 @@
+package com.mycompany.app;
+
+public class HelloWorld {
+ public static void main(String[] args) {
+ Greeter greeter = new Greeter();
+ System.out.println(greeter.sayHello());
+ }
+}
diff --git a/my-app/src/test/java/com/mycompany/app/GreeterTest.java b/my-app/src/test/java/com/mycompany/app/GreeterTest.java
new file mode 100644
index 0000000..b9b87f0
--- /dev/null
+++ b/my-app/src/test/java/com/mycompany/app/GreeterTest.java
@@ -0,0 +1,17 @@
+package com.mycompany.app;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class GreeterTest {
+
+ private Greeter greeter = new Greeter();
+
+ @Test
+ public void greeterSaysHello() {
+ assertThat(greeter.sayHello(), containsString("Hello"));
+ }
+
+}
--
2.29.1.windows.1

De esta forma podemos compartir sólo los cambios en estos dos ficheros en ese commit dado.

¿Qué es la opción -1 y pasa si usamos otro valor?

Ese -1 indica cuantos parches generamos a partir de un commit dado. En nuestro ejemplo -1 indica que desde el commit a1026ac sólo queremos un parche, y genera un único parche. Si desde ese commit queremos un parche para los 3 commits anteriores ejecutamos:

λ git format-patch -3 a1026ac
0001-Commit-inicial.patch
0002-Proyecto-creado.patch
0003-A-ado-el-saludo-y-el-test.patch

Que nos crea los 3 ficheros de parche para cada commit en orden del mas antiguo hasta el commit indicado (que será el 003). De este modo podemos aplicar los parches en orden.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

This site uses Akismet to reduce spam. Learn how your comment data is processed.