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 gui
cuando tenga acceso a X. elijagit add -i -p
cosas simples y cuando no tenga o quiera usar X.git add -e
para una puesta en escena compleja sin X.Respuestas:
Puede usar
git add --patch <filename>
(o-p
para 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 --staged
para comprobar que realizaste los cambios correctosgit reset -p
para desentrañar trozos añadidos por errorgit commit -v
para ver su confirmación mientras edita el mensaje de confirmación.Tenga en cuenta que esto es muy diferente al
git format-patch
comando, cuyo propósito es analizar los datos de confirmación en un.patch
archivo.Referencia para el futuro: Git Tools - Puesta en escena interactiva
fuente
-p/--patch
es un acceso directo a la acción del parche dentro del-i/--interactive
comando que inicia el modo interactivo útil .git diff
hace.e
, puede editar el trozo manualmente reemplazando+
o-
por#
git push
dice ya actualizado. y si lo hago,git diff
veo a los tíos que le dijen
. si lo hago,git diff --staged
veo el commit que quiero presionar. Suponiendo que puedo empujar el commit, ¿cómo elimino los trozos que dijeno
?Puede usar
git add --interactive
o , 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 commit
git commit -a
Modern 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 hunk
cuá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 myfile
es 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 add
están disponibles engit --help add
fuente
-e
es--edit
.git --help add
s
modo 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/:diffput
en 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 --patch
para 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
s
muy ú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 myfile
le 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 -h
dice 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
:'<,'>diffput
o:'<,'>diffget
para 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 gui
tiene 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
Windows
plataforma, en mi opinióngit gui
es una herramienta muy buena parastage
/commit
pocas líneas delunstaged
archivo1. Hunk sabio:
unstagged Changes
secciónStage Hunk for commit
2. Línea sabia:
unstagged Changes
secciónStage Lines for commit
3. Si desea organizar el archivo completo excepto un par de líneas:
unstagged Changes
secciónCtrl+T (Stage file to commit)
Staged Changes
SecciónUnStage Lines for commit
fuente
Como muestra una respuesta anterior, puede usar
git add --patch filename.txt
o 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