Pregunta Comprometer solo una parte de un archivo en Git


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

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


2237
2017-07-06 02:25


origen


Respuestas:


Puedes usar git add --patch <filename> (o -p para abreviar), y git comenzará a descomponer su archivo en lo que cree que son "trozos" sensibles (porciones del archivo). Luego le preguntará con 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 organizar este trozo para el próximo compromiso
  • norte no organices este trozo para el siguiente compromiso
  • q dejar; no organices este trozo o cualquiera de los trozos restantes
  • un poner en escena este trozo y todos los trozos posteriores en el archivo
  • re no organices este trozo o cualquiera de los trozos posteriores en el archivo
  • gramo selecciona 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 dejar este pedazo indeciso, ver siguiente trozo
  • k deja este pedazo indeciso, mira trozo indeciso anterior
  • K dejar este pedazo indeciso, ver trozo anterior
  • s dividir el trozo actual en trozos más pequeños
  • mi editar manualmente el trozo actual
  • ? imprimir ayuda hunk

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

Luego, puede usar:
git diff --staged para verificar que realizó cambios correctos
git reset -p para eliminar trozos erróneamente agregados
git commit -v para ver su confirmación mientras edita el mensaje de confirmación.

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

Referencia para el futuro: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging


2931
2017-07-06 11:49



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

Modern Git también tiene git commit --interactive (y git commit --patch, que es una opción de acceso directo a parche en confirmación interactiva).

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


215
2017-07-06 02:41



git gui proporciona esta funcionalidad bajo la vista diff. Simplemente haga clic con el botón derecho en la (s) línea (s) que le interesa (n) y debería ver una opción de menú "configurar esta etapa para comprometerse".


115
2017-09-25 20:45



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 deseas representar y qué línea no. En cuanto a los comandos de edición:

contenido agregado:

El contenido agregado se representa con líneas que comienzan con "+". Puede evitar la creación de cualquier línea de adición eliminándolas.

contenido eliminado

El contenido eliminado se representa mediante líneas que comienzan con "-". Puede evitar la eliminación de etapas convirtiendo "-" a "" (espacio).

contenido modificado:

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

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


55
2018-02-23 10:37



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 :Gdiff, y luego agrega líneas o trozos al índice usando los comandos clásicos de vim diff como dp. Guarde las modificaciones en el índice y comprométase con :Gcommit, y tu estas listo.

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


41
2017-08-12 13:32



Recomiendo encarecidamente usar SourceTree de Atlassian. (Es gratis.) Hace que esto sea trivial. Puede organizar trozos individuales de código o líneas de código individuales de forma rápida y fácil.

enter image description here


26
2017-12-05 17:29



Vale la pena señalar que para usar git add --patch para archivo nuevo primero debe agregar el archivo para indexar con git add --intent-to-add:

git add -N file
git add -p file

20
2018-06-06 22:14