Mise en situation

En ce moment, on m’impose d’utiliser Gerrit. Pire, on m’impose, pour résoudre un bug ou une feature de ne faire qu’un commit.

TLDR

git checkout -b ma-feature
git commit -m "foo"
git commit -m "Spleandid commit message"
# ....

git checkout --detach
git rebase -i master # use pick, squash, fixup
git push origin HEAD:refs/for/master
git checkout -

Solution

Commiter autant que je veux sur ma branche. Tout squash en un sur une branch anonyme.

Process

On veut la feature BONJOUR

On se met bien

git checkout master
git pull
git checkout -b feature-bonjour

On code

git commit -m 'first commit'
# git commit -m
# ...

La feature est prete

On edit le dernier commit !

Pourquoi ? Pour avoir un joli message, sur notre branche, au cas où des modifs sont demandées après la review.

git commit --amend

On squash, loin de notre branche préférée

Donc en gros,

On se met sur une branche anonyme,

on rebase en :

  • gardant le premier commit,
  • fixup tous les suivants,
  • squash le dernier (pour récupérer le joli message bien formatté)
# Branch anonyme
git checkout --detach

git rebase -i master

# On edite de la sorte
pick e21512bd881e9eb183eafc81738e0e817ddcaa52 first commit
fixup dbd709da1e78fcd4c3a700583c6fed514bb55011 second commit
fixup 8e7a606fd6797f8a52e83a08378e70d0eb26a151 very big big commit
squash 3fd93497ec8741d960b69e2d651e31339f5517ab Feature bonjour: foo bar baz done

Tout est en un seul HORRIBLE commit en haut de master. Pour s’en convaincre

git log -2

Everything is presque done

C’est gerrit, on push d’un certaine façon

git push origin HEAD:refs/for/master

Un petit git checkout - pour retourner sur la branche feature-bonjour et eviter de faire des ajouts sur cette branche qui va disparaitre.

Tout n’est pas parfait

Des modif’ sont demandées ou conflit avec origin/master pas de panique.

On part de l’idée que personne n’a ajouté de code sur votre commit gerrit :

On retourne sur sa branche, on met à jour

git checkout feature-bonjour
git fetch
# On aime etre à jour
git rebase origin/master
# On bosse
git commit -m 'Forgot one case'

Maintenant on se retrouve à l’etape # On squash avec un commit en plus. Donc le rebase va ressembler à ca :

# Branch anonyme
git checkout --detach

git rebase -i master

# On edite de la sorte
pick e21512bd881e9eb183eafc81738e0e817ddcaa52 first commit
fixup dbd709da1e78fcd4c3a700583c6fed514bb55011 second commit
fixup 8e7a606fd6797f8a52e83a08378e70d0eb26a151 very big big commit
squash 3fd93497ec8741d960b69e2d651e31339f5517ab Feature bonjour: foo bar baz done
fixup 1943dbfe09c9076bca44e91943dbfe09c9076bca Forgot one case

Hé oui, on ‘squash’ le joli message bien formatté, mais on ‘fixup’ le dernier commit car on n’a pas besoin du message

On met à jour gerrit (chez moi, 11003, pas chez vous !)

git push origin HEAD:refs/changes/11003
# on evite les betises
git checkout -

Enjoy la mocheté du un seul commit.

HELP, j’ai tout perdu mes commits

Cherchez de l’aide autour de git reflog <- tous vos commits s’y trouvent