1

Uso avanzado de Git

En este punto tu ya tienes que saber hacer algunas cosas “básicas” que te permitirán ver el historial de commits, hacer commits y regresar del Repository al Working directory y viceversa. En este tutorial te explicare un poco de las cosas avanzadas como:

  • Deshacer cambios
  • Mover y borrar archivos

Entonces, lo único que necesitas es haber inicializado un repositorio en Git y estar en tu carpeta, una vez allí necesitas tener un archivo .txt o .php o lo que tu gustes para que podamos hacer el ejercicio. En mi caso yo tengo un archivo .php que se llama hola y tiene el siguiente contenido:

	// The build-in name is "Mundo"
        $nombre = isset($argv[1]) ? $argv[1] : "Mundo";
        @print "Hola {$nombre} \n";

Si no sabes de php no te preocupes (yo tampoco), esto solo es para que no te pierdas en los ejemplos y ejercicios que vamos a hacer en esta clase, ya que la clase o el tutorial es de Git, no de php.

Deshaciendo cambios antes de la fase de staging
Vamos a ir a la rama master y vamos a modificar el comentario que esta en el archivo hola.php, tu puedes modificar cualquier cosa de tu archivo, eso no importa.

$ git checkout master
Previous HEAD position was 3283e0d... Se añade un parámetro por defecto
Switched to branch 'master'
$ # Modificamos hola.php
$ cat hola.php
<?php
// Este comentario está mal y hay que borrarlo
$nombre = isset($argv[1]) ? $argv[1] : "Mundo";@print"Hola, {$nombre}\n";
$ git status
# On branch master# Changes not staged for commit:# (use "git add <file>..." to update what will be committed)# (use "git checkout -- <file>..." to discard changes in working direct
ory)
## modified: hola.php#
no changes added to commit (use "git add"and/or"git commit -a")

El mismo Git nos indica que debemos hacer para añadir los cambios o para deshacerlos.

$ git checkout hola.php
$ git status
# On branch master
nothing to commit, working directory clean
$ cat hola.php
<?php// El nombre por defecto es Mundo
$nombre = isset($argv[1]) ? $argv[1] : "Mundo";
@print"Hola, {$nombre}\n";

Deshaciendo cambios antes del commit
Vamos a hacerlo mismo quela vez anterior, pero esta vez sí añadiremos el cambio al stag (sin hacer commit).

$ # Modificamos hola.php
$ cat hola.php
<?php// Este comentario está mal y hay que borrarlo
$nombre = isset($argv[1]) ? $argv[1] : "Mundo";
@print"Hola, {$nombre}\n";
$ git add hola.php
$ git status
# On branch master# Changes to be committed:# (use "git reset HEAD <file>..." to unstage)## modified: hola.php#

De nuevo, Git nos indica que debemos hacer para deshacer el cambio almacenado en el stag

$ git resetHEAD hola.php
Unstaged changes afterreset:
M hola.php
$ git status
# On branch master
# Changes not staged forcommit:
# (use"git add <file>..."toupdate what will be committed)
# (use"git checkout -- <file>..."to discard changes in working direct
ory)
#
# modified: hola.php
#
no changes added tocommit (use"git add"and/or"git commit -a")
$ git checkout hola.php

Y ya tenemos nuestro repositorio limpio otra vez. Checa el estado del repositorio con el comando git status

Deshaciendo commits no deseados
Si a pesar de todo hemos hecho un commit y nos hemos equivocado, podemos deshacerlo con la orden git revert. Modificamos otra vez el archivo como antes pero ahora sí hacemos commit:

$ # Modificamos hola.php
$ cat hola.php
<?php
// Este comentario está mal y hay que borrarlo$nombre = isset($argv[1]) ? $argv[1] : "Mundo";
@print"Hola, {$nombre}\n";
$ git add hola.php
$ git commit -m"Ups... este commit está mal."
master 5a5d067] Ups... este commit está mal
1 file changed, 1 insertion(+), 1 deletion(-)

Crear un reverting commit

$ git revert HEAD --no-edit
[master 817407b] Revert "Ups... este commit está mal"
1 file changed, 1 insertion(+), 1 deletion(-)
$ git log --pretty=tformat:'%h %ad | %s%d [%an]' --graph --date=short
* 817407b 2013-06-16 | Revert "Ups... este commit está mal" (HEAD, maste
r) [Sergio Gómez]
* 5a5d067 2013-06-16 | Ups... este commit está mal [Sergio Gómez]* fd4da94 2013-06-16 | Se añade un comentario al cambio del valor por def
ecto (tag: v1) [Sergio Gómez]
* 3283e0d 2013-06-16 | Se añade un parámetro por defecto (tag: v1-beta)
[Sergio Gómez]
* efc252e 2013-06-16 | Parametrización del programa [Sergio Gómez]* e19f2c1 2013-06-16 | Creación del proyecto [Sergio Gómez]

Borrar commits de una rama
En el apartado anterior se revierte el commit pero se queda en el historial, para evitar eso usamos el comando reset, el cual funciona de la siguiente manera

$ git reset--hard v1HEADisnowat fd4da94 Se añade un comentario al cambio del valor por def
ecto
$ git log--pretty=tformat:'%h %ad | %s%d [%an]' --graph --date=short
* fd4da94 2013-06-16 | Se añade un comentario al cambio del valor por def
ecto (HEAD, tag: v1, master) [Sergio Góme
* 3283e0d 2013-06-16 | Se añade un parámetro por defecto (tag: v1-beta)
[Sergio Gómez]
* efc252e 2013-06-16 | Parametrización del programa [Sergio Gómez]
* e19f2c1 2013-06-16 | Creación del proyecto [Sergio Gómez]

Modificar un commit
Esto se usa cuando hemos olvidado añadir un cambio a un commit que acabamos de realizar

$ cat hola.php
<?php
// Autor: Sergio Gómez
// El nombre por defecto es Mundo
$nombre = isset($argv[1]) ? $argv[1] : "Mundo";
@print "Hola, {$nombre}\n";
$ git commit -a -m "Añadido el autor del programa"
[master cf405c1] Añadido el autor del programa
1 file changed, 1 insertion(+)

El parámetro -a hace un git add antes de hacer commit de todos los archivos modificados o borrados (de los nuevos no), con lo que nos ahorramos un paso. Ahora nos percatamos que se nos ha olvidado poner el correo electrónico.

$ cat hola.php
<?php
// Autor: Sergio Gómez <[email protected]>// El nombre por defecto es Mundo$nombre = isset($argv[1]) ? $argv[1] : "Mundo";
@print"Hola, {$nombre}\n";
$ git add hola.php
$ git commit --amend -m"Añadido el autor del programa y su email"
[master 96a39df] Añadido el autor del programa y su email
1 file changed, 1 insertion(+)
$ git log --pretty=tformat:'%h %ad | %s%d [%an]' --graph --date=short
* 96a39df 2013-06-16 | Añadido el autor del programa y su email (HEAD, ma
ster) [Sergio Gómez]
* fd4da94 2013-06-16 | Se añade un comentario al cambio del valor por def
ecto (tag: v1) [Sergio Gómez]
* 3283e0d 2013-06-16 | Se añade un parámetro por defecto (tag: v1-beta)
[Sergio Gómez]
* efc252e 2013-06-16 | Parametrización del programa [Sergio Gómez]* e19f2c1 2013-06-16 | Creación del proyecto [Sergio Gómez]

Moviendo y borrando archivos
Para mover archivos usaremos la orden git mv:

$ mkdir lib
$ git mv hola.php lib
$ git status
# On branch master# Changes to be committed:# (use "git reset HEAD <file>..." to unstage)## renamed: hola.php -> lib/hola.php#

Mover y borrar archivos

Otra forma de hacer lo mismo:

$ mkdir lib
$ mv hola.php lib
$ git add lib/hola.php
$ git rm hola.php

Y ya podemos guardar los cambios

$ git commit -m "Movido hola.php a lib."
[master 8c2a509] Movido hola.php a lib.1 file changed, 0 insertions(+), 0 deletions(-)
rename hola.php => lib/hola.php (100%)
Escribe tu comentario
+ 2