Guia rápida de git


Enlaces, documentación


Empezar a usar git en un ordenador nuevo

Para empezar a utilizar git en un nuevo ordenador, hay que realizar dos tareas:

  • Configurar git en el nuevo ordenador
  • Crear y configurar la clave ssh para conectarse a github.com desde el nuevo ordenador

Configurar git en un nuevo ordenador

Antes de crear un repositorio nuevo, o clonar uno existente, después de instalar el software de git, hay que configurar el usuario, tanto el username como el email.

Configurar el username. La opción --global es para que la opción aplique de forma global a todos los repositorios:

$ git config --global user.name "Alvaro Sainz-Pardo"

Consultar el valor de la variable user.name:

$ git config --global user.name

Configurar el email:

$ git config --global user.email "alvarosainzpardo@gmail.com"

Consultar el valor de la variable user.email:

$ git config --global user.email

Para borrar el valor de una variable se utiliza la opción --unset:

$ git config --global --unset user.name
$ git config --global --unset user.email

Después de configurar el user.name y el user.email, es aconsejable configurar las prefencias de fin de línea para los archivos de texto, dependiendo del sistema operativo que se esté usando (Unix/Mac o Windows).

Para Unix/Mac:

$ git config --global core.autocrlf input
$ git config --global core.safecrlf true

Para Windows:

$ git config --global core.autocrlf true
$ git config --global core.safecrlf true

También es conveniente configurar un .gitignore global, con extensiones de archivos del sistema operativo, archivos binarios, archivos temporales del editor, etc. Para ello:

  1. Crear un archivo ~/.gitignore_global
  2. Añadir al archivo las reglas deseadas. The Octocat tiene un Gist con reglas adecuadas para añadir a este archivo. A esas reglas, hay que añadir *.swp para ignorar los archivos temporales de vim
  3. Ejecutar el siguiente comando:
$ git config --global core.excludefile ~/.gitignore_global

Crear y configurar la clave ssh para conectarse a GitHub

Hay dos tipos de URLs que se pueden utilizar para referenciar los repositorios remotos en GitHub: http y ssh.

Si se utilizan urls de tipo ssh, los pasos que hay que dar para autorizar la conexión a GitHub desde un ordenador nuevo son:

  • Crear la clave en el ordenador nuevo
  • Importar la clave en la cuenta de github.com
  • Probar la conexión

Crear la clave en el ordenador nuevo

Crear la clave con el siguiente comando, poniendo la dirección de correo de la cuenta en github.com:

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

Cuando pregunte por la localización del archivo, pulsar Enter:

Enter a file in which to save the key (/home/you/.ssh/id_rsa): [Press enter]

Cuando pregunte por la passphrase, teclear una passphrase o pulsar Enter:

Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type passphrase again]

Importar la clave en la cuenta de github.com

Seguir las instrucciones de Adding a new SSH key to your GitHub account.

Probar la conexión

Para probar que la nueva conexión funciona se utiliza el siguiente comando:

$ ssh -T git@github.com

Si hay errores de conexión, seguir las instrucciones de Error: Permission denied (publickey).


Acceso mediante http

Si se utiliza http, no hay que crear claves de ssh ni darlas de alta en la cuenta de GitHub, simplemente hay que usar la url de tipo http al clonar el repositorio remoto. Por ejemplo:

$ git clone https://github.com/alvarosainzpardo/dotfiles.git

Este método de conexión funciona también si se está detrás de un proxy (ver instrucciones). La desventaja es que se pregunta el usuario y la clave de GitHub cada vez que se utiliza un comando git. Para evitar que esto ocurra, se puede utilizar un credential helper que cachea el usuario/password durante un tiempo determinado.

Para activar el credential helper:

$ git config --global credential.helper cache
# Set git to use the credential memory cache

Para cambiar el tiempo predeterminado de cacheo de 15 minutos:

$ git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after 1 hour (setting is in seconds)

Configurar git detrás de un proxy

Si te conectas a github.com mediante http, lo que hay que hacer es configurar la variable http.proxy con el valor correspondiente al proxy de la red:

$ git config --global http.proxy http://<user>:<passwd>@<proxyserver>:<port>/

También la variable https.proxy:

$ git config --global https.proxy http://<user>:<passwd>@<proxyserver>:<port>/

Por ejemplo:

$ git config --global http.proxy http://ds01170:<passwd>@proxyinternet.tesa:8080/
$ git config --global https.proxy http://ds01170:<passwd>@proxyinternet.tesa:8080/

Para eliminar el valor de las variables para el proxy, se utiliza la opción --unset:

$ git config --global --unset http.proxy
$ git config --global --unset https.proxy

Si la conexión a github.com es mediante ssh, cuando se accede detrás de un proxy hay que configurar el ssh para que utilice un proxy para las conexiones.

Comandos git

git data model

El modelo de datos de git tiene tres elementos:

  • Working tree / working directory
  • Staging area / index
  • Repository (HEAD)

El working tree el es sistema de archivos del sistema operativo, el directorio local de trabajo.

La staging area, también llamada index, es el área intermedia a la que se añaden los archivos cuando se ejecuta un git add.

El repositorio de git contiene el conjunto de commits que se van haciendo. El repositorio de git, más específicamente, contiene:

  • Un conjunto de commit objects
  • Un conjunto de referencias a commit objets, que se llaman heads

Un commit object contiene:

  • Un conjunto de archivos
  • Referencias a los parent commit objects, los commit objects padres de este commit object
  • Un hash SHA1, una cadena de 40 caracteres que identifica univocamente a este commit object

En todo momento, hay un último commit activo, que será el padre del nuevo commit que se haga en el repositorio. El head del commit activo se denomina HEAD (con mayúsculas). Dicho de otro modo, HEAD siempre es la referencia (head) del actual commit activo, el último commit que se ha hecho, y que será el padre del nuevo commit que se haga.

git reset (--soft, --hard, etc)