Git 🌙
Chapters â–Ÿ 2nd Edition

7.2 Utilitaires Git - Indexation interactive

Indexation interactive

Git propose quelques scripts qui rendent les opĂ©rations en ligne de commande plus simples. Nous allons Ă  prĂ©sent dĂ©couvrir des commandes interactives vous permettant de choisir les fichiers ou les parties d’un fichier Ă  incorporer Ă  un commit. Ces outils sont particuliĂšrement pratiques si vous modifiez un grand nombre de fichiers et que vous souhaitez valider ces changements en modifications plus atomiques plutĂŽt que d’un tenant. De la sorte, vous vous assurez que vos commits sont des ensembles cohĂ©rents de modifications et qu’ils peuvent ĂȘtre facilement revus par vos collaborateurs.

Si vous exĂ©cutez git add avec l’option -i ou --interactive, Git entre en mode interactif et affiche quelque chose comme :

$ git add -i
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now>

Vous vous apercevrez que cette commande propose une vue bien diffĂ©rente de votre index ; en gros, c’est la mĂȘme information que vous auriez obtenue avec git status mais en plus succinct et plus instructif. Cela liste les modifications que vous avez indexĂ©es Ă  gauche et celles hors index Ă  droite.

En dessous vient la section des commandes (Commands). Vous aurez accĂšs Ă  un certain nombre d’actions, notamment indexer des fichiers, les enlever de l’index, indexer des parties de fichiers, ajouter des fichiers non indexĂ©s, et vĂ©rifier les diffĂ©rences de ce que vous avez indexĂ©.

Indexation et désindexation des fichiers

Si vous tapez 2 ou u au prompt What now>, le script vous demande quels fichiers vous voulez indexer :

What now> 2
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Update>>

Pour indexer les fichiers TODO et index.html, vous pouvez taper ces nombres :

Update>> 1,2
           staged     unstaged path
* 1:    unchanged        +0/-1 TODO
* 2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Update>>

Le caractĂšre * au dĂ©but de la ligne de chaque fichier indique que celui-ci est sĂ©lectionnĂ©. Si vous tapez EntrĂ©e sur l’invite Update>>, Git prend tout ce qui est sĂ©lectionnĂ© et l’indexe pour vous :

Update>>
updated 2 paths

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now> 1
           staged     unstaged path
  1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb

À prĂ©sent, vous pouvez voir que les fichiers TODO et index.html sont indexĂ©s (staged en anglais) et que simplegit.rb ne l’est toujours pas. Si vous souhaitez enlever de l’index le fichier TODO, utilisez 3 (ou r pour revert en anglais) :

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now> 3
           staged     unstaged path
  1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Revert>> 1
           staged     unstaged path
* 1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Revert>> [enter]
reverted one path

Un aperçu rapide Ă  votre statut Git et vous pouvez voir que vous avez enlevĂ© le fichier TODO de l’index :

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now> 1
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb

Pour voir la modification que vous avez indexĂ©e, utilisez 6 ou d (pour diffĂ©rence). Cela vous affiche la liste des fichiers indexĂ©s et vous pouvez choisir ceux pour lesquels vous voulez consulter la diffĂ©rence. C’est Ă©quivalent Ă  git diff --cached en ligne de commande :

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now> 6
           staged     unstaged path
  1:        +1/-1      nothing index.html
Review diff>> 1
diff --git a/index.html b/index.html
index 4d07108..4335f49 100644
--- a/index.html
+++ b/index.html
@@ -16,7 +16,7 @@ Date Finder

 <p id="out">...</p>

-<div id="footer">contact : support@github.com</div>
+<div id="footer">contact : email.support@github.com</div>

 <script type="text/javascript">

Avec ces commandes Ă©lĂ©mentaires, vous pouvez utiliser l’ajout interactif pour manipuler votre index un peu plus facilement.

Indexations partielles

Git est Ă©galement capable d’indexer certaines parties d’un fichier. Par exemple, si vous modifiez en deux endroits votre fichier simplegit.rb et que vous souhaitez indexer une modification seulement, cela peut se faire trĂšs aisĂ©ment avec Git. En mode interactif, tapez 5 ou p (pour patch en anglais). Git vous demandera quels fichiers vous voulez indexer partiellement, puis, pour chacun des fichiers sĂ©lectionnĂ©s, il affichera les parties du fichier oĂč il y a des diffĂ©rences et vous demandera si vous souhaitez les indexer, une par une :

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index dd5ecc4..57399e0 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -22,7 +22,7 @@ class SimpleGit
   end

   def log(treeish = 'master')
-    command("git log -n 25 #{treeish}")
+    command("git log -n 30 #{treeish}")
   end

   def blame(path)
Stage this hunk [y,n,a,d,/,j,J,g,e,?]?

À cette Ă©tape, vous disposez de bon nombre d’options. ? vous liste les actions possibles dont voici une traduction :

Indexer cette partie [y,n,a,d,/,j,J,g,e,?]? ?
y - indexer cette partie
n - ne pas indexer cette partie
a - indexer cette partie et toutes celles restantes dans ce fichier
d - ne pas indexer cette partie ni aucune de celles restantes dans ce fichier
g - sélectionner une partie à voir
/ - chercher une partie correspondant à la regexp donnée
j - laisser cette partie non décidée, voir la prochaine partie non encore décidée
J - laisser cette partie non décidée, voir la prochaine partie
k - laisser cette partie non décidée, voir la partie non encore décidée précédente
K - laisser cette partie non décidée, voir la partie précédente
s - couper la partie courante en parties plus petites
e - modifier manuellement la partie courante
? - afficher l'aide

En rĂšgle gĂ©nĂ©rale, vous choisirez y ou n pour indexer ou non chacun des blocs, mais tout indexer pour certains fichiers ou remettre Ă  plus tard le choix pour un bloc peut Ă©galement ĂȘtre utile. Si vous indexez une partie d’un fichier et une autre non, votre statut ressemblera Ă  peu prĂšs Ă  ceci :

What now> 1
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:        +1/-1      nothing index.html
  3:        +1/-1        +4/-0 lib/simplegit.rb

Le statut pour le fichier simplegit.rb est intĂ©ressant. Il vous montre que quelques lignes sont indexĂ©es et d’autres non. Vous avez partiellement indexĂ© ce fichier. DĂšs lors, vous pouvez quitter l’ajout interactif et exĂ©cuter git commit pour valider les fichiers partiellement indexĂ©s.

Enfin, vous pouvez vous passer du mode interactif pour indexer partiellement un fichier ; vous pouvez faire de mĂȘme avec git add -p ou git add --patch en ligne de commande.

De plus, vous pouvez utiliser le mode patch pour réinitialiser partiellement des fichiers avec la commande reset --patch, pour extraire des parties de fichiers avec checkout --patch et pour remiser des parties de fichiers avec stash save --patch. Nous explorerons plus en détail chacune des ces commandes quand nous aborderons les usages avancés de ces commandes.

scroll-to-top