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

Introducción

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

Estamos trabajando en una rama de trabajo, y queremos cambiar a la principal para hacer un pull, pero … no quermos perder o descartar los cambios, ¿qué hacer? Existen soluciones usar git stash o en IntelliJ hacer un shelf, pero cómo dice el título y si quiero almacenar TODOS los cambios que hay en el working tree en un fichero, un parche.

Procedimiento: Prueba de concepto

Vamos a crear un repositorio vacio. En este se creará un fichero fichero1.txt vacio. Se añadirá al git index y se hará un commit.

❯ git init
Initialized empty Git repository in C:/path/to/demoGit/.git/

❯ notepad fichero1.txt
❯ git add .
❯ git commit -m "commit 1"
[master (root-commit) 035a95f] commit 1
 1 file changed, 2 insertions(+)
 create mode 100644 fichero1.txt

A continuación se crearán dos ficheros: fichero2.txt y fichero3.txt. El working tree se queda con el primer fichero modificado y los siguientes marcados como ?? porqué no han sido añadidos al stagging area.

❯ notepad fichero2.txt
❯ notepad fichero3.txt
❯ git show HEAD
Author: XXXXXXXXX 
Date:   Wed Jul 19 16:37:05 2023 +0200

diff --git a/fichero1.txt b/fichero1.txt
new file mode 100644
index 0000000..139597f
--- /dev/null
+++ b/fichero1.txt
@@ -0,0 +1,2 @@
+
+
❯ git status -s
 M fichero1.txt
?? fichero2.txt
?? fichero3.txt

Llegados a este punto es cuando queremos hacer el parche. Podemos usar el comando git diff > miparche.patch pero en este caso, sólo añadirá al parche fichero1.txt porqué los otros dos no están en el index, debemos añadir los ficheros
al stagging y usar la opcion --cached, para ver “las diferencias reales” con el commit anterior. Al terminar podemos descartar los cambios con git reset.

❯ git add .
❯ git status -s
M  fichero1.txt
A  fichero2.txt
A  fichero3.txt
❯ git diff --cached > miparche.patch
❯ git reset
Unstaged changes after reset:
M       fichero1.txt
❯ git status -s
 M fichero1.txt
?? fichero2.txt
?? fichero3.txt
?? miparche.patch

El primer git status nos muestra el estado “real” del working tree, el segundo de cómo debemos dejarlo para hacer el parche como queremos.

Resultado

El contenido del parche queda así:


diff --git a/fichero1.txt b/fichero1.txt
index 139597f..c280f49 100644
--- a/fichero1.txt
+++ b/fichero1.txt
@@ -1,2 +1 @@
-
-
+Este es el ficherto 1
\ No newline at end of file
diff --git a/fichero2.txt b/fichero2.txt
new file mode 100644
index 0000000..f4a2e78
--- /dev/null
+++ b/fichero2.txt
@@ -0,0 +1 @@
+Este es el ficherto 2
\ No newline at end of file
diff --git a/fichero3.txt b/fichero3.txt
new file mode 100644
index 0000000..26d3cb2
--- /dev/null
+++ b/fichero3.txt
@@ -0,0 +1 @@
+Este es el ficherto 3
\ No newline at end of file

Espero que el ejemplo sea claro y pueda resultar de ayuda.

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.