💾 Archived View for undevlambda.space › 2023-05-07-git-stash-fu.gmi captured on 2024-05-12 at 14:49:44. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-12-28)

-=-=-=-=-=-=-

Git stash-fu

Je vais vous présenter un cas d'utilisation très pratique de la commande "git stash --keep-index". Dans la suite de l'article, j'utiliserai Maven comme outil de compilation et d'exécution de tests.

La problématique

Posons le contexte. Vous travaillez sur une grosse fonctionnalité, et vous avez fait plein de modifications dans votre code. Vous aimeriez commiter vos changements en plusieurs commits, chacun apportant un lot de modification cohérent. Vous voulez être certain que chaque commit ne cassera ni la compilation, ni les tests automatisés.

Que faites-vous dans ce cas lĂ  ? Vous compilez & testez votre code :

  {body}gt; git status

  modified: foo.java
  modified: bar.java

  {body}gt; mvn test # compile & lance les tests

  [...] compilation OK & tests OK

Vous vous dites que la compilation et les tests sont OK, donc vous ajoutez "foo.java" Ă  la zone de staging et commitez.

  {body}gt; git add foo.java
  {body}gt; git commit -m "some stuff"

Cependant, il y a un souci dans notre exemple. Nous avons exécuté "mvn test" sur tout le code modifié, et non pas uniquement la partie qu'on veut commiter. Comment conserver uniquement "foo.java" et mettre de côté "bar.java" ? Vous l'avez deviné, nous allons utiliser la commande "git stash --keep-index".

Rappelons que "git stash" met de côté toutes les modifications qui ont été faites, et remet le projet à l'état du dernier commit. La commande "git stash --keep-index", met de côté uniquement les fichiers qui n'ont pas été ajouté à la zone de staging avec "git add".

Reprenons l'exemple ci-dessus, avant commit :

  {body}gt; git status

  Changes to be committed:
    modified: foo.java

  Changes not staged for commit:
    modified: bar.java

  {body}gt; git stash --keep-index
  {body}gt; git status

  Changes to be committed: foo.java

À ce moment là, le code ne contient que les modifications que nous souhaitons commiter. Nous pouvons vérifier la compilation & les tests.

  {body}gt; mvn test

  [...] compilation OK & tests OK

  {body}gt; git commit -m "Some stuff"

Il ne reste plus qu'à récupérer les autres modifications mise de côté avec "git stash pop".

  {body}gt; git stash pop
  {body}gt; git status

  Changes not staged for commit:
    modified: bar.java

Quelques problèmes

Que faire si le ou les fichiers à commiter, isolés des autres modifications ne compilent pas ou si les tests ne passent pas ? Cela veut certainement dire que les fichiers isolés nécessitent d'être commités avec les autres fichiers, ou qu'une partie des modifications mises de côté est nécessaire.

On peut alors ajouter avec "git add" les autres fichiers requis, ou utiliser "git add -p" pour ajouter les portions de code nécessaire.

Pour aller plus loin

Liens

Maven