Un comando con el que todos estamos familiarizados es git add. Cuando nos iniciamos en el uso de git, este es de los que no faltan en las recetas que podemos en ver en cualquier tutorial. Es de los primeros que empezamos a utilizar cuando aprendemos git ¡En el libro de git de Scott Chacon aparece en la sección 2.2!
Es una pieza fundamental del flujo básico de git ya que es el comando que mueve al índice las modificaciones que hayamos realizado. El índice es un snapshot del contenido del área de trabajo en un momento dado. Este snapshot es el que posteriormente se convertirá en un commit.
La receta de git add
La forma más habitual de invocar el comando git-add es:
$ git add .
Este comando añade al índice cualquier fichero nuevo o que haya sido modificado:
$ git add .
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: app/assets/javascripts/home.js.coffee
# new file: app/assets/stylesheets/home.css.scss
# new file: app/controllers/home_controller.rb
# new file: app/helpers/home_helper.rb
# new file: app/views/home/.erb
# modified: config/database.yml
# modified: config/routes.rb
# new file: test/functional/home_controller_test.rb
# new file: test/unit/helpers/home_helper_test.rb
#
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: app/assets/images/rails.png
Sin embargo, los ficheros borrados no se actualizan en el índice. En este caso, tendríamos que ejecutar el comando git rm app/assets/images/rails.png:
$ git rm app/assets/images/rails.png rm 'app/assets/images/rails.png' $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: app/assets/images/rails.png # new file: app/assets/javascripts/home.js.coffee # new file: app/assets/stylesheets/home.css.scss # new file: app/controllers/home_controller.rb # new file: app/helpers/home_helper.rb # new file: app/views/home/.erb # modified: config/database.yml # modified: config/routes.rb # new file: test/functional/home_controller_test.rb # new file: test/unit/helpers/home_helper_test.rb #
Las opciones -u y -A del comando git-add añaden al índice los ficheros eliminados, aunque gestionan de manera diferente los ficheros nuevos. Veamoslo usando este mismo ejemplo.
git-add -u
Partimos de la siguiente área de trabajo:
$ git status # On branch master # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: app/assets/images/rails.png # modified: config/routes.rb # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # app/assets/javascripts/home.js.coffee # app/assets/stylesheets/home.css.scss # app/controllers/home_controller.rb # app/helpers/home_helper.rb # app/views/home/ # test/functional/home_controller_test.rb # test/unit/helpers/ no changes added to commit (use "git add" and/or "git commit -a")
La opción -u sólo añade al índice aquellos ficheros que ya estén siendo monitorizados por git, así que en este caso, únicamente se subirán al índice rails.png y routes.rb:
$ git add -u $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: app/assets/images/rails.png # modified: config/routes.rb # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # app/assets/javascripts/home.js.coffee # app/assets/stylesheets/home.css.scss # app/controllers/home_controller.rb # app/helpers/home_helper.rb # app/views/home/ # test/functional/home_controller_test.rb # test/unit/helpers/
La opción -u acepta un patrón de búsqueda. Si este patrón está vacío, el resultado es que se actualicen todos los ficheros borrados o modificados en el área de trabajo. Si el patrón no está vacío, sólo se actualizarán en el índice los ficheros que encajen con el patrón. En el siguiente ejemplo, ejecutamos el mismo comando para añadir únicamente los ficheros de la carpeta config:
$ git add -u config/* $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: config/routes.rb # # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: app/assets/images/rails.png # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # app/assets/javascripts/home.js.coffee # app/assets/stylesheets/home.css.scss # app/controllers/home_controller.rb # app/helpers/home_helper.rb # app/views/home/ # test/functional/home_controller_test.rb # test/unit/helpers/
git-add -a
Esta opción funciona como la opción -u añadiendo también a la búsqueda los ficheros del área de trabajo. El resultado es que los ficheros que no estén siendo monitorizados también se añadirán al índice.
Partimos de la siguiente situación:
$ git status # On branch master # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: app/assets/images/rails.png # modified: config/routes.rb # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # app/assets/javascripts/home.js.coffee # app/assets/stylesheets/home.css.scss # app/controllers/home_controller.rb # app/helpers/home_helper.rb # app/views/home/ # test/functional/home_controller_test.rb # test/unit/helpers/ no changes added to commit (use "git add" and/or "git commit -a")
Al ejecutar el comando git add -A, se añadirán al índice los ficheros borrados, los modificados y los nuevos:
$ git add -A $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: app/assets/images/rails.png # new file: app/assets/javascripts/home.js.coffee # new file: app/assets/stylesheets/home.css.scss # new file: app/controllers/home_controller.rb # new file: app/helpers/home_helper.rb # new file: app/views/home/.erb # modified: config/routes.rb # new file: test/functional/home_controller_test.rb # new file: test/unit/helpers/home_helper_test.rb
Al igual que la opción -u, esta opción también acepta un patrón. En el siguiente ejemplo, actualizamos el índice con las modificaciones, ficheros nuevos y ficheros borrados sólo de la carpeta app/assets:
$ git add -A app/assets $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: app/assets/images/rails.png # new file: app/assets/javascripts/home.js.coffee # new file: app/assets/stylesheets/home.css.scss # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: config/routes.rb # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # app/controllers/home_controller.rb # app/helpers/home_helper.rb # app/views/home/ # test/functional/home_controller_test.rb # test/unit/helpers/
git-add -n
Esta opción es muy práctica ya que nos mostrará en pantalla lo que el comando git-add haría sin actualizar el índice. Continuando con el comando anterior (git add -A app/assets) si quisiésemos ver qué ficheros se actualizarán en el índice sin realmente actualizarlos, haríamos los siguiente:
$ git add -n -A app/assets remove 'app/assets/images/rails.png' add 'app/assets/javascripts/home.js.coffee' add 'app/assets/stylesheets/home.css.scss'
Resumen
Hemos visto tres opciones del comando git-add: -u, -A y -n. Las dos primeras nos permiten actualizar en el índice directamente ficheros borrados sin necesidad de ejecutar el comando git-rm. La última opción, -n, simula lo que hará el comando git-add sin realmente actualizar el índice. Los tres son opciones útiles que de haberlas conocido cuando empecé con git hace años me habrían ahorrado unos cuantos comandos.
yo suelo usar:
git add -all
La verdad que hay un buen grupo de opciones disponibles…
Saludos.
Gracias por el aporte.
Pingback: Tutorial de Git. Manual básico con ejemplos - Diego C Martín