Sólo los débiles hacen copias de seguridad en cintas: los hombres de verdad tan solo suben sus cosas importantes a un servidor FTP, y dejan que el resto del mundo las replique.
-- Linus Torvalds en 1996
Conociendo git
Antes de empezar...
Markdown es un lenguaje de marcado ligero de máxima legibilidad tanto en sus forma de entrada como de salida, usando texto plano.
Headings # Title heading Lists * first item * second item Styling text *This text will be italic* **This text will be bold** Blockquotes > Pardon my french
GitHub es una plataforma de desarrollo colaborativo para alojar proyectos utilizando el sistema de control de versiones Git.
«640K deberían ser suficientes para todo el mundo»
-- Bill Gates
OSX
brew install git
GNU/Linux
sudo apt-get install git-core #ubuntu yum install git-core #centos
Windows
Tutorial: Generating SSH Key
«El buen código es su mejor documentación»
-- Steve McConnell
El repositorio es el lugar en el que se almacenan los datos actualizados e históricos de cambios, a menudo en un servidor.
Un módulo puede bifurcado en un instante de tiempo de forma que, desde ese momento en adelante se tienen dos copias (ramas) que evolucionan de forma independiente siguiendo su propia línea de desarrollo.
Un commit sucede cuando una copia de los cambios hechos a una copia local es escrita o integrada sobre el repositorio.
Circunstancia en la que el sistema es incapaz de fusionar los cambios automáticamente, el usuario y debe resolver el conflicto combinando los cambios, o eligiendo uno de ellos para descartar el otro.
Una integración o fusión une dos conjuntos de cambios sobre un fichero o un conjunto de ficheros en una revisión unificada de dicho fichero o ficheros.
Es la creación de un proyecto en una dirección distinta de la principal u oficial tomando el código fuente del proyecto ya existente.
Darle a alguna versión de cada uno de los ficheros del módulo en desarrollo en un momento preciso un nombre común ("etiqueta" o "rótulo") para asegurarse de reencontrar ese estado de desarrollo posteriormente bajo ese nombre. Los tags permiten identificar de forma fácil revisiones importantes en el proyecto.
"El software es como el sexo: mejor si es libre y gratis"
-- Linus Torvalds
git init
Transforma el directorio actual en un repositorio Git. Esto agrega una carpeta oculta .git en el directorio actual haciendo posible empezar a guardar las reviciones del proyecto.
git clone <repo>
Descarga el repositorio especificado en <repo> y se posiciona en la rama master.
git commit `<file>` -m 'Any message' git commit -am 'Any message'
Confirma los cambios realizados desde el último commit, exceptuando los archivos no trackeados. Actualiza el indice eliminando los punteros de archivos eliminados.
git push <remote> <branch>
Empuja (envía) la rama al repositorio remoto.
git pull <remote> <branch>
Incorpora cambios desde el repositorio remoto a la rama actual.
git branch # Lista las ramas locales git branch -r # Lista las ramas remotas git branch -a # Lista todas (ambas) git branch -D <my-branch> # Borra la rama <my-branch>
Lista todas las ramas locales existentes.
git checkout <branch>
Cambia la rama de trabajo.
git status
Muestra la lista de archivos que tienen cambios (o que fueron eliminados) con respecto al índice.
git diff git diff <commit> git diff <branch>
Displays the differences not added to the index. Muestra las diferencias no agregadas al índice.
git log git log --oneline
Muestra una lista con los commits recientes(primero el más nuevo).
git add <file> # Agrega una fecha git add <dir> # Agrega un directorio git add --all # Agrega todos los archivos listados
Agrega archivos al índice para ser comiteados en el futuro.
«Las computadoras son inútiles. Sólo pueden darte respuestas»
-- Pablo Picasso
git checkout <archivo>
Restaura un archivo desde el último commit
git checkout <rama>
Cambia el HEAD a la rama
git checkout -b <rama>
Crea una nueva rama local con el nombre y se sitúa en ella.
git checkout <archivo> --theirs
En un conflicto, aplica en los cambios realizados en otra rama.
git checkout <archivo> --ours
En un conflicto, aplica en los cambios realizados en la rama actual.
Todos somos ignorantes solo que ignoramos distintas cosas.
-- Albert Einstein
git log --all --graph --decorate --oneline
Muestra un grafico de ramas en la consola.
git rebase <upstream>
Reverts all commits since the current branch diverged from <em>upstream</em>, and then re-applies them one-by-one on top of changes from the HEAD of <em>upstream</em>.
git cherry-pick <commit>
Aplica los cambios especificados en <commit> a la rama actual y comitea los cambios.
git stash [save] [<message>] git stash list git stash apply <stash> git stash pop <stash> #aplica el stash y lo borra de la lista git stash drop <stash> git stash clear
Este comando de guardado rápido (stashing) toma el estado del espacio de trabajo, con todas las modificaciones en los archivos bajo control de cambios, y lo guarda en una pila provisional.
git revert <commit>
Genera automaticamente los cambios opuestos a <commit> y los comitea. Tiene como resultado la cancelación de los cambios de <commit>
git merge <the-other-branch>
Aplica y fusiona los cambios presesentes en en la rama actual.
git fetch <remote> <branch> git fetch -a
Descarga una rama desde el repositorio remoto.La opción -a descarga todas las ramas remotas.
En teoría, la teoría es igual a la práctica, pero en la práctica, no.
Nunca se debe trabajar o pushear a master. En su lugar, usar PR.
git push -u origin pb/my-feature
Hacer code-review mejora la calidad del software y permite nivelar los conociemientos del equipo.
git checkout -b pb/new-feature
Siempre es oportuno utilizar nomenclaturas para crear ramas, anteponiendo el un prefijo con las iniciales del autor.
< author > / < new_feature >
Tutoriales y juegos
CodeSchool - Learn Git Branching
Cheatsheet
Interactive Cheatsheet - Print version - One page
Referencia