Git

Básicos

Descargar cambios

git pull

Agregar cambios del archivo

git add file

Hacer commit con mensaje

git commit -m "este es el mensaje"

Agregar todos los cambios y hacer commit con mensaje

git commit -am "este es el mensaje"

Agregar selectiva e interactivamente los cambios

git add --patch file

Con s, fragmentas lo que se va a agregar, con e puedes editar manualmente el fragmento a agregar (al guardar y salir se agrega).

Subir los cambios

git push

Eliminar cambios

git reset --hard

Volver a cambios del origin/master

git reset --hard origin/master

Forzar el borrado de archivos y directorios que se han agregado sin añadir

git clean -fd

Ver log de los últimos commits

git log -n5

Ver los commits que están en esta rama pero no en otherBranch.

git log --graph otherBranch..HEAD

Regresar un archivo al estado anterior

git checkout HEAD~4 file

Restaurar cambios interactivamente, git va preguntando que cambios restaurar y cuales no

git checkout --patch file

~/.gitconfig

Definir las configuraciones de git. Ejemplo

[user]
    name = userName
    email = userName@gmail.com

[diff]
    color = auto

[pager]
    color = true

[status]
    color = auto
[push]
    default = current
[alias]
    st = status

Excluir en todos los repos (Tracking generated files with Pathogen)

git config --global core.excludesfile '~/.gitexcludes'
echo tags > ~/.gitexcludes

Commit

Modificar último commit, realizar cambios en los archivos, agregarlos y

git commit --amend

Crear un commit con una fecha específica

tempDate=$(date -R --date='12 hours ago')
GIT_COMMITTER_DATE="$tempDate" git ci --date "$tempDate"

Diff

Solo las lineas de diferencia

git diff -U0

Diferencias entre commits

git diff HEAD^ HEAD
git diff HEAD~2 HEAD

Diferencias en resumen

git diff --stat

Ver solamente los cambios ya agregados

git diff --cached

Listar solo los nombres de los archivos modificados

git ls-files -m

Listar nombres de archivos que han cambiado respecto a otra rama (rama develop)

git diff develop --name-only

rev-list

Obtener hash del último commit antes de la fecha

git rev-list -n 1 --before="2017-03-01" HEAD

Obtener archivos modificados desde el último commit antes de la fecha

git diff --name-only $(git rev-list -n 1 --before="2017-03-01" HEAD)

Ver el log del último commit antes de la fecha

git log -1 $(git rev-list -n 1 --before="2017-03-01" HEAD)

grep

Buscar una expresión en todos los commits

git grep <regexp> $(git rev-list --all)

stash

Almacenar temporalmente cambios sin un commit

git stash

Solo almacenar los archivos que no están staged

git stash --keep-index

Listar cambios almacenados con stash

git stash list

Aplicar un cambio de stash

git stash apply

Sacar el último cambio del stash y aplicar

git stash pop

Diferencias del stash

git stash show -p stash@{0}

Diferencias contra del stash

git diff stash@{0}

rebase

En lugar de merge, para un historial más ordenado

git checkout new-feature
git rebase master
git checkout master
git merge new-feature

Eliminar un commit

git rebase -i HEAD~5

De la lista mostrada borrar la linea del commit (removing selected commits from repository)

Branch

Ver las branchs locales

git branch
* master

Ver las branchs ocultas, incluyendo las remotas

git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/otroRepo/experimental

Crear una nueva rama llamada test

git branch test

Cambiarse a una branch

git checkout origin/experimental

Para trabajar en la branch

git checkout -b experimental origin/experimental

Esto es valido para una branch no propia, puedes cambiarte a una branch de otro remote

git checkout -b experimental otroRepo/experimental

Ahora está entre las branchs

git branch
  master
* experimental

Mezclar dos ramas, estando en la rama test, me cambio master y traigo los cambios ([How to clone all remote branches in Git?][clone-remote-branches])

git co master
git merge test

Borrar una rama

git branch -D nombreRama

Borrar ramas que fueron mergeadas

git fetch origin --prune && git branch --merged | sed '/develop/d' | xargs git branch -D --

Remote branches

Track una branch remota

git checkout -b test origin/test

Forzar a que una rama ya creada quede con “track” a la remota

git branch -u upstream/foo

Push los cambios de a la rama en el origen

git push origin test

Borrar una rama remota (Pro git - remote branches)

git push origin :test

Archivos en otras ramas

Los archivos que tienen cambios en otra rama

git diff --stat otraRama/master

Las diferencias de un archivo en otra rama

git diff otraRama/master archivo

Remplazar el archivo con el contenido del existente en la otra rama

git checkout otraRama/master archivo

Remotes

Merge con otros repos/forks

git co master
git remote add userRepo git://github.com/userRepo/otroRepo.git
git fetch userRepo
git merge userRepo/master
git push

Ver las diferencias con otros forks (Github pull request)

git fetch userRepo
git log --oneline HEAD..userRepo/master

Fetch a todas las remotas

git remote update

graph

Log más gráfico

lg = log --graph --pretty=format:'%Cgreen%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(blue)<%an>%Creset' --abbrev-commit --date=relative

reset

volver al estado del commit y borrar archivos recién creados

git reset --hard
git clean -f -d

Ver lo que se ha hecho

git reflog

Muy útil para recuperar hash que se resetearon

submodules

add

Agregar un nuevo submodulo

git submodule add http://url_submodule path_a_instalar

Iniciar y actualizar

git submodule init
git submodule update

O

git submodule update --init

Actualizar todos los submodulos

git submodule update --init --recursive

rm

No es tan simple como al agregar, es necesario eliminar las lineas que mencionen al submodulo en los archivos

vim .gitmodules # eliminar referencias al submodulo
vim .git/config #  eliminar referencias al submodulo
git rm --cached path_to_subModule
git commit

Pueden quedar archivos del submodulo

rm -rf path_to_subModule

show

Mostrar commit, author, fecha y solo mensaje de commit (sin diff)

git show -s HEAD~3..HEAD

Tags

Crear una en el actual commit

git tag v0.0.1

Crear un tag con anotación (una descripción similar a un commit)

git tag -a

Con lo anterior se abre el editor por defecto, si se quiere agregar la anotación directamente

git tag -a -m "alguna descripcion del tag"

Mostrar el tag

git show v0.0.1

Subir las tags

git push --tags

Obtener el tag más cercana al commit actual

git describe --abbrev=0

Con más detalles

git describe --tags --always --dirty

archive

Archivar solo los últimos archivos modificados

git archive HEAD $(git diff --name-only HEAD^) | tar -x -C ..

Referencias