You are on page 1of 8

C:\Users\kali\.

gitconfig

##Tutorial GIT

###Empezando
Lo primero que hay que hacer cuando te instalas GIT es establecer el nombre de
usuario y direccin de correo electrnico. Esto es importante porque en cada commit
de GIT utiliza esta informacin. Si usamos la lnea de comandos de git, estos
seran los comandos: (El `$` no hay que teclearlo, es el smbolo del sistema del
cliente git)

$ git config --global user.name "Juan Antonio Tubio"


$ git config --global user.email jatubio@gmail.com

Por ejemplo, si necesitas saber la configuracin que tienes, puedes usar el comando
siguiente:

$ git config --list

Cuyo resultado puedes ser parecido a este:

core.symlinks=false
core.autocrlf=true
color.diff=auto
color.status=auto
color.branch=auto
help.format=html
user.name=Juan Antonio Tubio
user.email=jatubio@gmail.com
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly

>Si usas un programa grfico Git, puedes configurar estos parmetros en el men
**Options** u **Opciones**.

###Ayuda de git.
Puedes obtener ayuda sobre un comando usando: `git help comando`.

###Zonas en un repositorio GIT

Cuando estamos trabajando en ficheros que estn dentro de un respositorio GIT,


existen en todo momento tres zonas o reas:

* **Repositorio GIT** (HEAD)


(En algunos programas se le llama **HEAD**)
Es la 'base de datos' propia de GIT. Es decir, dnde estn almacenadas todo el
historial y todas las versiones de nuestros ficheros.

* **ndice** (Index o Staged Files)


(En algunos programas se le llama **Index** y en otros **Staged Files**)
Es la zona de 'preparacin' o zona temporal para almacenar en el **Repositorio
GIT** o **HEAD**. Cuando hagamos un **commit**, se almacenar nicamente lo que
haya en esta zona.

* **rea o Zona de Trabajo** (Working Tree o Unstaged Files)


(En algunos programas se le llama **Working Tree** y en otros **Unstaged Files**)
Es la zona en la que estn nuestros ficheros fuentes con todas sus modificaciones
actuales.

###Flujo de estados por los que pasa un fichero en un repositorio

Vamos a ver el flujo de estados y 'zonas' por las que pasa un fichero cuando lo
aadimos a un proyecto que est en un repositorio Git.

**1.** Vamos a crear un nuevo repositorio llamado `Pruebas_Git`.


Desde un programa grfico Git, vamos a la opcin: **Create**, **New** o **Nuevo**,
indicamos el directorio donde queremos que se cree el repositorio (por ejemplo
`c:\pruebas_git`) y, si nos pregunta por un bookmark o nombre, ponemos escribir
`Pruebas_Git`.

Si usamos la lnea de comandos de git, estos seran los comandos:


$ mkdir Pruebas_Git
$ cd Pruebas_Git
$ git init

Con esto, se ha creado una carpeta `.git` dentro de la carpeta `Pruebas_Git`. En


esa carpeta se almacenar todo el __Repositorio__ o __Base de datos__ de git.

**2.** Vamos a aadir nuestro primer fichero: `hola_mundo.php`

Con nuestro editor preferido, creamos el fichero: `hola_mundo.php` dentro de la


carpeta de nuestro proyecto con el siguiente contenido

<html>
<head>
<title>Prueba de PHP</title>
</head>
<body>
<?php echo '<p>Hola Mundo</p>'; ?>
</body>
</html>

El estado de este fichero ahora mismo es: **Untracked** o **Not tracked**.


> Ese estado quiere decir que este fichero no est siendo guardado en el
repositorio en este momento y que, por tanto, no hay copias ni versiones de este
fichero en el repositorio.

Ahora mismo, el fichero `hola_mundo.php` slo existe en la zona **Zona de


Trabajo**.

**3.** Preparamos el fichero para aadirlo al repositorio.

Desde el programa grfico Git, seleccionamos el archivo y vamos a la opcin


**Stage** o **Add*.

Si usamos la lnea de comandos de git, estos seran los comandos:


$ git add hola_mundo.php

El estado del fichero pasa a ser: **Added** o **Staged**.


> Ese estado quiere decir que los cambios en este fichero sern almacenados en el
respositorio junto con todo su historial y versiones.

El fichero `hola_mundo.php` existe ya en dos zonas, en la zona **Zona de Trabajo**


y en el **ndice**. Y, en estos momentos ambas copias son idnticas.
Pero, an no hemos guardado nuestro fichero en el repositorio.

**4.** Aadimos el fichero al repositorio.

Desde el programa grfico Git, vamos a la opcin **Commit**. Y nos preguntar por
el mensaje del **commit**.

Cada **commit** es una 'versin', 'foto' o 'snapshot' de nuestro cdigo fuente. (En
este caso, nicamente de nuestro primer fichero `hola_mundo.php`). Y para
distinguir cada 'foto', podemos aadir un mensaje explicando en qu momento hicimos
esa foto o qu tiene esa foto de particular. Por ejemplo, podemos escribir:
'Aadido el fichero `hola_mundo.php` al repositorio'.

Si usamos la lnea de comandos de git, estos seran los comandos:

$ git commit -m "Aadido el fichero hola_mundo.php al repositorio"

El estado del fichero pasa a ser: **Unchanged** o **Committed**, y si usas un


programa grfico Git, es posible que el fichero haya desaparecido de la pantalla.
Ya que slo suelen mostrar los ficheros que han tenido cambios desde la ltima vez
que se aadieron al repositorio.
> Ese estado quiere decir que la copia actual del fichero est almacenada en el
respositorio y no ha habido cambios desde entonces.

El fichero `hola_mundo.php` existe ahora en las tres zonas del repositorio: En la


zona **Zona de Trabajo**, en el **ndice** y en el **Repositorio**. Y las tres
copias son idnticas.

**5.** Modificamos el fichero.

Vamos a editar el fichero `hola_mundo.php`, para que el ttulo de la pgina html


sea tambin 'Hola Mundo':
<html>
<head>
<title>Hola Mundo</title>
</head>
<body>
<?php echo '<p>Hola Mundo</p>'; ?>
</body>
</html>

Automticamente el estado del fichero pasa a ser: **Modified** o **Unstaged**.


> Ese estado quiere decir que un fichero que est includo en el repositorio ha
sido modificado y esas modificaciones no han sido includas en el repositorio ni lo
sern en el prximo **commit**.

Seguimos teniendo tres versiones del fichero `hola_mundo.php`: Las versiones en el


**ndice** y en el **Repositorio** no se han modificado y son copias idnticas. Y
en la zona **Zona de Trabajo**, est el fichero con esta nueva modificacin.

**6.** Preparamos el fichero para aadirlo al repositorio.

Desde el programa grfico Git, vamos a la opcin **Stage**.

Si usamos la lnea de comandos de git, este sera el comando:

$ git add hola_mundo.php


El estado del fichero pasa a ser: **Added** o **Staged**.
> Que como vimos anteriormente, quiere decir que est preparado para almacenarse en
el respositorio con el prximo **commit*

Seguimos teniendo tres versiones del fichero `hola_mundo.php`: Ahora la versin en


el **Repositorio** an no se ha modificado. Y las versiones en la zona **Zona de
Trabajo** y en **ndice** son copias idnticas con esta nueva modificacin.

**7.** Creamos un nuevo fichero.


Antes de hacer el **commit** del fichero `hola_mundo.php`, vamos a crear un segundo
fichero. Para ser originales, lo llamaremos: `adios_mundo.php`.

<html>
<head>
<title>Adios Mundo</title>
</head>
<body>
<?php echo '<p>Adios Mundo</p>'; ?>
</body>
</html>

Estos son los estados de cada fichero y el contenido de las zonas de trabajo:
Fichero `hola_mundo.php`: **Added* o **Staged**
Fichero `adios_mundo.php`: **Untracked** o **Not tracked**.

Zona **Zona de Trabajo**:


Fichero `hola_mundo.php`: Con el cambio en el Title.
Fichero `adios_mundo.php`

Zona **ndice**:
Fichero `hola_mundo.php`: Con el cambio en el Title. (Copia idntica a la de la
**Zona de Trabajo**)

Zona **Repositorio**:
Fichero `hola_mundo.php`: __Sin__ el cambio en el Title.

**8.** Hacemos un commit.

$ git commit -m "hola_mundo.php, cambios en el Title"

Estos son los estados de cada fichero y el contenido de las zonas de trabajo:
Fichero `hola_mundo.php`: **Unchanged** o **Committed**
Fichero `adios_mundo.php`: **Untracked** o **Not tracked**.

Zona **Zona de Trabajo**:


Fichero `hola_mundo.php`: Con el cambio en el Title.
Fichero `adios_mundo.php`

Zona **ndice**:
Fichero `hola_mundo.php`: Con el cambio en el Title. (Copia idntica a la de la
**Zona de Trabajo**)

Zona **Repositorio**:
Fichero `hola_mundo.php`: Con el cambio en el Title. (Copia idntica a la de la
**Zona de Trabajo**)

**9.** Preparamos el segundo fichero para aadirlo al repositorio:

$ git add adios_mundo.php


**10.** Modificamos ambos ficheros:

Vamos a modificar ambos ficheros de modo que queden as:

Fichero `hola_mundo.php`:
<html>
<head>
<title>Hola Mundo</title>
</head>
<body>
<?php echo '<p>Hola Mundo</p>'; ?>
<br />
Hola Universo.
</body>
</html>

Fichero `adios_mundo.php`:

<html>
<head>
<title>Hasta pronto Mundo</title>
</head>
<body>
<?php echo '<p>Adios Mundo</p>'; ?>
<br />
<br />
<hr>
Nos veremos pronto.
</body>
</html>

Y vamos a probar un nuevo comando: `git status`


$ git status
On branch master
Changes to be committed:
new file: adios_mundo.php

Changes not staged for commit:

modified: adios_mundo.php
modified: hola_mundo.php

Estos son los estados de cada fichero y el contenido de las zonas de trabajo:
Fichero `hola_mundo.php`: **Modified** o **Unstaged**.
Fichero `adios_mundo.php`: **Added Modified** o **Staged Modified**.

Zona **Zona de Trabajo**:


Fichero `hola_mundo.php`: Con los ltimos cambios.
Fichero `adios_mundo.php`: Con los ltimos cambios.

Zona **ndice**:
Fichero `hola_mundo.php`: Con el cambio en el Title. (Copia idntica a la de la
**Zona de Trabajo**)
Fichero `adios_mundo.php`: Con la versin inicial.

Zona **Repositorio**:
Fichero `hola_mundo.php`: Con el cambio en el Title. (Copia idntica a la de la
**Zona de Trabajo**)
> Si ahora hiciramos un **commit** slo se almacenaran en el repositorio, las
versiones de ambos ficheros que se encuentran en el **ndice**.

Podemos aadir todos los cambios actuales al ndice con este comando:
$ git add .

(O en el programa grfico, seleccionando ambos ficheros y usando la opcin **Add**


o **Stage**)

Qu pasa si no queremos aadir todos los cambios en los ficheros y slo queremos
hacer commit de algunos cambios? Por ejemplo, no queremos aadir el cambio en el
'Title' del fichero `adios_mundo.php`.

Desde un programa grfico Git, seleccionamos ese archivo y segn el programa habr
varios modos de hacerlo. Por ejemplo:

En el programa **Source Tree**, cada bloque que haya cambiado se nos presentar
como un **hunk**, y podremos hacer **Stage hunk** o **Unstage hunk** para aadir o
quitar cada bloque de la zona **ndice**. Con ambas opciones, las copias en las
zonas **Zona de Trabajo** y **Repositorio** no se ven afectadas. nicamente se
modifica la copia de la zona **ndice**.

Si lo que queremos es deshacer el cambio de uno de los bloques en el fichero,


porque nos hemos confundido, tenemos la opcin **Discard Hunk** que en este caso
modifica la copia en la zona **Zona de Trabajo** y, por tanto, nuestro fichero
fsico. Y, por supuesto, si ese **hunk** se haba pasado tambin al **ndice**,
tambin se modificar esa copia borrando el bloque seleccionado.

Si queremos ir al detalle y hacer **stage**, **unstage** o **discard** de algunas


lneas en lugar de bloques completos, podemos seleccionar las lneas y el botn nos
permitir hacer esas operaciones nicamente con las lneas seleccionadas.

En el programa **Smart Git**, la opcin es **Index Editor** y nos presentar una


ventana con las tres zonas y las versiones del fichero en cada zona. Podremos
movernos entre los cambios en cada una de las versiones, e ir pasando los cambios
que queramos entre zonas, e incluso, modificar manualmente cualquiera de las tres
versiones o copias. Despus habr que pulsar **Save** para que los cambios que
hayamos hecho se graben en las zonas correspondientes. En la opcin *view* puedes
configurar qu zonas quieres ver en el **Index Editor**.

> **Nota:** Si quisiramos recuperar la versin inicial del fichero


`adios_mundo.php`, con el 'Title' 'Adios Mundo', no podramos hacerlo. Ya que
aunque habamos pasado esa versin al **ndice** con el primer `add
adios_mundo.php`, cuando hicimos un `git add .` sin hacer un `commit`, sustitumos
la versin que haba en el **ndice** con la de la **Zona de Trabajo** y perdimos,
por tanto, cualquier cambio que tuviramos en el **ndice**.

**11.** 'Limpiando' el **ndice**:

Es preferible que los commits sean bastante 'modulares' e independientes entre s.


Por eso, vamos a hacer dos commits, uno para aadir el nuevo fichero
`adios_mundo.php` y otro para aadir los cambios a `hola_mundo.php`.

Vamos a 'resetear' o 'limpiar' los cambios en el **ndice**:

$ git reset HEAD

(Desde un programa grfico Git, usaramos la opcin **Unstage** o **Unstage from


index**).
> Veremos ms adelante qu significa `HEAD`.

Y ahora, vamos a hacer ambos commits. El primero:

$ git add adios_mundo.php


$ git commit -m "nuevo fichero: adios_mundo.php"

Y, para el segundo, lo vamos a hacer en una sola operacin con el comando:


$ git commit -a -m "hola_mundo.php, nuevas lineas"

para que git recuerde la contrasea


$ git config credential.helper store
$ git push https://github.com/repo.git
Username for 'https://github.com': <username>
Password for 'https://USERNAME@github.com ...

###Rename files
http://www.patrick-wied.at/blog/rename-files-and-folders-with-git
http://push.cwcon.org/learn/change-file-names.html

**OPTIONS**

-f
\--force
:

Force renaming or moving of a file even if the target exists

-k
:

Skip move or rename actions which would lead to an error condition. An error
happens when a source is neither existing nor controlled by Git, or when it would
overwrite an existing file unless _-f_ is given.

-n
\--dry-run
:

Do nothing; only show what would happen

-v
\--verbose
:

Report the names of files as they are moved.

http://grimoire.ca/git/config
http://stackoverflow.com/questions/6515582/what-should-go-in-a-default-git-config-
file

[alias]
b = branch
ci = commit
co = checkout
cob = checkout -b
d = diff
l = log
lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s
%Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
lga = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s
%Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative --branches
st = status
fixup = !sh -c 'git commit -a -m \"fixup! $(git log -1 --format='%s' $@)\"' -
squash = !sh -c 'git commit -a -m \"squash! $(git log -1 --format='%s' $@)\"' -
ri = rebase --interactive
rc = rebase --continue
pr = push gerrit HEAD:refs/for/master
mt = mergetool

http://git-scm.com/book/es/v2/Customizing-Git-Git-Configuration

Cambiar el editor por defecto:


[core]
`editor = 'C:/App/Dev/Notepad_pp/notepad_pp.exe' -multiInst -notabbar
-nosession -noPlugin`

Para que haga por defecto el seguimiento de los ficheros renombrados:

`git config diff.renames true`

[diff]
renames = true

Y para que tambin lo haga de los ficheros copiados:

`git config diff.renames copies`

[diff]
renames = copies

http://www.javaworld.com/article/2113465/developer-tools-ide/git-smart-20-
essential-tips-for-git-and-github-users.html

http://codehero.co/git-desde-cero-personalizar-la-configuracion-de-git/

http://codehero.co/git-desde-cero-personalizar-la-configuracion-de-git/

git config --global alias.lg "log --pretty=format:'%h - %an, %ar : %s'


-http://stackoverflow.com/questions/16641057/how-can-i-list-the-git-subtrees-on-
the-root
http://stackoverflow.com/questions/16641057/how-can-i-list-the-git-subtrees-on-the-
root

git config --global alias.last 'log -1 HEAD'

http://git-scm.com/book/en/v1/Git-Basics-Tips-and-Tricks

http://wildlyinaccurate.com/a-hackers-guide-to-git/

https://gist.github.com/mwhite/6887990

You might also like