-
1. DĂ©marrage rapide
-
2. Les bases de Git
-
3. Les branches avec Git
-
4. Git sur le serveur
- 4.1 Protocoles
- 4.2 Installation de Git sur un serveur
- 4.3 Génération des clés publiques SSH
- 4.4 Mise en place du serveur
- 4.5 DĂ©mon (Daemon) Git
- 4.6 HTTP intelligent
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Git hébergé
- 4.10 Résumé
-
5. Git distribué
-
6. GitHub
-
7. Utilitaires Git
- 7.1 SĂ©lection des versions
- 7.2 Indexation interactive
- 7.3 Remisage et nettoyage
- 7.4 Signer votre travail
- 7.5 Recherche
- 7.6 RĂ©Ă©crire lâhistorique
- 7.7 Reset démystifié
- 7.8 Fusion avancée
- 7.9 Rerere
- 7.10 DĂ©boguer avec Git
- 7.11 Sous-modules
- 7.12 Empaquetage (bundling)
- 7.13 Replace
- 7.14 Stockage des identifiants
- 7.15 Résumé
-
8. Personnalisation de Git
- 8.1 Configuration de Git
- 8.2 Attributs Git
- 8.3 Crochets Git
- 8.4 Exemple de politique gérée par Git
- 8.5 Résumé
-
9. Git et les autres systĂšmes
- 9.1 Git comme client
- 9.2 Migration vers Git
- 9.3 Résumé
-
10. Les tripes de Git
- 10.1 Plomberie et porcelaine
- 10.2 Les objets de Git
- 10.3 Références Git
- 10.4 Fichiers groupés
- 10.5 La refspec
- 10.6 Les protocoles de transfert
- 10.7 Maintenance et récupération de données
- 10.8 Les variables dâenvironnement
- 10.9 Résumé
-
A1. Annexe A: Git dans dâautres environnements
- A1.1 Interfaces graphiques
- A1.2 Git dans Visual Studio
- A1.3 Git dans Visual Studio Code
- A1.4 Git dans IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git dans Sublime Text
- A1.6 Git dans Bash
- A1.7 Git dans Zsh
- A1.8 Git dans PowerShell
- A1.9 Résumé
-
A2. Annexe B: Embarquer Git dans vos applications
- A2.1 Git en ligne de commande
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Commandes Git
- A3.1 Installation et configuration
- A3.2 Obtention et création des projets
- A3.3 Capture dâinstantanĂ© basique
- A3.4 Création de branches et fusion
- A3.5 Partage et mise Ă jour de projets
- A3.6 Inspection et comparaison
- A3.7 DĂ©bogage
- A3.8 Patchs
- A3.9 Courriel
- A3.10 SystĂšmes externes
- A3.11 Administration
- A3.12 Commandes de plomberie
7.3 Utilitaires Git - Remisage et nettoyage
Remisage et nettoyage
Souvent, lorsque vous avez travaillé sur une partie de votre projet, les choses sont dans un état instable mais vous voulez changer de branche pour travailler momentanément sur autre chose.
Le problÚme est que vous ne voulez pas valider un travail à moitié fait seulement pour pouvoir y revenir plus tard.
La réponse à cette problématique est la commande git stash
.
Remiser prend lâĂ©tat en cours de votre rĂ©pertoire de travail, câest-Ă -dire les fichiers modifiĂ©s et lâindex, et lâenregistre dans la pile des modifications non finies que vous pouvez rĂ©-appliquer Ă nâimporte quel moment.
Note
|
Migrer vers
git stash push
Courant fin octobre 2017, il y a eu de longues discussions sur la liste de diffusion Git, pour rendre obsolĂšte la commande
|
Remiser votre travail
Pour dĂ©montrer cette possibilitĂ©, allez dans votre projet et commencez Ă travailler sur quelques fichiers et indexez lâun de ces changements.
Si vous exécutez git status
, vous pouvez voir votre état modifié :
$ git status
Modifications qui seront validées :
(utilisez "git reset HEAD <fichier>..." pour désindexer)
modifié : index.html
Modifications qui ne seront pas validées :
(utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
(utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)
modifié : lib/simplegit.rb
à ce moment-là , vous voulez changer de branche, mais vous ne voulez pas encore valider ce travail ; vous allez donc remiser vos modifications.
Pour créer une nouvelle remise sur votre pile, exécutez git stash
 :
$ git stash
Saved working directory and index state \
"WIP on master: 049d078 added the index file"
HEAD is now at 049d078 added the index file
(To restore them type "git stash apply")
Votre répertoire de travail est propre :
$ git status
Sur la branche master
rien Ă valider, la copie de travail est propre
à ce moment, vous pouvez facilement changer de branche et travailler autre part ; vos modifications sont conservées dans votre pile.
Pour voir quelles remises vous avez sauvegardées, vous pouvez utiliser la commande git stash list
 :
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051... Revert "added file_size"
stash@{2}: WIP on master: 21d80a5... added number to log
Dans ce cas, deux remises ont été créées précédemment, vous avez donc accÚs à trois travaux remisés différents.
Vous pouvez rĂ©-appliquer celui que vous venez juste de remiser en utilisant la commande affichĂ©e dans la sortie dâaide de la premiĂšre commande de remise : git stash apply
.
Si vous voulez appliquer une remise plus ancienne, vous pouvez la spécifier en la nommant, comme ceci : git stash apply stash@{2}
.
Si vous ne spĂ©cifiez pas une remise, Git prĂ©sume que vous voulez la remise la plus rĂ©cente et essaye de lâappliquer.
$ git stash apply
Sur la branche master
Modifications qui ne seront pas validées :
(utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
(utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)
modified: index.html
modified: lib/simplegit.rb
no changes added to commit (use "git add" and/or "git commit -a")
Vous pouvez observer que Git remodifie les fichiers non validĂ©s lorsque vous avez crĂ©Ă© la remise. Dans ce cas, vous aviez un rĂ©pertoire de travail propre lorsque vous avez essayĂ© dâappliquer la remise et vous lâavez fait sur la mĂȘme branche que celle oĂč vous lâaviez crĂ©Ă©e ; mais avoir un rĂ©pertoire de travail propre et lâappliquer sur la mĂȘme branche nâest pas nĂ©cessaire pour rĂ©ussir Ă appliquer une remise. Vous pouvez trĂšs bien crĂ©er une remise sur une branche, changer de branche et essayer dâappliquer ces modifications. Vous pouvez mĂȘme avoir des fichiers modifiĂ©s et non validĂ©s dans votre rĂ©pertoire de travail quand vous appliquez une remise, Git vous indique les conflits de fusions si quoi que ce soit ne sâapplique pas proprement.
Par défaut, les modifications de vos fichiers sont ré-appliquées, mais pas les indexations.
Pour cela, vous devez exécuter la commande git stash apply
avec lâoption --index
pour demander Ă Git dâessayer de rĂ©-appliquer les modifications de votre index.
Si vous exĂ©cutez cela Ă la place de la commande prĂ©cĂ©dente, vous vous retrouvez dans la position dâorigine prĂ©cĂ©dent la remise :
$ git stash apply --index
Sur la branche master
Modifications qui seront validées :
(utilisez "git reset HEAD <fichier>..." pour désindexer)
modifié : index.html
Modifications qui ne seront pas validées :
(utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
(utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)
modified: lib/simplegit.rb
Lâoption apply
essaye seulement dâappliquer le travail remisĂ©, vous aurez toujours la remise dans votre pile.
Pour la supprimer, vous pouvez exécuter git stash drop
avec le nom de la remise à supprimer :
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051... Revert "added file_size"
stash@{2}: WIP on master: 21d80a5... added number to log
$ git stash drop stash@{0}
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)
Vous pouvez également exécuter git stash pop
pour appliquer et supprimer immédiatement la remise de votre pile.
Remisage créatif
Il existe des variantes de remisages qui peuvent sâavĂ©rer utiles.
La premiĂšre option assez populaire est lâoption --keep-index
de la commande stash save
.
Elle indique Ă Git de ne pas seulement inclure le contenu indexĂ© dans le remisage en cours de crĂ©ation, mais aussi de le laisser en place dans lâindex.
$ git status -s
M index.html
M lib/simplegit.rb
$ git stash --keep-index
Saved working directory and index state WIP on master: 1b65b17 added the index file
HEAD is now at 1b65b17 added the index file
$ git status -s
M index.html
Une autre option utile de stash
est la possibilité de remiser les fichiers non suivis aussi bien que les fichiers suivis.
Par défaut, git stash
ne sauve que les fichiers qui sont déjà suivis ou indexés.
Si vous spĂ©cifiez lâoption --include-untracked
ou -u
, Git remisera aussi les fichiers non-suivis du répertoire de travail.
Cependant, inclure les fichiers non-suivis dans le remisage nâinclura pas les fichiers explicitement ignorĂ©s ; pour ajouter aussi les fichiers ignorĂ©s, utilisez --all
(ou juste -a
).
$ git status -s
M index.html
M lib/simplegit.rb
?? new-file.txt
$ git stash -u
Saved working directory and index state WIP on master: 1b65b17 added the index file
HEAD is now at 1b65b17 added the index file
$ git status -s
$
Enfin, si vous ajoutez lâoption --patch
, Git ne remisera pas tout le contenu modifié, mais vous invitera à sélectionner interactivement les modifications que vous souhaitez remiser et celles que vous souhaitez conserver dans la copie de travail.
$ git stash --patch
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index 66d332e..8bb5674 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -16,6 +16,10 @@ class SimpleGit
return `#{git_cmd} 2>&1`.chomp
end
end
+
+ def show(treeish = 'master')
+ command("git show #{treeish}")
+ end
end
test
Stash this hunk [y,n,q,a,d,/,e,?]? y
Saved working directory and index state WIP on master: 1b65b17 added the index file
Créer une branche depuis une remise
Si vous remisez votre travail, et lâoubliez pendant un temps en continuant sur la branche oĂč vous avez crĂ©Ă© la remise, vous pouvez avoir un problĂšme en rĂ©-appliquant le travail.
Si lâapplication de la remise essaye de modifier un fichier que vous avez modifiĂ© depuis, vous allez obtenir des conflits de fusion et vous devrez essayer de les rĂ©soudre.
Si vous voulez un moyen plus facile de tester une nouvelle fois les modifications remisées, vous pouvez exécuter git stash branch <nouveau-nom-de-branche>
qui crĂ©era une nouvelle branche Ă votre place, rĂ©cupĂ©rant le commit oĂč vous Ă©tiez lorsque vous avez crĂ©Ă© la remise, rĂ©-appliquera votre travail dedans, et supprimera finalement votre remise si cela a rĂ©ussi :
$ git stash branch testchanges
M index.html
M lib/simplegit.rb
Basculement sur la nouvelle branche 'testchanges'
Sur la branche testchanges
Modifications qui seront validées :
(utilisez "git reset HEAD <fichier>..." pour désindexer)
modifié : index.html
Modifications qui ne seront pas validées :
(utilisez "git add <fichier>..." pour mettre à jour ce qui sera validé)
(utilisez "git checkout -- <fichier>..." pour annuler les modifications dans la copie de travail)
modified: lib/simplegit.rb
refs/stash@{0} supprimé (f0dfc4d5dc332d1cee34a634182e168c4efc3359)
Câest un bon raccourci pour rĂ©cupĂ©rer facilement du travail remisĂ© et pouvoir travailler dessus dans une nouvelle branche.
Nettoyer son répertoire de travail
Enfin, vous pouvez souhaiter ne pas remiser certains fichiers de votre répertoire de travail, mais simplement vous en débarrasser.
La commande git clean
sâen chargera pour vous.
Le besoin le plus commun pourra ĂȘtre dâĂ©liminer les scories gĂ©nĂ©rĂ©es par les fusions ou les outils externes ou dâĂ©liminer les artefacts de compilation pour pouvoir relancer une compilation propre.
Faites néanmoins trÚs attention avec cette commande car elle supprime des fichiers non-suivis de votre répertoire de travail.
Si vous changez dâavis, il est souvent impossible de rĂ©cupĂ©rer aprĂšs coup le contenu de ces fichiers.
Une option plus sécurisée consiste à lancer git stash --all
pour tout sauvegarder dans une remise.
En supposant que vous souhaitez réellement éliminer les scories et nettoyer votre répertoire de travail, vous pouvez lancer git clean
.
Pour supprimer tous les fichiers non-suivis, vous pouvez lancer git clean -f -d
, qui effacera aussi tout sous-répertoire vide.
Lâoption -f
signifie « force », soit « fais-le réellement ».
Si vous souhaitez visualiser ce qui serait fait, vous pouvez lancer la commande avec lâoption -n
qui signifie « fais-le à blanc et montre-moi ce qui serait supprimé ».
$ git clean -d -n
Supprimerait test.o
Supprimerait tmp/
Par défaut, la commande git clean
ne va supprimer que les fichiers non-suivis qui ne sont pas ignorés.
Tout fichier qui correspond Ă un motif de votre fichier .gitignore
ou tout autre fichier similaire ne sera pas supprimé.
Si vous souhaitez supprimer aussi ces fichiers, comme par exemple les fichiers .o
gĂ©nĂ©rĂ© par un compilateur pour faire une compilation totale, vous pouvez ajouter lâoption -x
Ă la commande de nettoyage.
$ git status -s
M lib/simplegit.rb
?? build.TMP
?? tmp/
$ git clean -n -d
Supprimerait build.TMP
Supprimerait tmp/
$ git clean -n -d -x
Supprimerait build.TMP
Supprimerait test.o
Supprimerait tmp/
Si vous ne savez pas ce que la commande git clean
va effectivement supprimer, lancez-la une premiĂšre fois avec -n
par sécurité avant de transformer le -n
en -f
et nettoyer définitivement.
Un autre choix pour sâassurer de ce qui va ĂȘtre effacĂ© consiste Ă lancer la commande avec lâoption -i
ou --interactive
.
La commande sera lancée en mode interactif.
$ git clean -x -i
Supprimerait les éléments suivants :
build.TMP test.o
*** Commandes ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit
6: help
Et maintenant ?>
De cette maniÚre, vous pouvez détailler chaque fichier individuellement ou spécifier un motif pour la suppression interactive.
Note
|
Il y a des situations tordues oĂč vous aurez besoin dâĂȘtre plus impĂ©ratif pour demander Ă Git de nettoyer votre rĂ©pertoire de travail.
Sâil vous arrive dâĂȘtre dans un rĂ©pertoire de travail sous lequel vous avez copiĂ© ou clonĂ© dâautres dĂ©pĂŽts Git (peut-ĂȘtre en tant que sous-modules), mĂȘme |