2011-02-02 24 views
39

git status muestra un grupo de archivos que se modificaron y otros que se eliminaron. Primero quiero confirmar los archivos modificados y luego los eliminados. No veo ninguna opción en git add que me permita hacer esto. ¿Cómo puedo hacerlo?¿Cómo comprometer solo archivos modificados (y no nuevos o eliminados)?

EDITAR: Como se ha señalado, git add no habría efectuado los archivos borrados de todos modos, por lo harían git add .. Pero tiene el efecto secundario de incluir archivos que no fueron rastreados, lo cual también me gustaría evitar. He cambiado el título de la pregunta en consecuencia.

Respuesta

58

El siguiente comando debe hacer el truco:

git commit -a 

o

git commit -am "commit message" 

Del libro Pro Git:

Proporcionar la opción -a para el comando git commit hace Git Coloque automáticamente cada archivo que ya esté rastreado antes de realizar la confirmación

+0

¿Hay alguna desventaja en el uso de indicadores mutliple para agregar mensajes también? por ejemplo, git commit -am "archivos actualizados" – sayth

+1

@sayth, en este caso, no hay inconvenientes. Se trata de una cuestión de preferencias; es posible que desee utilizar un editor de texto para escribir mensajes de compromiso. – tokarev

+3

Esto no responde la pregunta. El -a incluirá ambos archivos: modificado y eliminado. Esto está completamente mal y debería ser eliminado. –

3

puedo estar perdiendo algo, pero git add no incluye los archivos borrados, usted tiene que usar git rm para eliminar los:

mkdir git-test 
cd git-test 
git init 
touch a 
touch b 
touch c 
git add . 
git commit -m "Initial" 
echo "a" > a 
echo "b" > b 
rm c 
git status 

# On branch master 
# Changed but not updated: 
# (use "git add/rm <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: a 
#  modified: b 
#  deleted: c 
# 

git add . 

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: a 
#  modified: b 
# 
# Changed but not updated: 
# (use "git add/rm <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  deleted: c 
# 

git commit -m "Changed" 
git status 

# On branch master 
# Changed but not updated: 
# (use "git add/rm <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  deleted: c 
# 

git rm c 
git commit -m "Deleted" 

Y el registro de git muestra tres confirmaciones.

+0

Tienes razón en que 'git add' no habría organizado los archivos eliminados (siendo muy nuevo en git, aún no lo sabía, gracias). Pero 'git add .' parece agregar archivos sin seguimiento, que es algo que me gustaría evitar, por lo que la respuesta' xargs' aún tiene cierta utilidad. –

+0

¿Todavía quieres agregar esos archivos sin seguir? De lo contrario, podría agregarlos al archivo .gitignore. – Makis

+0

No sabía nada sobre .gitignore, gracias. Mi necesidad actual es simplemente organizar las confirmaciones para que realmente reflejen una operación atómica (por ejemplo, "error fijo" se separa de "función añadida"), por lo que estos archivos se comprometerán en algún momento en el futuro. –

0

Me gustaría tener cuidado con el uso de git commit -a - a menos que esté seguro de que su archivo .gitignore tiene todos los archivos que usted NO quiere agregó que

he utilizado git commit -a muchas veces en las zonas donde este no era el caso, y llegó a tener que limpiar/eliminar archivos temporales, etc. desde el repositorio git

+2

No, no es 'git commit -a' quien hizo esto. 'git commit -a-does * not * agrega nuevos archivos, solo confirma todos los cambios en los archivos ya rastreados. Probablemente ejecutaste 'git add .' para terminar en esta situación. –

13

que puede usar:

git add -u 

a la etapa ya rastreados archivos que han sido modificados desde el último commit.

Desde la página git-add hombre:

-u
--update

coincidir sólo en contra ya rastreados archivos en el índice en lugar del árbol de trabajo. Esto significa que nunca creará nuevos archivos, sino que creará nuevos contenidos modificados de los archivos rastreados y eliminará los archivos del índice si se eliminaron los archivos correspondientes en el árbol de trabajo. Si no se especifica, por defecto es "."; en otras palabras, actualice todos los archivos rastreados en el directorio actual y sus subdirectorios.

No estoy seguro de cuándo se ha agregado esta característica.

+0

'git add'' 'commit' files ?! –

+0

@AlexisWilke No, pero agregará archivos al área de preparación, lo que los preparará para comprometerse con una nueva confirmación en su rama actualmente desprotegida. Tendrá que confirmar los cambios por etapas con 'git commit' después. –

+2

'git add -u; git commit' es esencialmente equivalente a 'git commit -a'. Confirmará la eliminación del archivo, por lo que no responde la pregunta. –

Cuestiones relacionadas