Confirmar solo una parte de los cambios de un archivo en Git

9 minutos de lectura

avatar de usuario de freddiefujiwara
freddiefujiwara

Cuando realizo cambios en un archivo en Git, ¿cómo puedo confirmar solo algunos de los cambios?

Por ejemplo, ¿cómo podría confirmar solo 15 líneas de las 30 que se han modificado en un archivo?

  • stackoverflow.com/q/34609924/52074 relacionado: si necesita dividir un trozo en trozos más pequeños.

    – Trevor Boyd Smith

    31 de octubre de 2018 a las 14:56

  • Resumen: en términos de capacidad: git gui = git add -e > git add -i -p; en términos de conveniencia: git gui > git add -i -p > git add -e. Entonces: elige git gui cuando tenga acceso a X. elija git add -i -p para cosas simples y cuando no tiene o no quiere usar X. git add -e para puesta en escena compleja sin X.

    – Penghe Geng

    5 de julio de 2019 a las 16:08


Puedes usar:

git add --patch <filename>

o para abreviar:

git add -p <filename>

Git dividirá su archivo en lo que considere “trozos” sensatos (porciones del archivo). A continuación, le hará esta pregunta:

Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

Aquí hay una descripción de cada opción:

  • y prepara este trozo para el próximo compromiso
  • norte no pongas en escena este trozo para el próximo compromiso
  • q abandonar; no pongas en escena este trozo ni ninguno de los trozos restantes
  • a presente este pedazo y todos los pedazos posteriores en el archivo
  • d no ponga en escena este fragmento ni ninguno de los fragmentos posteriores del archivo
  • gramo seleccione un trozo para ir a
  • / buscar un trozo que coincida con la expresión regular dada
  • j deja este trozo indeciso, mira el siguiente trozo indeciso
  • j deja este trozo indeciso, mira el siguiente trozo
  • k dejar este trozo indeciso, ver trozo indeciso anterior
  • k dejar este trozo indeciso, ver trozo anterior
  • s dividir el trozo actual en trozos más pequeños
  • mi editar manualmente el trozo actual
    • Luego puede editar el trozo manualmente reemplazando +/- por # (gracias veksen)
  • ? imprimir trozo de ayuda

Si el archivo aún no está en el repositorio, primero puede hacer git add -N <filename>. Después puedes continuar con git add -p <filename>.

Posteriormente, puede utilizar:

  • git diff --staged para verificar que realizó los cambios correctos
  • git reset -p para quitar el escenario de hunks agregados por error
  • git commit -v para ver su confirmación mientras edita el mensaje de confirmación.

Tenga en cuenta que esto es muy diferente a la git format-patch comando, cuyo propósito es analizar los datos de confirmación en un .patch archivos

Referencia para el futuro: Herramientas de Git: puesta en escena interactiva

  • Puede ser útil tener en cuenta que -p/--patch es un acceso directo a la acción de parche dentro del -i/--interactive comando que inicia el útil Modo interactivo.

    – tutuDajuju

    15 de febrero de 2015 a las 9:30

  • > ¿Qué sucede si ese archivo ya está preparado? Solo mostrará los cambios no preparados. Igual que git diff lo hace.

    – Eugen Konkov

    3 de junio de 2015 a las 9:52

  • ¿Cómo puedo editar el trozo actual manualmente? No sé qué hacer después de escribir e.

    – Hunsu

    1 de noviembre de 2015 a las 13:47

  • Después de presionar ePuede editar el trozo manualmente reemplazando + o - por #

    – veksen

    24/11/2015 a las 20:31

  • hmm… cuando lo haga git commit file compromete todo, no solo los cambios específicos que quería (aunque git diff --staged mostró solo los cambios específicos que quería) editar: git commit -p le permitirá seleccionar los “trozos” y confirmar de una sola vez; y solo confirma los cambios específicos

    – Rafael

    9 mayo 2019 a las 10:40


Avatar de usuario de Jakub Narębski
Jakub Narębski

Puedes usar git add --interactive o git add -p <file>y entonces git commit (no git commit -a); ver Modo interactivo en git-añadir página de manual, o simplemente siga las instrucciones.

Git moderno también tiene git commit --interactive (y git commit --patchque es un acceso directo a la opción de parche en la confirmación interactiva).

Si prefiere hacerlo desde la GUI, puede usar git-gui. Simplemente puede marcar fragmentos que desea incluir en la confirmación. Personalmente, lo encuentro más fácil que usar git add -i. Otras GUI de git, como QGit o GitX, también pueden tener esta funcionalidad.

  • Curiosamente, windows.github.com tenía soporte para confirmaciones de archivos parciales, pero parece haberlo dejado recientemente.

    – Jurí

    01/09/2014 a las 20:41

  • @Juri Creo que el soporte para confirmaciones de archivos parciales está de vuelta.

    – Ela782

    24 de febrero de 2015 a las 10:40

  • @Juri De nada. De hecho, nunca me di cuenta de que había estado allí antes. Lo vi la semana pasada y pensé “¡oh, qué característica nueva tan asombrosa!”. 🙂

    – Ela782

    24 de febrero de 2015 a las 17:25

  • Hoy en día, windows.github.com redirige al GitHub Desktop renombrado, que es mejor que la GUI de Git y admite confirmaciones parciales… pero no admite la firma de confirmaciones. Suspiro.

    usuario4942583

    2 de febrero de 2018 a las 0:37

  • @user4942583: Hace un año se agregó la firma de confirmación de GPG a GitHub Desktop.

    – Kaios

    5 de mayo a las 15:36

Avatar de usuario de Ionuț G. Stan
Ionus G. Stan

interfaz gráfica de usuario git proporciona esta funcionalidad en la vista de diferencias. Simplemente haga clic con el botón derecho en la(s) línea(s) que le interesan y debería ver un elemento de menú “preparar esta línea para confirmar”.

  • para parches complejos, este suele ser el enfoque más rápido para mí.

    – hohl

    8 de abril de 2015 a las 7:35

  • Esta es una forma muy eficiente e intuitiva de agregar cambios al área de preparación de manera detallada. También se pueden seleccionar varias líneas y se agregarán todos los cambios dentro de esa selección.

    – Jox

    26 de abril de 2015 a las 23:13

  • Tenga en cuenta que esto no es gitk, pero se incluye con Git Bash para Windows; debe tener una entrada en el menú de inicio para ello o puede iniciarlo con el comando git gui. También hay stage this hunk que es probablemente más útil que stage this line. Podría ser nuevo ya que esta respuesta se creó hace 10 años.

    – Chris

    26 de noviembre de 2019 a las 16:37


  • Eso es lo que estaba buscando 🙂

    – Sigue así

    18 de diciembre de 2020 a las 9:24

  • También parece ser el único software con esta capacidad, que es compatible con Linux :/

    – kdb

    22 de noviembre de 2021 a las 10:29

Avatar de usuario de theFreedomBanana
lalibertadbanana

Yo creo eso git add -e myfile es la forma más fácil (al menos mi preferencia) ya que simplemente abre un editor de texto y te permite elegir qué línea quieres poner en escena y qué línea no. En cuanto a los comandos de edición:

contenido añadido:

El contenido agregado está representado por líneas que comienzan con “+”. Puede evitar la puesta en escena de líneas adicionales eliminándolas.

contenido eliminado:

El contenido eliminado se representa mediante líneas que comienzan con “-“. Puede evitar organizar su eliminación convirtiendo el “-” en un ” ” (espacio).

contenido modificado:

El contenido modificado se representa con líneas “-” (que eliminan el contenido anterior) seguidas de líneas “+” (que agregan el contenido de reemplazo). Puede evitar la modificación por etapas convirtiendo las líneas “-” en ” ” y eliminando las líneas “+”. Tenga en cuenta que es probable que modificar solo la mitad del par introduzca cambios confusos en el índice.

Todos los detalles sobre git add están disponibles en git --help add

Avatar de usuario de Wenfang Du
Wenfang du

Si estás usando VS Code, estás de suerte. Seleccione el rango que desea organizar, luego use Git: Stage Selected Ranges para ponerlos en escena y comprometerse si lo desea.

Grabé un gif para demostrar lo que quise decir:

ingrese la descripción de la imagen aquí

  • ¿Hay un comando git correspondiente a esto? ¿Agregar línea por línea, en lugar de la generación automática de fragmentos?

    – decir y codificar

    13 de agosto a las 9:24

  • @sayandcode Puede probar esto, pero creo que la GUI es más conveniente en este caso :).

    – Wenfang Du

    14 de agosto a las 2:31

Avatar de usuario de François
francois

Si está utilizando vim, es posible que desee probar el excelente complemento llamado fugitivo.

Puede ver la diferencia de un archivo entre la copia de trabajo y el índice con :Gdiffy luego agregue líneas o fragmentos al índice usando los comandos clásicos de vim diff como dp. Guarde las modificaciones en el índice y confirme con :Gcommity tu estas listo.

Muy buenos screencasts introductorios. aquí (ver esp. parte 2).

  • ¿Hay un comando git correspondiente a esto? ¿Agregar línea por línea, en lugar de la generación automática de fragmentos?

    – decir y codificar

    13 de agosto a las 9:24

  • @sayandcode Puede probar esto, pero creo que la GUI es más conveniente en este caso :).

    – Wenfang Du

    14 de agosto a las 2:31

Avatar de usuario de Bob Stein
bob stein

Recomiendo encarecidamente usar Árbol de origen de Atlassian. (Es gratis). Hace que esto sea trivial. Puede organizar fragmentos de código individuales o líneas de código individuales de forma rápida y sencilla.

ingrese la descripción de la imagen aquí

  • Estoy de acuerdo en que SourceTree es una buena herramienta para este propósito, porque le brinda un control más detallado que el que es posible a través de la línea de comandos.

    usuario456814

    12 de agosto de 2014 a las 14:29

  • @cupcake Yo diría lo contrario, dado que SourceTree probablemente usa esos ejecutables de git de línea de comando, inherentemente siempre será posible realizar las mismas (o más) acciones detalladas a través de la “línea de comando”.

    – tutuDajuju

    15 de febrero de 2015 a las 9:25

  • Independientemente de la de grano fino argumento que recomiendo encarecidamente Árbol de origen ya que escenificar piezas y líneas individuales es muy fácil: i.imgur.com/85bNu4C.png

    –Michal Stefanow

    1 de junio de 2015 a las 10:57

  • ¿Qué pasa si parte del “trozo” que no quieres poner en escena? Por ejemplo, solo quiero confirmar las líneas 50-100, pero no la 1-50, pero SourceTree ve la línea 1-100 como un “trozo”.

    – Sol

    29/03/2016 a las 20:58

  • @Sun, puede hacer clic en la línea 50 y cambiar + hacer clic en la línea 100 y luego en el escenario. Puede organizar fácilmente la línea 50-100 en Sourcetree 🙂

    – Código Mono123

    17 de diciembre de 2018 a las 12:14

¿Ha sido útil esta solución?