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.