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 30 líneas que se han cambiado en un archivo?
git
git-commit
freddiefujiwara
fuente
fuente

git gui=git add -e>git add -i -p; en términos de conveniencia:git gui>git add -i -p>git add -e. Entonces: elijagit guicuando tenga acceso a X. elijagit add -i -pcosas simples y cuando no tenga o quiera usar X.git add -epara una puesta en escena compleja sin X.Respuestas:
Puede usar
git add --patch <filename>(o-ppara abreviar), y git comenzará a dividir su archivo en lo que cree que son "trozos" razonables (partes del archivo). Luego le indicará esta pregunta:Aquí hay una descripción de cada opción:
Si el archivo aún no está en el repositorio, primero puede hacerlo
git add -N <filename>. Después puedes continuargit add -p <filename>.Después, puedes usar:
git diff --stagedpara comprobar que realizaste los cambios correctosgit reset -ppara desentrañar trozos añadidos por errorgit commit -vpara ver su confirmación mientras edita el mensaje de confirmación.Tenga en cuenta que esto es muy diferente al
git format-patchcomando, cuyo propósito es analizar los datos de confirmación en un.patcharchivo.Referencia para el futuro: Git Tools - Puesta en escena interactiva
fuente
-p/--patches un acceso directo a la acción del parche dentro del-i/--interactivecomando que inicia el modo interactivo útil .git diffhace.e, puede editar el trozo manualmente reemplazando+o-por#git pushdice ya actualizado. y si lo hago,git diffveo a los tíos que le dijen. si lo hago,git diff --stagedveo el commit que quiero presionar. Suponiendo que puedo empujar el commit, ¿cómo elimino los trozos que dijeno?Puede usar
git add --interactiveo , y luego ( no ); vea Modo interactivo en la página de manual de git-add , o simplemente siga las instrucciones.git add -p <file>git commitgit commit -aModern Git también tiene
git commit --interactive(ygit commit --patch, que es la opción de acceso directo a parche en confirmación interactiva).Si prefiere hacerlo desde la GUI, puede usar git-gui . Simplemente puede marcar 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.fuente
git gui proporciona esta funcionalidad en la vista de diferencias. Simplemente haga clic con el botón derecho en la (s) línea (s) que le interese y debería ver un elemento de menú "organizar esta línea para confirmar".
fuente
gitk, pero se incluye con Git Bash para Windows; debe tener una entrada de menú de inicio o puede iniciarlo con el comandogit gui. También haystage this hunkcuál es probablemente más útil questage this line. Puede ser nuevo ya que esta respuesta fue creada hace 10 años.Creo que esa
git add -e myfilees la forma más fácil (mi preferencia al menos) ya que simplemente abre un editor de texto y le permite elegir qué línea desea poner en escena y qué línea no. En cuanto a los comandos de edición:contenido agregado:
contenido eliminado:
contenido modificado:
Todos los detalles sobre
git addestán disponibles engit --help addfuente
-ees--edit.git --help addsmodo de parche interactivo.git add -e) * no * cambia el contenido del archivo en el disco. Simplemente mueve parte de los cambios de unstaged a staged (index).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 agregar líneas o trozos al índice usando los comandos clásicos de vim diff comodp. Guarde las modificaciones en el índice y confirme con:Gcommit, y ya está.Muy buenas presentaciones introductorias aquí (ver especialmente la parte 2 ).
fuente
:diffget/:diffputen modo visual, donde puedo elegir líneas específicas, que quiero restablecer / confirmar. Entonces, asegúrate de nuevo: vim es increíble.Recomiendo encarecidamente usar SourceTree de Atlassian. (Es gratis.) Hace que esto sea trivial. Puede organizar trozos de código individuales o líneas de código individuales rápida y fácilmente.
fuente
Vale la pena señalar que para usar
git add --patchpara un nuevo archivo , primero debe agregar el archivo para indexar congit add --intent-to-add:fuente
Cuando tenga muchos cambios y termine creando algunas confirmaciones a partir de los cambios, entonces quiero guardar mi punto de partida temporalmente antes de organizar las cosas.
Me gusta esto:
La respuesta de Whymarrh es lo que suelo hacer, excepto que a veces hay muchos cambios y puedo decir que podría cometer un error al organizar las cosas, y quiero un estado comprometido al que pueda recurrir para un segundo pase.
fuente
Si usa emacs, eche un vistazo a Magit , que proporciona una interfaz git para emacs. Es compatible con la organización de trozos (partes de archivos) bastante bien.
fuente
Intellij IDEA (y supongo que todos los demás productos de la serie) ha incorporado soporte para confirmaciones parciales desde v2018.1
fuente
Para aquellos que usan extensiones Git :
En la ventana Confirmar, seleccione el archivo que desea confirmar parcialmente, luego seleccione el texto que desea confirmar en el panel derecho, luego haga clic derecho en la selección y elija 'Etapa de líneas seleccionadas' en el menú contextual.
fuente
smuy útil para organizar rápidamente partes de archivos para una confirmación.Al igual que la respuesta de jdsumsion, también puede esconder su trabajo actual, pero luego usar una herramienta difftool como meld para extraer los cambios seleccionados del alijo. De esa manera, incluso puede editar los trozos manualmente de manera muy fácil, lo que es un poco molesto cuando está en
git add -p:El uso del método de ocultación le brinda la oportunidad de probar, si su código aún funciona, antes de confirmarlo.
fuente
git commit --amend, parece que no puede abrir el alijo después, ¿o hay alguna forma de hacerlo?Agregando una respuesta anterior, si prefiere usar la línea de comando, ingresar
git add -e myfilele da la opción de elegir línea por línea lo que desea confirmar porque este comando abrirá un editor con las diferencias, así:Como puede saber, las líneas que comienzan con
+son adiciones, las líneas que comienzan con-son eliminaciones. Entonces:-con espacio.Esto es lo que
git add -hdice acerca de agregar archivos de esta manera (parchear archivos):Precaución: no cambie el contenido del archivo, este no es un buen lugar para hacerlo. Simplemente cambie los operadores de las líneas eliminadas o agregadas.
fuente
El complemento vim-gitgutter puede organizar a los trozos sin salir del editor vim usando
Además de esto, proporciona otras características interesantes como una columna de signo de diferencia como en algunos IDE modernos
Si solo una parte del trozo se escenificara vim-fugitiva
permite la selección del rango visual en ese momento
:'<,'>diffputo:'<,'>diffgetpara organizar / revertir cambios de línea individuales.fuente
Probé
git add -p filename.x, pero en una Mac, encontré que gitx ( http://gitx.frim.nl/ o https://github.com/pieter/gitx ) es mucho más fácil de comprometer exactamente las líneas que quería.fuente
Con TortoiseGit:
fuente
Han pasado 10 años desde que se hizo esta pregunta. Y espero que esta respuesta sea útil para alguien. Como se menciona en la respuesta aquí , donde GUI no es una opción, la extensión de crecord de Andrew Shadura ayuda a abrir una ventana ncurses en la que podemos seleccionar las líneas para confirmar.
Configure la extensión de la siguiente manera:
cd a su repositorio git e invocarlo de la siguiente manera:
Esto abriría la interfaz ncurses que se puede usar como se muestra a continuación. Al presionar las siguientes teclas en la ventana ncurses se realizarán ciertas acciones:
Screencast que muestra un uso de muestra
fuente
Para los usuarios de Atom , el paquete github incluye puesta en escena interactiva, al estilo de
git gui. Para accesos directos, consulte la documentación del paquete .El uso de Atom permite trabajar con un tema que tiene un fondo oscuro (de forma predeterminada,
git guitiene un fondo blanco).fuente
Para emacs también hay gitsum
fuente
git-meld-index - citando del sitio web:
git-meld-index ejecuta meld, o cualquier otro git difftool (kdiff3, difuso, etc.), para permitirle organizar de manera interactiva los cambios en el índice git (también conocido como el área de preparación de git).
Esto es similar a la funcionalidad de git add -p y git add --interactive. En algunos casos, meld es más fácil / rápido de usar que git add -p. Esto se debe a que meld te permite, por ejemplo:
Uso
En un repositorio de git, ejecute:
Verás meld (o tu git difftool configurado) emergente con:
IZQUIERDA : directorio temporal que continúa archivos copiados de su árbol de trabajo
DERECHA : directorio temporal con el contenido del índice. Esto también incluye archivos que aún no están en el índice pero que están modificados o no se encuentran en la copia de trabajo; en este caso, verá el contenido del archivo de HEAD.
Edite el índice (lado derecho) hasta que esté satisfecho. Recuerde guardar cuando sea necesario.
Cuando haya terminado, cierre meld, y git-meld-index actualizará el índice para que coincida con el contenido del directorio temporal en el lado derecho de meld que acaba de editar.
fuente
Si está en la
Windowsplataforma, en mi opinióngit guies una herramienta muy buena parastage/commitpocas líneas delunstagedarchivo1. Hunk sabio:
unstagged ChangessecciónStage Hunk for commit2. Línea sabia:
unstagged ChangessecciónStage Lines for commit3. Si desea organizar el archivo completo excepto un par de líneas:
unstagged ChangessecciónCtrl+T (Stage file to commit)Staged ChangesSecciónUnStage Lines for commitfuente
Como muestra una respuesta anterior, puede usar
git add --patch filename.txto la forma corta
git add -p filename.txt... pero para los archivos que ya están en su repositorio, existe una mejor opción para usar s --patch flag en el comando commit directamente (si está utilizando una versión de git lo suficientemente reciente):
git commit --patch filename.txt... o, de nuevo, la forma corta
git commit -p filename.txt... y luego usando las teclas mencionadas, (s / n, etc.), para elegir las líneas que se incluirán en la confirmación.
fuente
git add -p filename.txt" además de menos margen de error? Si estropea el cambio de archivo parcial, deshacer un complemento es mejor que deshacer una confirmación.git-cola es una gran GUI y también tiene esta característica incorporada. Simplemente seleccione las líneas para escenificar y presione S. Si no se realiza ninguna selección, se organiza el trozo completo.
fuente