tag - trucos en git
Intercambiar programáticamente las dos últimas confirmaciones. (2)
Sé cómo intercambiar las dos últimas confirmaciones utilizando git rebase
interactiva ( git rebase -i HEAD~2
, ddjp:x
en Vim), pero me gustaría hacerlo mediante un script de envoltura ya que es algo que termino haciendo relativamente a menudo.
Para ser más concretos, quiero reescribir la historia desde
A---B---C---D HEAD
a
A---B---D---C HEAD
de una manera enteramente escrita. Idealmente, si el intercambio falla, debería permitirme arreglarlo de forma interactiva o simplemente rendirme y decirme que lo haga manualmente.
Esto debería hacerlo:
git tag old
git reset --hard HEAD~2
git cherry-pick old
git cherry-pick old~1
git tag -d old
Primero, marque el lugar donde tiene la old
, luego retroceda dos confirmaciones, git cherry-pick
the commit en el otro orden y elimine la etiqueta old
.
Para referencia, este es el script que terminé usando:
. "$(git --exec-path)/git-sh-setup"
require_clean_work_tree swap2
if [ -e $GIT_DIR/sequencer ]; then
die "Cherry-pick already in progress; swap aborted"
fi
HEAD=`git rev-list --max-count=1 HEAD`
git reset --hard HEAD~2
if git cherry-pick $HEAD $HEAD^; then
echo "Successfully swapped top two commits."
else
git cherry-pick --abort
git reset --hard $HEAD
die "Failed to swap top two commits."
fi