Apuntes de Git

Borrar submódulo

La forma correcta de hacerlo, conservando el contenido del módulo si es necesario.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mv a/submodule a/submodule_tmp  # keeps a backup of module contents
                                # do this only if keeping the contents

git submodule deinit -f a/submodule # removes submodule from repo
rm -rf .git/modules/a/submodule     # removes submodule reference
git rm -f a/submodule               # Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
git rm --cached a/submodule
mv a/submodule_tmp a/submodule

Clonar cuando hay submódulos

La opción -jn asigna n recursos para las tareas de clonado.

1
git clone --recursive -j8 git://github.com/foo/bar.git

Deshacer un amend

Siempre y cuando no la hayas pifiado ya en la historia compartida.

1
2
git reset --soft HEAD@{1}
git commit -C HEAD@{1}

La primera orden mueve el HEAD a donde estaba apuntando el commit antiguo. Además dejamos el index intacto para poder hacer otra vez un commit con los cambios pendientes.

HEAD@{1} nos da el commit al que HEAD estaba apuntando antes de apuntar al que está apuntando (léelo un par de veces más). No es lo mismo que HEAD~1 que devuelve el commit padre del commit al que está apuntando HEAD.

La segunda sentencia es más retorcida. Significa: haz un commit del tree actual, usando los detalles del commit erroneo. Fíjate que HEAD@{1} ahora apunta al commit erróneo, puesto que apunta al commit al que apuntaba HEAD antes de apuntar a donde apunta ahora mismo.

Revert a un commit previo

Detached Head

1
git checkout <old-commit-hash>

¡Ojo! ahora mismo estás en un detached head es decir no estás en ningún branch. Si haces cambios en el commit <old-commit-hash> vas a tener muchos problemas. Antes de hacer cambios puedes crear una nueva rama:

1
git switch -c <new-branch-name>

O volver a donde estabas con git checkout

Con una rama

Si quieres hacer cambios es lo más recomendable:

1
git checkout -b old-state <old-commit-hash>

A fuego (quemando las naves)

Si no tienes nada en la historia compartida puedes hacer reset:

1
2
3
4
5
6
7
8
# Perderás todos los cambios locales!
git reset --hard <old-commit-hash>

# Si quieres guardar cambios pendientes
git stash
git reset --hard <old-commit-hash>
git stash pop
# Salvar modificaciones y reaplicar

Si ya has compartido la historia tendrás que trabajar con revert.

Esta también es la forma más segura y recomendable si quieres conservar la historia completa:

1
2
git revert --no-commit <old-commit-hash>..HEAD
git commit

El flag --no-commit permite hacer un revert de todos los commits de un golpe, si no lo pasas hará un nuevo commit por cada commit “revertido” y la historia va a quedar un poco enrevesada.

Cambiar el nombre a una rama

En Gitlab hay que usar main en lugar de master.

1
2
3
git branch -m <New_Branch_Name>
git push origin :<Old_Branch_Name> <New_Branch_Name>
git push --set-upstream origin <New_Branch_Name>