¿Cómo hacer commit de líneas especificas de un archivo?

En nuestro trabajo diario como desarrolladores, modificamos archivos y los almacenamos de manera ordenada en commits que identifican claramente los cambios, en lugar de realizar una sola confirmación con el título varios cambios.

Diseño web
8 minutos
Hace 6 años
¿Cómo hacer commit de líneas especificas de un archivo?

¡Accede a cientos de cursos
con solo un pago al año!

Blog Microbanner

En nuestro trabajo diario como desarrolladores, modificamos archivos y los almacenamos de manera ordenada en commits que identifican claramente los cambios, en lugar de realizar una sola confirmación con el título varios cambios.

Pero, qué ocurre si realizamos varios cambios en un mismo archivo que deben corresponder a commits diferentes?

Supongamos que tenemos un archivo inicial llamado main.go como este:

1package main 2 3import "fmt" 4 5func main() { 6 fmt.Println("Hola EDteam") 7 fmt.Println("Hola Comunidad") 8 fmt.Println("Hola team") 9} 10

Luego realizamos tres cambios:

  • Agregamos una nueva línea al inicio de la función main.
  • Eliminamos el saludo a la comunidad.
  • Agregamos un mensaje de despedida.
1package main 2 3import "fmt" 4 5func main() { 6 fmt.Println("Agregamos esta nueva línea") 7 fmt.Println("Hola EDteam") 8 fmt.Println("Hola team") 9 fmt.Println("Hasta pronto") 10} 11

Pero no queremos crear un commit con los 3 cambios, en su lugar queremos crear un commit para cada uno, así que podemos agregar el flag -p o --path del comando git add para hacerlo:

Ejecutamos el comando git add -p main.go y git nos muestra una salida como esta:

1diff --git a/main.go b/main.go 2index 67d8ba2..cdcfdc0 100644 3--- a/main.go 4+++ b/main.go 5@@ -3,7 +3,8 @@ package main 6 import "fmt" 7 8 func main() { 9+ fmt.Println("Agregamos esta nueva línea ") 10 fmt.Println("Hola EDteam") 11- fmt.Println("Hola Comunidad") 12 fmt.Println("Hola team") 13+ fmt.Println("Hasta pronto") 14 } 15Stage this hunk [y,n,q,a,d,s,e,?]? 16

En donde nos pregunta qué hacer con el fragmento de código, para ello debemos especificar alguna de las opciones que el comando provee, te listo las más usadas pero si quieres conocer más puedes pasar la opción ?.

  • y: Incluir al área de preparación el fragmento.
  • n: No incluir al área de preparación el fragmento.
  • q: Salir, No incluir al área de preparación el fragmento actual o cualquiera de los restantes.
  • a : Agregar este fragmento al área de preparación y todos los restantes.
  • s : Dividir el fragmento actual en fragmentos más pequeños.
  • e : Editar manualmente el fragmento actual.

En nuestro ejemplo git nos establece todo nuestros cambios como un único fragmento, pasamos la opción s para dividirlo en partes más pequeñas, en este caso será divido en 3 partes, luego git nos preguntará qué hacer con cada fragmento, al primer fragmento le indicaremos la opción y para agregarlo al área de preparación.

1Split into 3 hunks. 2@@ -3,4 +3,5 @@ 3 import "fmt" 4 5 func main() { 6+ fmt.Println("Agregamos esta nueva línea ") 7 fmt.Println("Hola EDteam") 8Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? y 9

Y a los dos fragmentos siguientes la opción n para excluirlos.

1@@ -6,3 +7,2 @@ 2 fmt.Println("Hola EDteam") 3- fmt.Println("Hola Comunidad") 4 fmt.Println("Hola team") 5Stage this hunk [y,n,q,a,d,K,j,J,g,/,e,?]? n 6 7@@ -8,2 +8,3 @@ 8 fmt.Println("Hola team") 9+ fmt.Println("Hasta pronto") 10 } 11Stage this hunk [y,n,q,a,d,K,g,/,e,?]? n 12

De esta manera agregamos solamente la primera línea de la función main, ahora podemos confirmar nuestro primer cambio git commit -m 'Agrega una nueva línea al inicio de la función'

Para agregar nuestro segundo cambio realizamos el mismo proceso:

  • git add -p main.go
  • Indicamos la opción s para separar el fragmento, git lo dividirá en dos partes, así que agregamos el fragmento actual con la opción y
1Split into 2 hunks. 2@@ -5,5 +5,4 @@ 3 func main() { 4 fmt.Println("Agregamos esta nueva línea ") 5 fmt.Println("Hola EDteam") 6- fmt.Println("Hola Comunidad") 7 fmt.Println("Hola team") 8Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? y 9
  • descartamos el siguiente con la opción n.
1@@ -9,2 +8,3 @@ 2 fmt.Println("Hola team") 3+ fmt.Println("Hasta pronto") 4 } 5Stage this hunk [y,n,q,a,d,K,g,/,e,?]? n 6
  • Confirmamos el segundo cambio: git commit -m 'Elimina el saludo de la comunidad'

Finalmente confirmamos directamente el último cambio git commit -a -m 'Agrega mensaje de despedida'

Comentarios de los usuarios