¿Puedo especificar varios files en un command de confirmación de git que ya se han organizado?

Tengo muchos files que ya están agregados al índice, pero me gustaría comprometer solo algunos de ellos AT FIRST porque la herramienta de revisión funciona en commits. Si simplemente hago un commit de git, creo que obtendré TODOS los files. Creo que puedo: git commit file1 file2 file3 y si esto es cierto, me gustaría poder almacenar una larga list de files en el file y especificar esto como input para el command de confirmación. Alternativamente, me gustaría poder comprometerme muchas veces con una única identificación de confirmación. No quiero borrar algunos files porque hay cientos de files en el índice, solo algunos de los cuales son importantes para revisar.

¿Hay alguna manera segura de forzar esto? Una vez hecho esto, me comprometo a get los files restantes, si es posible.

EDITAR: En pocas palabras, sí, puede especificar algún subset de files en etapas, una confirmación parcial. Pero en el caso de una fusión que causó que muchos files cambiaran y se organizaran, y solo algunos de los cuales deseaba que se confirmaran (el rest más adelante), no se puede hacer; Git no permitirá una confirmación parcial durante una combinación. Si estoy equivocado, estoy seguro de que alguien me avisará.

EDITAR: Intenté la solución "xargs" (como lo sugirió Edmundo) y obtuve el error: fatal: no se puede hacer una confirmación parcial durante una fusión.

Si tiene la list en un file, puede usar xargs para que se pasen como parameters de la confirmación de git: cat file-of-files.txt | xargs git commit -m "Here's a few files to be committed" cat file-of-files.txt | xargs git commit -m "Here's a few files to be committed"

Creo que puedo hacer: git commit file1 file2 file3

Sí, pero debes entender que git ignorará los trozos instalados y comprometerá estos files por completo. Esto es importante si organizó partes de files usando git add -p .

Alternativamente, me gustaría poder comprometerme muchas veces con una única identificación de confirmación.

Imposible. Cada vez que modifica una confirmación, su ID SHA-1 cambia. Pero si utiliza gerrit para revisión, no importa: gerrit agrega su propia identificación para enviar un post en el primer compromiso para vincular el compromiso modificado a la misma revisión; no elimine esta identificación cuando ammending the commit.

Como tanto Phd como Edmundo respondieron, sí, puedes hacer esto, pero debes ser consciente de cómo Git realmente hace commits.

La configuration normal y estándar para Git es que hay tres copys de cada file asociado con la confirmación actual:

 HEAD index work-tree ----- ----- --------- file1 file1 file1 file2 file2 file2 : : : fileN fileN fileN 

La copy en la confirmación ( HEAD ) es de solo lectura: nunca se puede cambiar. La copy en el índice es de lectura / escritura, pero almacenada en un formatting especial solo de Git. La copy en el tree de trabajo es de lectura / escritura y se almacena en la forma diaria normal que su computadora utiliza para los files.

Cuando ejecuta git add , Git copy la versión de tree de trabajo de un file en el índice. Digamos que cambiaste un poco el file2 :

 HEAD index work-tree ----- ----- --------- file1 file1 file1 file2 file2 file2* : : : fileN fileN fileN 

El asterisco aquí significa que el contenido de esta versión del file2 es diferente.

Al ejecutar git add file2 copy el file2 del tree de trabajo en el índice:

 HEAD index work-tree ----- ----- --------- file1 file1 file1 file2 file2* file2* : : : fileN fileN fileN 

(Aparte: tenga en count que la ejecución de git reset file2 copy el file2 de HEAD en el índice, eliminando el cambio del índice y dejándolo en el tree de trabajo).

Cuando ejecuta un git commit común, Git empaqueta todo lo que está en el índice ahora mismo y hace la nueva confirmación usando esos files. Entonces, si ha modificado el file2 , luego copydo el nuevo file en el índice, luego ejecute git commit , obtendrá el file modificado2 en el nuevo commit. El file1 no modificado, el file3 , …, el fileN también entran en el nuevo compromiso.

Cuando ejecutas, por ejemplo, git commit file1 file2 , Git hace algo especial.

Comprometerse con arguments de files hace un índice adicional temporal

Hagamos un cambio en el file file3 pero no git add todavía.

 HEAD index work-tree ----- ----- --------- file1 file1 file1 file2 file2* file2* file3 file3 file3* : : : fileN fileN fileN 

Si ejecuta git commit file3 ahora, por ejemplo, Git comienza copyndo algo en un índice temporal.

Hay varias cosas que Git podría copyr con sensatez aquí, para get el punto de partida para el índice temporal. Lo que realmente usa depende de los arguments del indicador:

  • git commit --include file3 : Git copy el índice existente en el índice temporal. Esto le proporciona file1 , file2* , file3 , y así sucesivamente. Tenga en count que obtenemos el nuevo file2 aquí, no el anterior.

  • git commit --only file3 : Git copy el compromiso HEAD al índice temporal. Esto le proporciona el file1 , el file2 , el file3 , y así sucesivamente. Tenga en count que obtenemos el file anterior (HEAD-version) file2 aquí.

Luego, Git agrega los files listdos en la línea de command. Esto reemplaza el file3 del índice temporal3 con el file3* .

Ahora Git realiza la confirmación, utilizando el índice temporal.

Por último, Git copy algunas cosas del índice temporal en el índice regular (ordinario). Específicamente, copy todos los files que listó en la command-line, por lo que file3* entra en el índice normal.

Archivos parcialmente escalonados

A lo que se refiere phd es al uso de git add -p , git reset -p , o la capacidad de hacerlo:

 $ make-change-to file2 $ git add file2 $ make-different-change-to file2 

Ahora tienes algo que podríamos describir como:

 HEAD index work-tree ----- ----- --------- file1 file1 file1 file2 file2* file2† : : : fileN fileN fileN 

Es decir, ahora hay tres versiones diferentes de file2 activas, todas al mismo time: la versión HEAD original no modificada, la primera versión modificada almacenada en el índice y la segunda versión modificada almacenada en el tree de trabajo.

Si git commit file2 , Git creará un nuevo índice temporal, copyrá la versión file2† del tree de trabajo en ese índice temporal, confirmará desde el índice temporal y luego copyrá el file file2† temporal file2† sobre el file file2* normal . El efecto es que pierdes la versión intermedia por completo.