diff --git a/_layouts/fr_reference.html b/_layouts/fr_reference.html new file mode 100755 index 0000000..f707f32 --- /dev/null +++ b/_layouts/fr_reference.html @@ -0,0 +1,107 @@ + + +
+ +Le site Référence Git a été réalisé par l'équipe GitHub.
++ L'essentiel de Git tient à créer et sauvegarder des instantanés de votre projet + pour ensuite utiliser et comparer ces instantanés. Cette section va + présenter les commandes nécessaires pour créer et sauvegarder des instantanés + de votre projet. +
+ ++ Un concept important ici est que Git dispose d'un « index », qui se comporte + comme une sorte de zone d'attente pour votre instantané. Cela vous permet + d'accumuler des séries bien ordonnées d'instantanés à partir de fichiers modifiés + de votre dossier de travail, plutôt que de valider toutes les modifications de + fichiers d'un coup. +
+ +
+ Pour résumer, vous utiliserez git add
pour
+ commencer à suivre de nouveaux fichiers et aussi pour préparer la capture
+ des modifications apportées à des fichiers déjà suivis, puis
+ git status
et git diff
pour voir ce qui a été
+ modifié et préparé pour la capture et finalement git commit
pour
+ enregistrer un instantané dans votre historique. Ce sera le flux de travail
+ basique que vous utiliserez la plupart du temps.
+
+ Dans Git, vous devez ajouter le contenu d'un fichier dans la zone d'attente
+ avant de pouvoir le valider. Si c'est un nouveau fichier, vous pouvez
+ exécuter git add
pour l'ajouter au préalable à la zone d'attente,
+ mais même si le fichier est déjà « suivi »—en d'autres termes, il fait partie
+ de votre dernière validation—vous devez toujours lancer git add
+ pour ajouter de nouvelles modifications à votre zone d'attente.
+ Voyons quelques exemples.
+
Revenons à notre exemple Hello World, une fois initialisé notre projet,
+ nous commencerions alors à y ajouter des fichiers et le ferions avec
+ git add
. Nous pouvons utiliser git status
pour
+ afficher l'état de notre projet.
+
+$ git status -s +?? README +?? hello.rb ++ + Nous avons désormais deux fichiers non suivis. Nous pouvons maintenant les ajouter. + +
+$ git add README hello.rb ++ + Maintenant si nous exécutons
git status
à nouveau, nous verrions
+ qu'ils ont été ajoutés.
+
++$ git status -s +A README +A hello.rb ++ +
+ Il est aussi courant d'ajouter récursivement tous les fichiers d'un nouveau projet
+ en indiquant le dossier de travail courant comme suit : git add .
.
+ Sachant que Git va ajouter récursivement tous les fichiers dans un dossier que
+ vous lui donnez, si vous lui donnez le répertoire de travail courant, il va
+ simplement faire le suivi de chaque fichier qui s'y trouve. Dans ce cas,
+ la commande git add .
aurait donné la même chose que
+ git add README hello.rb
.
+
OK, à présent si nous éditons un de ces fichiers et exécutons
+ git status
à nouveau, nous allons observer
+ un comportement étrange.
+$ vim README +$ git status -s +AM README +A hello.rb ++ +
Le statut « AM » signifie que le fichier a été modifié depuis la dernière
+ fois qu'il a été ajouté. Cela signifie que si nous validons notre instantané
+ tout de suite, nous enregistrerions la version du fichier lors de l'exécution
+ précédente de git add
, pas la version actuelle. Git ne suppose
+ pas que le fichier dans sa version actuelle est nécessairement celui que vous
+ voulez prendre en instantané—vous devez le préciser à Git avec la commande
+ git add
.
+
+ Pour résumer,
+ vous exécutez git add
sur un fichier lorsque vous voulez inclure
+ toute modification apportée au fichier dans le prochain instantané.
+ Toute modification qui ne sera pas ajoutée ne sera pas incluse dans
+ l'instantané—cela signifie que vous pouvez créer vos instantanés
+ de manière plus fine que dans la plupart des systèmes de gestion
+ de versions.
Pour voir cette flexibilité de capture en action dans un exemple
+ particulièrement intéressant qui ne capture que certaines des
+ modifications apportées à un même fichier, voyez l’option
+ « -p » de git add
du livre Pro Git.
Comme vous l'avez vu dans la section git add
, pour voir
+ le statut de votre zone d'attente comparé au code de votre dossier de travail,
+ vous pouvez exécuter la commande git status
. En utilisant
+ l'option -s
l'affichage de la sortie sera réduit. Sans cette option
+ la commande git status
vous donnera plus de contexte et d'indications.
+ Voici le même affichage de la sortie du statut avec et sans le -s
.
+ La sortie courte ressemble à ça :
+
+$ git status -s +AM README +A hello.rb ++ + Alors que le même statut avec la sortie longue ressemble à ça : + +
+$ git status +# On branch master +# +# Initial commit +# +# Changes to be committed: +# (use "git rm --staged <file>..." to unstage) +# +# new file: README +# new file: hello.rb +# +# Changed but not updated: +# (use "git add <file>..." to update what will be committed) +# (use "git checkout -- <file>..." to discard changes in working directory) +# +# modified: README +# ++ +
Vous pouvez facilement constater que l'affichage court de la sortie + est beaucoup plus compact, mais la sortie longue a des informations et + indications utiles dont vous pourriez avoir besoin par la suite. +
+ +Git vous dira également quels fichiers ont été effacés + ou les fichiers modifiés ou mis en attente depuis votre dernière validation
++$ git status -s +M README + D hello.rb ++ + Remarquez qu'il y a deux colonnes dans la sortie courte du statut. + La première colonne est pour la zone d'attente, la seconde est pour le + dossier de travail. Par exemple, si vous avez le fichier README en zone + d'attente et qu'ensuite vous le modifiez sans exécuter
git add
+ une seconde fois, vous verrez ceci :
+
++$ git status -s +MM README + D hello.rb ++ +
+ Pour résumer,
+ vous exécutez git status
pour voir si quoi que ce soit a été
+ modifié ou mis en attente depuis votre dernier instantané pour que vous
+ puissiez décider si vous voulez valider un nouvel instantané et avec quel
+ contenu.
+
+ Git utilise le terme « indexé » pour indiquer l'action qui consiste + à mettre une modification en zone d'attente, en vue de son inclusion + dans le prochain instantané. En fait, dans la littérature Git, les termes + stage (zone d'attente) et index sont interchangeables. + On trouve d'ailleurs très souvent le terme index dans les manuels officiels de Git. + Nous utiliserons donc le terme « indexer » et + l’adjectif « indexé » dans la suite de ce document. +
+ +Il y a deux utilisations principales de la commande git diff
.
+ Nous allons décrire la première ici, l'autre sera décrite plus loin
+ dans la section "Inspection et Comparaison".
+ Pour le moment, nous allons l’utiliser pour visualiser les modifications
+ déjà indexées pour le prochain instantané, et celles qui ne sont encore
+ présentes que dans notre dossier de travail.
Sans aucun argument, un simple git diff
vous affichera au
+ format diff unifié (un correctif) ce que vous avez changé comme code ou
+ contenu de votre projet depuis la dernière indexation ou,
+ à défaut, le dernier instantané.
+
+$ vim hello.rb +$ git status -s + M hello.rb +$ git diff +diff --git a/hello.rb b/hello.rb +index d62ac43..8d15d50 100644 +--- a/hello.rb ++++ b/hello.rb +@@ -1,7 +1,7 @@ + class HelloWorld + + def self.hello +- puts "hello world" ++ puts "bonjour monde" + end + + end ++ +
Là où git status
vous affichera quels fichiers ont changé
+ et/ou ont été indexés depuis votre dernière validation, git diff
+ va vous montrer quels sont concrètement ces changements, ligne par ligne.
+ C'est généralement une commande utile à la suite d'un git status
.
+
La commande git diff --staged
montrera le contenu indexé.
+ C'est-à-dire, elle vous affichera les changements qui seront inclus
+ dans le prochain instantané validé. Ainsi, si vous deviez indexer
+ les modifications de hello.rb
de l'exemple précédent,
+ git diff
tel quel ne vous affichera rien car il
+ vous afficherait que ce qui n'a pas encore été indexé.
+
+$ git status -s + M hello.rb +$ git add hello.rb +$ git status -s +M hello.rb +$ git diff +$ ++ +
Si vous voulez voir les changements indexés, vous pouvez exécuter
+ git diff --staged
à la place.
+$ git status -s +M hello.rb +$ git diff +$ +$ git diff --staged +diff --git a/hello.rb b/hello.rb +index d62ac43..8d15d50 100644 +--- a/hello.rb ++++ b/hello.rb +@@ -1,7 +1,7 @@ + class HelloWorld + + def self.hello +- puts "hello world" ++ puts "bonjour monde" + end + + end ++ +
Si vous voulez voir aussi bien les modifications indexées que non indexées ensemble,
+ vous pouvez exécuter git diff HEAD
—cela veut simplement
+ dire que vous voulez voir les différences entre votre répertoire de travail et le
+ dernier instantané, ignorant la zone d'index. Si nous apportons une autre modification
+ au fichier hello.rb
, alors nous aurons des modifications indexées et
+ d'autres modifications non indexées. Voici ce que chacune des trois commandes
+ diff
vous affichera :
+$ vim hello.rb +$ git diff +diff --git a/hello.rb b/hello.rb +index 4f40006..2ae9ba4 100644 +--- a/hello.rb ++++ b/hello.rb +@@ -1,7 +1,7 @@ + class HelloWorld + ++ # says hello + def self.hello + puts "bonjour monde" + end + + end +$ git diff --staged +diff --git a/hello.rb b/hello.rb +index 2aabb6e..4f40006 100644 +--- a/hello.rb ++++ b/hello.rb +@@ -1,7 +1,7 @@ + class HelloWorld + + def self.hello +- puts "hello world" ++ puts "bonjour monde" + end + + end +$ git diff HEAD +diff --git a/hello.rb b/hello.rb +index 2aabb6e..2ae9ba4 100644 +--- a/hello.rb ++++ b/hello.rb +@@ -1,7 +1,8 @@ + class HelloWorld + ++ # says hello + def self.hello +- puts "hello world" ++ puts "bonjour monde" + end + + end ++ +
Si nous ne voulons pas de l'affichage complet des modifications,
+ mais souhaitons davantage que la sortie de git status
,
+ on peut utiliser l'option --stat
, qui nous donnera
+ à la place un résumé. Voici le même exemple que
+ précédemment, mais en utilisant l'option --stat
.
+
+$ git status -s +MM hello.rb +$ git diff --stat + hello.rb | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) +$ git diff --staged --stat + hello.rb | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) +$ git diff HEAD --stat + hello.rb | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) ++ +
+ Vous pouvez aussi ajouter des chemins à la fin de n’importe laquelle
+ de ces variantes pour réduire la sortie de diff
+ à des fichiers ou dossiers spécifiques.
+
+ Pour résumer,
+ vous exécutez git diff
pour voir les détails de la commande
+ git status
: dans quelle mesure les fichiers ont été
+ modifiés ou indexés, ligne par ligne.
+
Maintenant que vous avez indexé le contenu dont vous voulez faire un instantané
+ avec la commande git add
, vous exécutez git commit
+ pour enregistrer l'instantané.
+ Git enregistre vos nom et adresse email, il faut donc commencer par indiquer
+ leurs valeurs à Git.
+
+$ git config --global user.name 'Votre Nom' +$ git config --global user.email vous@domaine.fr ++ +
Indexons et validons tous les changements de notre fichier
+ hello.rb
. Dans ce premier exemple, nous allons utiliser
+ l'option -m
pour fournir un message de commit sur la ligne
+ de commande.
+
+$ git add hello.rb
+$ git status -s
+M hello.rb
+$ git commit -m 'mes modifications bonjour monde'
+[master 68aa034] mes modifications bonjour monde
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+
+ Nous avons désormais enregistré un instantané. Si nous exécutons
+ git status
à nouveau, nous allons voir que « la copie
+ de travail est propre », ce qui signifie que nous n'avons fait aucune
+ modification depuis notre dernier commit—il n'y a aucun
+ travail en attente.
+$ git status +# On branch master +nothing to commit (working directory clean) ++ +
Si vous n'utilisez pas l'option -m
option, Git va essayer
+ d'ouvrir un éditeur de texte pour écrire votre message de commit.
+ Dans vim
, qui est utilisé par défaut à moins que vous
+ n'ayez configuré une alternative à utiliser, votre écran ressemblera
+ vraisemblablement à cela :
+
+ +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# On branch master +# Changes to be committed: +# (use "git reset HEAD <file>..." to unstage) +# +# modified: hello.rb +# +~ +~ +".git/COMMIT_EDITMSG" 9L, 257C ++ +
À ce stade vous ajoutez votre message de commit final au tout
+ début du document. Toute ligne qui commence par « # » sera ignorée—Git
+ va vous y ajouter la sortie de la commande git status
+ pour vous rappeler ce que vous avez modifié et indexé.
En règle générale, il est très important d'écrire de bons messages de commit. + Pour des projets libres, par convention vous écrirez votre message + plus ou moins dans ce format :
+ ++Un court (50 caractères ou moins) résumé des modifications + +Un texte explicatif plus détaillé, si nécessaire. Faites le tenir +sur environ 72 caractères. Dans certains cas, la première ligne est +traitée comme le sujet d'un email et le reste du texte comme le corps. +Le saut de ligne entre le résumé et le corps est très important +(à moins que vous omettiez complètement le corps) ; certains outils git +peuvent mal fonctionner si vous les mettez l'un après l'autre. + +Les paragraphes supplémentaires viennent après d'autres sauts de ligne. + + - Les listes à puces sont possibles, aussi + + - Typiquement, un tiret ou une astérisque est utilisée comme puce, + précédée d'une seule espace, séparées par des sauts de ligne, mais + différentes conventions existent + +# Please enter the commit message for your changes. Lines starting +# with '#' will be ignored, and an empty message aborts the commit. +# On branch master +# Changes to be committed: +# (use "git reset HEAD <file>..." to unstage) +# +# modified: hello.rb +# +~ +~ +~ +".git/COMMIT_EDITMSG" 25L, 884C written ++ +
+ Le message de commit est très important. Étant donné qu'une grande + part de la puissance de Git est cette souplesse dans la création attentionnée + des commits en local pour les partager ensuite, c'est très utile de + pouvoir écrire trois ou quatre validations sur des modifications indépendantes + afin que votre travail puisse être examiné plus facilement par vos pairs. + Étant donné qu'il y a une différence entre créer un commit et pousser ses modifications, + prenez bien le temps de faciliter aux personnes avec lesquelles vous travaillez + la lecture de ce que vous avez fait en plaçant chaque modification indépendante + dans un commit propre avec un joli message pour que ce soit + simple pour eux de voir ce que vous faites et pourquoi.
+ +Si l'étape git add
du flux de travail vous paraît lourde,
+ Git vous permet de sauter celle-ci avec l'option -a
.
+ Cela va simplement dire à Git d'exécuter git add
sur
+ chaque fichier qui est « suivi »—c'est-à-dire, chaque fichier qui fait
+ partie de votre dernier commit et qui a été modifié. Cela vous permet
+ d'avoir un flux de travail plus proche de celui de Subversion si vous le voulez,
+ en éditant simplement vos fichiers puis en exécutant git commit -a
+ pour réaliser un instantané de tout ce qui a changé. Vous aurez toujours à
+ exécuter git add
pour commencer à suivre de nouveaux fichiers,
+ néanmoins, tout comme avec Subversion.
+
+$ vim hello.rb +$ git status -s + M hello.rb +$ git commit -m 'changes to hello file' +# On branch master +# Changed but not updated: +# (use "git add <file>..." to update what will be committed) +# (use "git checkout -- <file>..." to discard changes in working directory) +# +# modified: hello.rb +# +no changes added to commit (use "git add" and/or "git commit -a") +$ git commit -am 'changes to hello file' +[master 78b2670] changes to hello file + 1 files changed, 2 insertions(+), 1 deletions(-) ++ +
Notez que si vous n'indexez aucune modification et que vous exécutez
+ git commit
, Git va simplement vous retourner la sortie de la
+ commande git status
, pour vous rappeler que rien n'a été indexé.
+ La partie importante de ce message a été mise en exergue, et signifie que
+ rien n'a été ajouté pour commit. Si vous utilisez -a
,
+ cela va tout ajouter et créer un commit en même temps.
+
Cela va vous permettre de finaliser le flux de travail complet des
+ instantanés—vous faites des modifications à vos fichiers, vous utilisez
+ ensuite git add
pour indexer les fichiers que vous avez
+ modifiés, git status
et git diff
pour voir
+ ce que vous avez modifié, et finalement git commit
+ pour enregistrer définitivement votre instantané.
+ Pour résumer,
+ vous exécutez git commit
pour enregistrer l'instantané
+ de votre contenu indexé. Cet instantané peut ensuite être comparé,
+ partagé et rembobiné au besoin.
+
git reset
est probablement la commande source de la plus
+ grande confusion jamais écrite, mais elle peut être extrêmement utile
+ une fois qu'on en a saisi le principe. Il y a trois invocations spécifiques
+ de cette commande qui sont communément utilisées.
+
Pour commencer, vous pouvez l'utiliser pour enlever quelque chose de placé
+ accidentellement dans l'index. Imaginons que vous avez modifié
+ deux fichiers et que vous vouliez les enregistrer dans deux commits différents.
+ Vous devriez indexer et faire un commit pour un fichier, puis indexer et faire un commit
+ pour l'autre. Si vous avez accidentellement indexé les deux, comment
+ en désindexer un ? Vous le faites avec
+ git reset HEAD -- fichier
. Techniquement vous n'avez pas à ajouter
+ le --
—il est utilisé pour dire à Git où se termine la liste des options
+ et où commence la liste des chemins, mais c'est probablement une bonne idée
+ de prendre l'habitude de l'utiliser pour séparer les options des chemins
+ même si vous n'en avez pas besoin.
+
Voyons à quoi cela ressemble de désindexer quelque chose. + Ici nous avons deux fichiers qui ont été modifiés depuis notre dernier commit. + Nous allons les indexer tous les deux, puis en désindexer un des deux.
+ ++$ git status -s + M README + M hello.rb +$ git add . +$ git status -s +M README +M hello.rb +$ git reset HEAD -- hello.rb +Unstaged changes after reset: +M hello.rb +$ git status -s +M README + M hello.rb ++ +
Vous pouvez alors exécuter git commit
qui va juste
+ enregistrer les modifications du fichier README
, pas celles
+ du fichier hello.rb
.
+
+ Si vous êtes curieux, ce que Git fait concrètement ici est de recaler
+ la somme de contrôle de l'entrée de ce fichier dans l'index à ce qu'elle
+ était dans la dernière validation. Vu que git add
crée une somme
+ de contrôle d'un fichier et l'ajoute à l'index, git reset HEAD
+ écrase cela avec sa valeur précédente, pour ainsi effectivement le sortir
+ de l'index.
+
+ Si vous voulez être capable de simplement exécuter git unstage
,
+ vous pouvez facilement définir un alias dans Git. Exécutez simplement
+ git config --global alias.unstage "reset HEAD"
.
+ Une fois exécuté, vous pouvez ensuite exécuter
+ git unstage [fichier]
à la place.
+
Si vous oubliez quelle est la commande pour désindexer
+ quelque chose, Git vient à votre aide en vous le rappelant
+ dans la sortie de la commande normale git status
.
+ Par exemple, si vous exécutez git status
sans le
+ -s
quand vous avez des fichiers indexés, il vous
+ dira comment les sortir de l'index :
+$ git status +# On branch master +# Changes to be committed: +# (use "git reset HEAD <file>..." to unstage) +# +# modified: README +# modified: hello.rb +# ++ +
Quand vous exécutez git reset
sans spécifier un drapeau
+ il utilise par défaut --mixed
. Les autres options sont
+ --soft
et --hard
.
La première chose que fait git reset
est d'annuler
+ le dernier commit et remettre les fichiers dans l'index.
+ Si vous incluez le drapeau --soft
il s'arrête là.
+ Par exemple, si vous exécutez git reset --soft HEAD~
+ (le parent de HEAD) le dernier commit sera annulé et les fichiers
+ modifiés seront mis à nouveau dans l'index.
+$ git status -s +M hello.rb +$ git commit -am 'hello with a flower' +[master 5857ac1] hello with a flower + 1 files changed, 3 insertions(+), 1 deletions(-) +$ git status +# On branch master +nothing to commit (working directory clean) +$ git reset --soft HEAD~ +$ git status -s +M hello.rb ++ +
Ça fait en gros la même chose que
+ git commit --amend
, vous permettant de continuer
+ à travailler avant que vous n'ajoutiez les modifications de fichiers
+ dans le même commit.
La troisième option est --hard
. Cette variante annule toute
+ modification indexée ou présente dans la copie de travail. En d'autres
+ termes, elle ramène les deux à leur état du dernier commit en date.
+ C'est la variante la plus dangereuse, car elle peut passer à la trappe
+ des modifications de votre copie de travail. Toute modification
+ non validée au préalable sera perdue.
+$ git status +# On branch master +# Changes to be committed: +# (use "git reset HEAD <file>..." to unstage) +# +# modified: README +# +# Changes not staged for commit: +# (use "git add <file>..." to update what will be committed) +# (use "git checkout -- <file>..." to discard changes in working directory) +# +# modified: README +# +$ git reset --hard HEAD +HEAD is now at 5857ac1 hello with a flower +$ git status +# On branch master +nothing to commit (working directory clean) ++ +
Dans l'exemple ci-dessus, alors que nous avions toutes les modifications
+ prêtes à être validées et ajoutées, un git reset --hard
+ les a complètement supprimées. Le dossier de travail et l'index
+ sont ré-initialisés à la pointe de la branche courante ou HEAD.
Vous pouvez remplacer HEAD
avec le SHA-1 d'un commit
+ ou une autre référence vers un parent pour ré-initialiser en un point
+ spécifique.
+ Pour résumer,
+ vous exécutez git reset HEAD
pour annuler le dernier commit,
+ sortir de l'index des fichiers sur lesquels vous aviez exécuté
+ git add
et que vous ne désirez pas inclure dans le prochain
+ commit.
git rm
va supprimer des entrées de l'index.
+ C'est un peu différent de git reset HEAD
qui désindexe des
+ fichiers. Désindexer signifie recaler l'index à l'état dans lequel
+ il était avant que nous fassions des modifications. git rm
d'un
+ autre côté sort complétement le fichier de l'index, de sorte
+ qu'il ne sera pas inclus dans le prochain commit,
+ le supprimant ainsi carrément.
Par défaut, un git rm file
va supprimer complètement
+ le fichier de l'index et aussi de votre disque (le dossier
+ de travail). Pour laisser le fichier dans le dossier de travail,
+ vous pouvez utiliser git rm --staged
.
+ Contrairement à la plupart des systèmes de gestion de sources, Git ne
+ suit pas le renommage des fichiers. À la place, il suit juste les commits
+ et arrive par la suite à réaliser quels fichiers ont pu être renommés
+ en comparant les commits. Si un fichier a été supprimé d'un commit
+ et un autre fichier a été ajouté au suivant avec un contenu similaire,
+ Git supposera que c'est sûrement un renommage. Alors, bien que la commande
+ git mv
existe, elle est superflue—tout ce qu'elle fait est un
+ git rm --staged
, renomme le fichier sur le disque, puis exécute un
+ git add
sur le nouveau fichier. Vous n'avez pas vraiment besoin
+ de l'utiliser, mais si cela vous semble plus simple, n'hésitez pas.
+
+ La commande est communément utilisée pour supprimer les fichiers.
+ Mais il est souvent plus simple de juste supprimer les fichiers du disque
+ puis exécuter git commit -a
, ce qui va également automatiquement
+ les supprimer de l'index.
+ Pour résumer,
+ vous exécutez git rm
pour supprimer des fichiers du suivi de Git.
+ Cela va également les supprimer de votre dossier de travail.
+
Vous êtes au beau milieu de modifications mais quelque chose se présente
+ qui nécessite que vous vous en occupiez, comme une très-très-urgente
+ correction de bug, mais ne souhaitez pas valider ou perdre vos modifications
+ en cours. git stash
est là pour vous.
+
Un remisage prend l'état courant de votre dossier de travail et de l'index, + les place sur une pile pour plus tard, et vous offre en retour un dossier + de travail propre. Cela va vous ramener à l'état du dernier commit. +
+ +Si vous avez des fichiers non suivis, git stash
ne les inclura pas.
+ Vous pouvez soit les indexer avec git add
(sans faire un commit)
+ avant de les remiser, ou, si vous avez une version récente de Git
+ (1.7.7 ou plus), vous pouvez utiliser git stash -u
pour aussi
+ remiser des fichiers non versionnés.
+$ git status -s
+M hello.rb
+$ git stash
+Saved working directory and index state WIP on master: 5857ac1 hello with a flower
+HEAD is now at 5857ac1 hello with a flower
+$ git status
+# On branch master
+nothing to commit (working directory clean)
+
+
+ C'est utile de savoir ce que vous avez stocké sur la pile et c'est la où
+ git stash list
entre en jeu. Exécuter cette commande
+ va vous afficher la liste courante des éléments remisés.
+
+$ git stash list +stash@{0}: WIP on master: 5857ac1 hello with a flower ++ +
Le dernier élément ajouté sur la pile sera référencé par
+ stash@{0}
et incrémentera d'une unité la référence
+ vers les éléments déjà présents.
+
+$ vim hello.rb +$ git commit -am 'it stops raining' +[master ee2d2c6] it stops raining +1 files changed, 1 insertions(+), 1 deletions(-) +$ vim hello.rb +$ git stash +Saved working directory and index state WIP on master: ee2d2c6 it stops raining +HEAD is now at ee2d2c6 it stops raining +$ git stash list +stash@{0}: WIP on master: ee2d2c6 it stops raining +stash@{1}: WIP on master: 5857ac1 hello with a flower ++ +
Quand vous êtes prêt à reprendre là où vous en êtiez, exécutez la
+ commande git stash apply
pour appliquer dans le dossier
+ de travail des modifications remisées.
+
+$ git stash apply
+# On branch master
+# Changes not staged for commit:
+# (use "git add <file>..." to update what will be committed)
+# (use "git checkout -- <file>..." to discard changes in working directory)
+#
+# modified: hello.rb
+#
+no changes added to commit (use "git add" and/or "git commit -a")
+
+
+ Par défaut cela va appliquer le dernier élément remisé au dossier
+ de travail. Ce sera l'élément référencé par stash@{0}
.
+ Vous pouvez récupérer à la place un autre élément remisé si vous le référencez
+ dans la liste des arguments. Par exemple, git stash apply stash@{1}
+ va appliquer l'élément référencé par stash@{1}
.
+
Si vous voulez également supprimer l'élément de la pile en même temps,
+ utilisez git stash pop
à la place.
+
Quand vous en avez fini avec un élément remisé et/ou vous voulez le
+ supprimer de la liste, exécutez la commande git stash drop
.
+ Par défaut cela va supprimer le dernier élément remisé ajouté. Vous pouvez
+ aussi supprimer un élément en particulier si vous l'indiquez en tant qu'argument.
+
Dans cet exemple, notre pile a au moins deux éléments, mais nous
+ voulons nous débarasser de l'élément ajouté avant le dernier, qui
+ est référencé par stash@{1}
.
+
+$ git stash drop stash@{1} +Dropped stash@{1} (0b1478540189f30fef9804684673907c65865d8f) ++ +
Si vous voulez supprimer tous les éléments remisés, exécutez juste
+ la commande git stash clear
. Mais faites cela seulement
+ si vous êtes sûr d'en avoir fini avec la pile.
+
+ Pour résumer, exécutez git stash
pour rapidement
+ remiser des modifications que vous n'êtes pas prêt à valider ou sauver, mais
+ auxquelles vous voulez revenir après avoir travaillé sur autre chose.
+
Aller à Création de Branches et Fusion »
diff --git a/fr/branching/index.html b/fr/branching/index.html new file mode 100644 index 0000000..c148544 --- /dev/null +++ b/fr/branching/index.html @@ -0,0 +1,897 @@ +--- +layout: fr_reference +--- + +Les branches sont une des nombreuses fonctionnalités intéressantes de Git. + Si vous avez utilisé d'autres systèmes de gestion de versions, il sera + probablement utile d'oublier tout ce que vous savez sur les branches—En fait, + il sera encore plus utile de les voir quasiment comme des + contextes car c'est la façon la plus courante dont vous allez + vous en servir. Quand vous basculez dans une branche, vous changez de + contexte de travail, et vous pouvez rapidement basculer de l'une à l'autre. +
+ +
+ Pour résumer, vous pouvez créer une branche avec
+ git branch (nombranche)
, basculer dans ce contexte avec
+ git checkout (nombranche)
, enregistrer un commit
+ depuis ce contexte, puis basculer d'une branche à l'autre facilement.
+ Quand vous changez de branche, Git remplace votre dossier de travail
+ avec l'instantané du dernier commit de cette branche afin que vous
+ n'ayez pas de multiples dossiers pour de multiples branches. Vous fusionnez
+ des branches ensemble avec git merge
. Vous pouvez facilement
+ faire plusieurs fusions étalées dans le temps depuis la même branche,
+ ou alternativement vous pouvez choisir de supprimer une branche dès
+ que vous l'avez fusionnée.
+
La commande git branch
est un outil de gestion général des branches
+ de Git et peut faire de nombreuses choses différentes. Nous allons aborder
+ celles de base que vous utiliserez le plus souvent—lister les branches, créer
+ des branches et supprimer des branches. Nous allons aussi aborder
+ git checkout
ici qui vous permet de basculer entre branches.
+
Sans argument, git branch
va lister vos branches locales.
+ La branche courante sur laquelle vous êtes sera précédée d'un astérisque
+ et si vous avez
+ la colorisation activée,
+ la branche courante sera affichée en vert.
+
+$ git branch
+* master
+
+
+ Cela signifie que nous avons une branche « master » et que nous sommes sur
+ celle-ci. Quand vous exécutez git init
cela va automatiquement
+ créer une branche « master » pour vous par défaut, néanmoins il n'y a rien
+ de particulier dans ce nom—vous n'avez pas en fait à avoir de branche « master »
+ mais étant donné qu'elle est créée par défaut, la plupart des projets en ont une.
+
Commençons par créer une nouvelle branche puis basculons vers celle-ci.
+ Vous pouvez le faire en exécutant git branch (nombranche)
.
+
+$ git branch testing
+$ git branch
+* master
+ testing
+
+
+ Vous pouvez voir que nous avons une nouvelle branche. Quand vous créez une
+ branche de cette manière cela crée la branche basée sur votre dernier commit
+ donc si à ce stade vous créez des commits puis basculez vers « testing »,
+ vous rétablirez le contexte de votre dossier de travail à celui où il était
+ lorsque la branche a été créée initialement—Vous pouvez penser à cela comme
+ un signet qui indique où vous en êtes. Voyons cela en action—nous utilisons
+ git checkout (branche)
pour changer de branche courante.
+
+$ ls +README hello.rb +$ echo 'test content' > test.txt +$ echo 'more content' > more.txt +$ git add *.txt +$ git commit -m 'added two files' +[master 8bd6d8b] added two files + 2 files changed, 2 insertions(+), 0 deletions(-) + create mode 100644 more.txt + create mode 100644 test.txt +$ ls +README hello.rb more.txt test.txt +$ git checkout testing +Switched to branch 'testing' +$ ls +README hello.rb ++ +
Nous voyons que lorsque nous basculons vers la branche « testing », + nos nouveaux fichiers ont disparu. Nous pouvons retourner vers la + branche « master » et les voir ré-apparaître.
+ ++$ ls +README hello.rb +$ git checkout master +Switched to branch 'master' +$ ls +README hello.rb more.txt test.txt ++ +
Si nous voulons voir les derniers commits de chaque branche
+ nous pouvons exécuter git branch -v
pour les voir.
+$ git branch -v
+* master 54b417d fix javascript issue
+ development 74c111d modify component.json file
+ testing 62a557a update test scripts
+
+
+
+ Dans la plupart des cas vous voudrez basculer vers la branche immédiatement,
+ afin de pouvoir y travailler puis la fusionner plus tard dans une branche qui contient
+ seulement du travail stable (comme « master ») lorsque le travail
+ dans votre nouvelle branche sera stable. Vous pouvez faire cela
+ relativement facilement avec
+ git branch nouvellebranche; git checkout nouvellebranche
,
+ mais Git a un raccourci pour cela : git checkout -b nouvellebranche
.
+
+$ git branch +* master +$ ls +README hello.rb more.txt test.txt +$ git checkout -b removals +Switched to a new branch 'removals' +$ git rm more.txt +rm 'more.txt' +$ git rm test.txt +rm 'test.txt' +$ ls +README hello.rb +$ git commit -am 'removed useless files' +[removals 8f7c949] removed useless files + 2 files changed, 0 insertions(+), 2 deletions(-) + delete mode 100644 more.txt + delete mode 100644 test.txt +$ git checkout master +Switched to branch 'master' +$ ls +README hello.rb more.txt test.txt ++ +
Vous pouvez voir ici comment nous avons créé une branche, supprimé certains de nos + fichiers depuis le contexte de cette branche, puis nous sommes retournés dans + notre branche principale et nous voyons à nouveau nos fichiers. Les branches + isolent de manière sécurisée le travail que nous faisons dans des contextes + entre lesquels nous pouvons basculer.
+ ++ Si vous démarrez un travail il est très sutile de toujours le démarrer dans une + branche (parce-que cela est rapide et facile à faire) puis de le fusionner et + supprimer la branche quand vous en avez terminé. De cette manière si ce sur quoi + vous travaillez ne convient pas vous pouvez facilement vous en débarasser, et + si vous êtes forcé de basculer vers un contexte de travail plus stable, votre travail + en cours est facile à mettre de côté et à retrouver plus tard.
+ +Si nous voulons supprimer une branche (comme la branche « testing » de
+ l'exemple précédent vu qu'il n'y a aucun travail particulier sur celle-ci),
+ nous pouvons exécuter git branch -d (branche)
pour la supprimer.
+$ git branch +* master + testing +$ git branch -d testing +Deleted branch testing (was 78b2670). +$ git branch +* master ++ +
Quand vous en avez fini avec une branche distante, qu'elle ait
+ été fusionnée dans le dépôt distant ou que vous vouliez l'abandonner
+ et la cacher des regards, vous exécuterez la commande git push
+ avec un symbôle deux-points savamment placé pour supprimer la branche :
+$ git push origin :tidy-cutlery +To git@github.com:octocat/Spoon-Knife.git + - [deleted] tidy-cutlery ++ +
Dans l'exemple ci-dessus vous avez supprimé la branche « tidy-cutlery »
+ du dépôt distant « origin ». Un moyen de se souvenir de cette syntaxe est
+ de penser à celle de
+ git push nom-distant branche-locale:branche-distante
.
+ Cela signifie que vous désirez pousser votre branche locale pour
+ qu'elle soit similaire sur le dépôt distant. Quand vous supprimez
+ la portion branche-locale
vous ne faites alors plus rien
+ correspondre sur le dépôt distant, signifiant concrètement à la
+ branche distante d'être nulle.
+
Alternativement, vous pouvez exécuter
+ git push nom-distant --delete nombranche
+ qui est un raccourci de la syntaxe deux-points (une paire
+ source:destination
) de suppression d'une branche distante.
+
+ Pour résumer, vous utilisez git branch
pour lister
+ vos branches, créer de nouvelles branches et supprimer des branches
+ inutiles ou qui ont été fusionnées.
+
Une fois isolé un travail dans une branche, vous allez peut-être
+ l'incorporer dans votre branche principale. Vous pouvez fusionner
+ toute branche dans votre branche courante avec la commande
+ git merge
. Prenons comme exemple simple la branche
+ « removals » précédente. Si nous créons une branche et supprimons les fichiers
+ qui s'y trouvent puis que nous validons ces suppressions dans cette branche,
+ cela est isolé de notre branche principale (« master », dans notre cas). Pour
+ inclure ces suppressions dans notre branche « master », vous pouvez simplement
+ fusionner la branche « removals ».
+
+$ git branch +* master + removals +$ ls +README hello.rb more.txt test.txt +$ git merge removals +Updating 8bd6d8b..8f7c949 +Fast-forward + more.txt | 1 - + test.txt | 1 - + 2 files changed, 0 insertions(+), 2 deletions(-) + delete mode 100644 more.txt + delete mode 100644 test.txt +$ ls +README hello.rb ++ +
Bien sûr, cela ne marche pas juste pour de simples ajouts et suppressions + de fichiers. Git va tout autant fusionner les modifications de fichiers—En + fait, il est même très bon pour ça. Par exemple, voyons ce qu'il arrive + quand on édite un fichier dans une branche et nous le renommons et puis + l'éditons dans une autre branche et enfin nous fusionnons ensemble + ces branches. Chaos, vous avez dit ? Voyons cela. +
+ ++$ git branch +* master +$ cat hello.rb +class HelloWorld + def self.hello + puts "Hello World" + end +end + +HelloWorld.hello ++ +
Nous allons donc commencer par créer une nouvelle branche nommée + « change_class », puis basculer vers celle-ci afin que les modifications + de renommage de classe soient isolées. Nous allons changer chaque + occurrence de « HelloWorld » en « HiWorld ».
+ ++$ git checkout -b change_class +Switched to a new branch 'change_class' +$ vim hello.rb +$ head -1 hello.rb +class HiWorld +$ git commit -am 'changed the class name' +[change_class 3467b0a] changed the class name + 1 files changed, 2 insertions(+), 4 deletions(-) ++ +
Nous avons alors validé les changements de nom de la classe dans
+ une branche « change_class ». En retournant vers la branche « master »
+ le nom de la classe sera ré-initialisé à ce à quoi il était avant
+ que nous changions de branche. Ici nous pouvons modifier quelque chose
+ de différent (dans ce cas la sortie affichée) et en même temps
+ renommer le fichier hello.rb
en ruby.rb
.
+
+$ git checkout master +Switched to branch 'master' +$ git mv hello.rb ruby.rb +$ vim ruby.rb +$ git diff +diff --git a/ruby.rb b/ruby.rb +index 2aabb6e..bf64b17 100644 +--- a/ruby.rb ++++ b/ruby.rb +@@ -1,7 +1,7 @@ + class HelloWorld + + def self.hello +- puts "Hello World" ++ puts "Hello World from Ruby" + end + + end +$ git commit -am 'added from ruby' +[master b7ae93b] added from ruby + 1 files changed, 1 insertions(+), 1 deletions(-) + rename hello.rb => ruby.rb (65%) ++ +
Désormais ces modifications sont sauvées dans la branche « master ». Notez + que le nom de la classe est de nouveau « HelloWorld », et non « HiWorld ». + Pou incorporer le changement « HiWorld » nous pouvons juste fusionner + la branche « change_class ». Néanmoins, le nom du fichier a changé depuis + que nous avons changé de branche, que va faire Git ?
+ ++$ git branch + change_class +* master +$ git merge change_class +Renaming hello.rb => ruby.rb +Auto-merging ruby.rb +Merge made by recursive. + ruby.rb | 6 ++---- + 1 files changed, 2 insertions(+), 4 deletions(-) +$ cat ruby.rb +class HiWorld + def self.hello + puts "Hello World from Ruby" + end +end + +HiWorld.hello ++ +
Et bien, il va simplement s'en rendre compte. Notez qu'il n'y a aucun conflit de + fusion et que le fichier qui a été renommé a désormais le changement de nom + de classe « HiWorld » qui a été fait dans l'autre branche. Plutôt cool.
+ +Les fusions Git relèvent donc de la magie, nous n'avons jamais à traiter + des conflits de fusion ? Pas tout à fait. Dans des situations où + un même bloc de code est édité dans différentes branches il n'y a aucun moyen + pour un ordinateur de s'y retrouver, alors c'est à nous de nous débrouiller. + Voyons un autre exemple de changement d'une même ligne dans deux branches. +
+ ++$ git branch +* master +$ git checkout -b fix_readme +Switched to a new branch 'fix_readme' +$ vim README +$ git commit -am 'fixed readme title' +[fix_readme 3ac015d] fixed readme title + 1 files changed, 1 insertions(+), 1 deletions(-) ++ +
Nous avons alors créé un commit du changement d'une ligne dans notre + fichier README dans une branche. Maintenant changeons la même ligne + d'une manière différente depuis notre branche « master ».
+ ++$ git checkout master +Switched to branch 'master' +$ vim README +$ git commit -am 'fixed readme title differently' +[master 3cbb6aa] fixed readme title differently + 1 files changed, 1 insertions(+), 1 deletions(-) ++ +
Arrive le plus amusant—nous allons fusionner la première + branche dans notre branche « master », provoquant un conflit de fusion.
+ ++$ git merge fix_readme +Auto-merging README +CONFLICT (content): Merge conflict in README +Automatic merge failed; fix conflicts and then commit the result. +$ cat README +<<<<<<< HEAD +Many Hello World Examples +======= +Hello World Lang Examples +>>>>>>> fix_readme + +This project has examples of hello world in +nearly every programming language. ++ +
Vous pouvez voir que Git insère des marqueurs standards de conflit de fusion, + très similaires à Subversion, dans les fichiers qui ont un conflit de fusion. + Maintenant c'est à vous de les résoudre. Nous allons le faire manuellement, + mais regardez + git mergetool + si vous voulez que Git lance un outil graphique de fusion + (comme kdiff3, emerge, p4merge, etc) à la place. +
+ ++$ vim README # here I'm fixing the conflict +$ git diff +diff --cc README +index 9103e27,69cad1a..0000000 +--- a/README ++++ b/README +@@@ -1,4 -1,4 +1,4 @@@ +- Many Hello World Examples + -Hello World Lang Examples +++Many Hello World Lang Examples + + This project has examples of hello world in ++ +
Un bon conseil lors de la résolution de conflit de fusion est que si
+ vous exécutez git diff
, cela va vous montrer chaque côté
+ du conflit et comment vous l'avez résolu comme affiché ici. Maintenant
+ il est l'heure de marquer notre fichier comme résolu. Avec Git on le fait
+ avec git add
—pour dire à Git que le fichier a été résolu
+ vous devez l'indexer.
+$ git status -s +UU README +$ git add README +$ git status -s +M README +$ git commit +[master 8d585ea] Merge branch 'fix_readme' ++ +
Et nous avons alors résolu avec succès notre conflit de fusion et créé + un commit avec le résultat.
+ +
+ Pour résumer, vous utilisez git merge
pour combiner
+ un autre contexte de branche dans votre branche courante. Cela va
+ automatiquement décider comment combiner au mieux les différents instantanés
+ en un nouvel instantané avec le travail propre de chaque.
+
Jusqu'à présent nous créé des commits des instantanés de votre projet et basculé
+ entre différents contextes isolés, mais comment faire si nous avons oublié
+ comment nous en sommes arrivés à un certain point ? Ou si nous voulons
+ savoir à quel point une branche diffère d'une autre ? Git fournit un outil
+ qui affiche tous les messages de commits qui vous ont amené jusqu'à
+ votre commit courant, appelé git log
.
Pour comprendre la commande d'historique, vous devez connaître quelles
+ informations sont stockées quand vous exécutez la commande
+ git commit
pour enregistrer un instantané. En plus de la référence
+ des fichiers et du message de commit et des informations sur l'auteur
+ du commit, Git stocke également le commit sur laquelle vous avez
+ basé votre instantané. C'est-à-dire que, si vous clonez un projet, quel
+ est l'instantané que vous avez modifié pour obtenir l'instantané que vous
+ avez enregistré ? C'est utile pour savoir comment
+ le projet est arrivé à cet état et permet à Git de savoir qui a changé quoi.
+ Si Git a l'instantané que vous avez sauvegardé et celui sur lequel vous vous
+ êtes basé, alors il peut automatiquement savoir ce que vous avez changé.
+ Le commit sur lequel un autre commit est basé est appelé le
+ « parent ».
+
Pour voir une liste chronologique des parents de n'importe quelle branche,
+ vous pouvez exécuter git log
quand vous êtes dans cette branche.
+ Par exemple, si vous exécutez git log
dans le projet Hello World
+ sur lequel nous avons travaillé dans cette section, nous allons voir tous les
+ messages des commits créés.
+
+$ git log +commit 8d585ea6faf99facd39b55d6f6a3b3f481ad0d3d +Merge: 3cbb6aa 3ac015d +Author: Scott Chacon <schacon@gmail.com> +Date: Fri Jun 4 12:59:47 2010 +0200 + + Merge branch 'fix_readme' + + Conflicts: + README + +commit 3cbb6aae5c0cbd711c098e113ae436801371c95e +Author: Scott Chacon <schacon@gmail.com> +Date: Fri Jun 4 12:58:53 2010 +0200 + + fixed readme title differently + +commit 3ac015da8ade34d4c7ebeffa2053fcac33fb495b +Author: Scott Chacon <schacon@gmail.com> +Date: Fri Jun 4 12:58:36 2010 +0200 + + fixed readme title + +commit 558151a95567ba4181bab5746bc8f34bd87143d6 +Merge: b7ae93b 3467b0a +Author: Scott Chacon <schacon@gmail.com> +Date: Fri Jun 4 12:37:05 2010 +0200 + + Merge branch 'change_class' +... ++ +
Pour voir une version plus compacte de ce même historique, nous pouvons
+ utiliser l'option --oneline
.
+$ git log --oneline +8d585ea Merge branch 'fix_readme' +3cbb6aa fixed readme title differently +3ac015d fixed readme title +558151a Merge branch 'change_class' +b7ae93b added from ruby +3467b0a changed the class name +17f4acf first commit ++ +
Cela nous informe que c'est l'historique du développement de ce projet. + Si les messages de commit sont descriptifs, cela peut nous informer + sur les changements apportés ou qui ont influencé l'état de l'instantané + et donc ce qu'il contient.
+ +Nous pouvons aussi l'utiliser pour voir quand l'historique a connu des
+ branches ou fusions avec l'option très utile --graph
.
+ Voici la même commande mais avec le graphe de topologie activé :
+$ git log --oneline --graph +* 8d585ea Merge branch 'fix_readme' +|\ +| * 3ac015d fixed readme title +* | 3cbb6aa fixed readme title differently +|/ +* 558151a Merge branch 'change_class' +|\ +| * 3467b0a changed the class name +* | b7ae93b added from ruby +|/ +* 17f4acf first commit ++ +
Nous pouvons alors voir quand le travail a divergé et puis a
+ été fusionné. C'est très pratique pour voir ce qui s'est passé ou
+ quels changements ont été appliqués, mais c'est aussi extrêmement utile
+ pour gérer vos branches. Créons une nouvelle branche, effectuons
+ du travail dans celle-ci puis basculons et faisons du travail dans notre
+ branche master, puis voyons comment la commande log
peut
+ nous aider à savoir ce qui se passe sur chacune d'elle.
D'abord nous allons créer une nouvelle branche pour ajouter le langage + Erlang comme exemple Hello World—nous désirons le faire dans une branche + afin de ne pas casser notre branche stable avec du code qui peut ne pas + fonctionner pendant un certain temps pour pouvoir basculer proprement + depuis ou vers cette branche.
+ ++$ git checkout -b erlang +Switched to a new branch 'erlang' +$ vim erlang_hw.erl +$ git add erlang_hw.erl +$ git commit -m 'added erlang' +[erlang ab5ab4c] added erlang + 1 files changed, 5 insertions(+), 0 deletions(-) + create mode 100644 erlang_hw.erl ++ +
Étant donné que nous nous amusons beaucoup avec les langages de + programmation fonctionnelle nous restons dans notre lancée et ajoutons + également un programme exemple Haskell alors que nous sommes toujours + dans la branche « erlang ».
+ ++$ vim haskell.hs +$ git add haskell.hs +$ git commit -m 'added haskell' +[erlang 1834130] added haskell + 1 files changed, 4 insertions(+), 0 deletions(-) + create mode 100644 haskell.hs ++ +
Enfin, nous décidons de remettre le nom de classe de notre programme Ruby + à ce qu'il était précédemment. Alors, nous pouvons retourner à la branche + master, le changer et décider de le valider directement dans la branche + master au lieu de créer une autre branche.
+ ++$ git checkout master +Switched to branch 'master' +$ ls +README ruby.rb +$ vim ruby.rb +$ git commit -am 'reverted to old class name' +[master 594f90b] reverted to old class name + 1 files changed, 2 insertions(+), 2 deletions(-) ++ +
Imaginons alors que nous ne travaillons pas sur le projet
+ pendant quelques temps, ayant autre chose à faire. Quand nous
+ y revenons nous voulons en savoir plus sur la branche « erlang » et
+ où nous nous en sommes arrêtés sur la branche master. Juste en regardant
+ le nom de la branche, nous ne pouvons savoir que nous avons fait des modifications
+ en Haskell dans celle-ci, mais en utilisant git log
nous pouvons
+ facilement le savoir. Si vous donnez à Git un nom de branche, cela va vous afficher
+ uniquement les commits qui sont « accessibles » dans l'historique de cette
+ branche, c'est-à-dire les commits qui ont influencé l'instantané
+ final.
+$ git log --oneline erlang
+1834130 added haskell
+ab5ab4c added erlang
+8d585ea Merge branch 'fix_readme'
+3cbb6aa fixed readme title differently
+3ac015d fixed readme title
+558151a Merge branch 'change_class'
+b7ae93b added from ruby
+3467b0a changed the class name
+17f4acf first commit
+
+
+ De cette manière, c'est très simple de voir que nous avons du code Haskell + inclus dans la branche (mis en surbrillance dans la sortie). + Ce qui est encore plus cool est que nous pouvons facilement dire à Git + que nous sommes seulement intéressés par les commits qui sont + accessibles dans une branche mais non accessibles dans une autre, en d'autres + termes quelles validations sont uniques à une branche par rapport à une autre. +
+ +
+ Dans ce cas si nous sommes intéressés par la fusion de la branche « erlang »
+ nous voulons savoir quelles validations vont affecter notre instantané
+ quand nous allons fusionner. Pour dire à Git de le faire on utilise
+ un ^
devant la branche que nous ne voulons voir. Par exemple,
+ si nous voulons voir les validations qui sont dans la branche « erlang »
+ qui ne sont pas dans la branche « master », on peut exécuter
+ erlang ^master
, et vice-versa. Notez que la ligne de
+ commande Windows traite ^
comme un caractère spécial,
+ dans ce cas vous devrez mettre ^master
entre guillemets.
+
+$ git log --oneline erlang ^master +1834130 added haskell +ab5ab4c added erlang +$ git log --oneline master ^erlang +594f90b reverted to old class name ++ +
Cela nous donne un outil de gestion de branche simple et pratique. + Cela nous permet de facilement voir quels commits sont uniques + à quelles branches afin de savoir ce qu'il nous manque et ce que + nous fusionnerions en cas de fusion. +
+ +
+ Pour résumer, vous pouvez utiliser git log
pour lister
+ l'historique des commits ou lister les changements faits par d'autres
+ qui ont mené l'instantané jusqu'à la pointe de la branche. Cela vous permet
+ voir comment dans un contexte le projet est arrivé à l'état dans lequel il
+ est actuellement.
+
+ Si vous arrivez à un moment qui est important et vous voulez définitivement
+ vous souvenir de ce commit spécifique, vous pouvez
+ l'étiqueter avec git tag
. La commande tag
+ va simplement mettre un signet permanent sur un commit spécifique
+ afin de pouvoir l'utiliser pour le comparer à d'autres commits dans
+ le futur. C'est souvent utilisé lorsque vous publiez une version ou vous
+ déployez quelque chose.
+
Disons que vous vouliez publier notre projet Hello World en tant
+ que version « 1.0 ». Nous pouvons étiqueter le dernier commit
+ (HEAD
) comme « v1.0 » en exécutant git tag -a v1.0
.
+ Le -a
signifie « fait une étiquette annotée », qui permet
+ de lui ajouter un message d'étiquette, ce que vous voudrez quasiment
+ toujours faire. L'exécuter sans le -a
fonctionne aussi,
+ mais cela n'enregistre pas la date, qui l'a étiqueté,
+ ou ne vous laisse pas ajouter un message d'étiquette. Il est recommandé
+ de toujours créer des étiquettes annotées.
+$ git tag -a v1.0 ++ +
Quand vous exécutez la commande git tag -a
, Git
+ va ouvrir votre éditeur et vous laisser écrire un message d'étiquette,
+ tout comme vous écririez un message de validation.
Notez alors que quand vous exécutez git log --decorate
,
+ nous pouvons voir nos étiquettes.
+$ git log --oneline --decorate --graph
+* 594f90b (HEAD, tag: v1.0, master) reverted to old class name
+* 8d585ea Merge branch 'fix_readme'
+|\
+| * 3ac015d (fix_readme) fixed readme title
+* | 3cbb6aa fixed readme title differently
+|/
+* 558151a Merge branch 'change_class'
+|\
+| * 3467b0a changed the class name
+* | b7ae93b added from ruby
+|/
+* 17f4acf first commit
+
+
+ Si nous faisons des commits supplémentaires, l'étiquette va rester + sur cet commit, nous avons alors cet instantané spécifique étiqueté + indéfiniment et nous pourrons toujours comparer de futurs instantanés + à celui-ci.
+ +Nous ne sommes pas limités à étiqueter le commit sur lequel nous sommes,
+ néanmoins. Si nous avons oublié d'étiqueter un commit que nous avons
+ publiéxe, nous pouvons rétroactivement l'étiqueter en exécutant la même
+ commande, mais avec le SHA du commit à la fin. Par exemple, disons
+ que nous avons publié le commit 558151a
(de plusieurs
+ commits en arrière) mais avons oublié de l'étiqueter à ce moment-là.
+ Nous pouvons alors l'étiqueter :
+$ git tag -a v0.9 558151a
+$ git log --oneline --decorate --graph
+* 594f90b (HEAD, tag: v1.0, master) reverted to old class name
+* 8d585ea Merge branch 'fix_readme'
+|\
+| * 3ac015d (fix_readme) fixed readme title
+* | 3cbb6aa fixed readme title differently
+|/
+* 558151a (tag: v0.9) Merge branch 'change_class'
+|\
+| * 3467b0a changed the class name
+* | b7ae93b added from ruby
+|/
+* 17f4acf first commit
+
+
+ Les étiquettes pointant sur des objets suivis par les pointes
+ des branches seront automatiquement téléchargées quand vous utilisez
+ la commande fetch
sur un dépôt distant. Néanmoins,
+ les étiquettes qui ne sont pas accessibles depuis les pointes
+ des branches seront ignorées. Si vous voulez être sûr que
+ toutes les étiquettes sont toujours incluses,
+ vous devez inclure l'option --tags
.
+
+$ git fetch origin --tags +remote: Counting objects: 1832, done. +remote: Compressing objects: 100% (726/726), done. +remote: Total 1519 (delta 1000), reused 1202 (delta 764) +Receiving objects: 100% (1519/1519), 1.30 MiB | 1.21 MiB/s, done. +Resolving deltas: 100% (1000/1000), completed with 182 local objects. +From git://github.com:example-user/example-repo + * [new tag] v1.0 -> v1.0 + * [new tag] v1.1 -> v1.1 ++ +
Si vous voulez juste une seule étiquette, utilisez
+ git fetch <dépôt-distant> tag <nom-étiquette>
.
+
Par défaut, les étiquettes ne sont pas incluses quand
+ vous utilisez la commande push
vers un dépôt distant.
+ Pour explicitement les actualiser vous devez inclure l'option
+ --tags
quand vous utilisez git push
.
+
+ Pou résumer, vous utilisez git tag
pour marquer
+ un commit ou un point dans votre dépôt comme important.
+ Cela vous permet de faire référence à ce commit avec
+ quelque chose de plus mémorable qu'un SHA.
+
Aller à Partage et Mise à Jour de Projets »
+ diff --git a/fr/cookbook.html b/fr/cookbook.html new file mode 100644 index 0000000..1e3c289 --- /dev/null +++ b/fr/cookbook.html @@ -0,0 +1,12 @@ +--- +layout: fr_reference +--- ++ Pour pouvoir faire quoi que ce soit avec Git, vous devez + avoir un dépôt Git. C'est là que Git stocke les données des + instantanés que vous créez. +
+ ++ Il y a deux moyens d'avoir un dépôt Git. Le premier est de simplement + en initialiser un depuis un dossier existant, comme un nouveau projet + ou un projet débutant sa gestion de versions. Le second est de cloner + un dépôt public Git, comme vous le feriez si vous vouliez une copie + ou si vous vouliez collaborer avec quelqu'un sur un projet. Nous allons + aborder chacun de ces cas. +
+ +Pour créer un dépôt à partir d'un répertoire de fichiers existant,
+ vous pouvez simplement faire git init
dans ce répertoire.
+ Par exemple, disons que nous avons un répertoire comprenant quelques fichiers,
+ ressemblant à :
+
+$ cd konnichiwa +$ ls +README hello.rb ++ +
C'est un projet dans lequel nous écrivons des exemples de programmes
+ « Hello World » dans chaque langage. Pour l'instant, nous avons simplement Ruby,
+ mais ce n'est qu'un début. Pour commencer à en gérer les versions avec Git,
+ nous pouvons simplement lancer git init
.
+
+$ git init +Dépôt Git vide initialisé dans /opt/konnichiwa/.git/ ++ +
Maintenant vous pouvez voir qu'il y a un sous-dossier .git
dans
+ votre projet. Ceci est votre dossier Git dans lequel toutes les données des
+ instantanés de votre projet sont conservées.
+
+$ ls -a +. .. .git README hello.rb ++ +
Félicitations, vous avez maintenant une squelette de dépôt Git et vous pouvez + maintenant commencer à prendre des instantanés de votre projet. +
+ +
+ Pour résumer, vous utilisez git init
pour initialiser
+ le contenu d'un dossier existant en un nouveau dépôt Git. Vous pouvez le faire
+ dans n'importe quel dossier à tout moment, localement.
+ Si vous avez besoin de collaborer avec quelqu'un sur un projet, ou si
+ vous voulez obtenir une copie d'un projet pour lire ou utiliser son code,
+ vous le clonerez. Vous lancez simplement la commande git clone [url]
+ avec l'URL du projet que vous voulez copier.
+
+$ git clone git://github.com/schacon/simplegit.git
+Clonage dans 'simplegit'...
+remote: Counting objects: 13, done.
+remote: Total 13 (delta 0), reused 0 (delta 0), pack-reused 13
+Réception d'objets: 100% (13/13), 1.63 KiB | 0 bytes/s, fait.
+Résolution des deltas: 100% (2/2), fait.
+Vérification de la connectivité... fait.
+$ cd simplegit/
+$ ls
+README Rakefile lib
+
+
+
+ Cela va copier l'historique complet de ce projet pour que vous l'ayez
+ à disposition localement et vous aurez un dossier de travail de la branche
+ principale de ce projet pour vous permettre de lire le code et commencer à
+ le modifier. Si vous rentrez dans ce nouveau dossier, vous pouvez voir
+ le sous-dossier .git
où toutes les données du projet se trouvent.
+
+$ ls -a +. .. .git README Rakefile lib +$ cd .git +$ ls +HEAD description info packed-refs +branches hooks logs refs +config index objects ++ +
+ Par défaut, Git crée un dossier avec le même nom que le projet de l'URL + donnée—typiquement tout ce qui se trouve après le dernier slash de l'URL. + Si vous voulez quelque chose de différent, vous pouvez l'indiquer à la fin + de la commande, après l'URL. +
+ +
+ Pour résumer, vous utilisez git clone
pour
+ obtenir une copie locale d'un dépôt Git pour pouvoir l'étudier ou le modifier.
+
Aller à Capture d’Instantané Basique »
diff --git a/fr/index.html b/fr/index.html new file mode 100644 index 0000000..4d16e4c --- /dev/null +++ b/fr/index.html @@ -0,0 +1,119 @@ +--- +layout: fr_reference +--- ++ Ceci est le site Référence Git. Il a pour but de servir + de référence rapide pour apprendre et retenir les commandes + les plus importantes et les plus utilisées de Git. Les commandes + sont organisées en sections selon le type d'opérations que vous + seriez amené à faire, et vous présenteront les options et commandes + courantes pour les réaliser. +
++ Chaque section pointe vers la section suivante, vous pourrez les suivre + à la manière d'un tutoriel. Chaque page pointera également vers + une documentation Git plus approfondie comme les pages de manuel + officielles ou aux sections appropriées du + Livre Pro Git, + de cette manière vous pourrez en apprendre plus sur les commandes. + Nous commencerons par découvrir comment penser gestion de sources + à la manière de Git. +
++ La première chose à comprendre sur Git est qu'il + gère les versions d'une manière totalement différente + de Subversion ou Perforce ou tout autre gestionnaire de sources + auquel vous seriez habitué. Il est souvent plus simple + d'apprendre Git en mettant de côté toute connaissance sur + le fonctionnement de la gestion de sources et d'essayer d'y penser + à la Git. +
+ ++ Partons de zéro. Imaginons que vous conceviez un nouveau système de gestion + de sources. Comment gériez-vous simplement différentes versions + avant d'utiliser un outil dédié à ça ? Il y a de fortes chances pour que vous ayez + fait de simples copies du répertoire de votre projet pour sauvegarder + son état à ce moment-là. +
+ +$ cp -R projet projet.bak+ +
+ De cette manière, vous pouvez facilement rétablir des fichiers qui + seraient devenus inutilisables plus tard, ou pour voir ce que vous avez changé en + comparant l'état du projet actuel avec celui de la copie de sauvegarde. +
+ ++ Si vous êtes réellement paranoïaque, vous le ferez sûrement souvent, + et vous inclurez la date dans le nom de la sauvegarde : +
+ +$ cp -R projet projet.2010-06-01.bak+ +
+ Dans ce cas, vous aurez un tas d'instantanés de votre projet à + disposition comme source de comparaison et d'inspection. Vous pouvez + également utiliser cette méthode pour partager de manière plutôt + efficace des modifications avec un tiers. Si vous créez une archive compressée + de l'état actuel de votre projet et la partagez sur votre site web, d'autres développeurs + peuvent la télécharger, modifier votre projet et vous envoyer un correctif + assez facilement. +
+ ++ $ wget http://exemple.com/projet.2010-06-01.zip + $ unzip projet.2010-06-01.zip + $ cp -R projet.2010-06-01 projet-ma-copie + $ cd projet-ma-copie + $ (vous faites des modifications) + $ diff projet-ma-copie projet.2010-06-01 > modif.patch + $ (email modif.patch)+ +
+ Le développeur original peut alors appliquer le correctif à sa copie + du projet et avoir vos modifications. C'est de cette manière + que de nombreux projets libres ont collaboré pendant plusieurs + années. +
+ ++ Ceci fonctionne en fait plutôt bien, alors imaginons que nous désirions + écrire un outil pour effectuer ce processus basique plus rapidement + et plus facilement. Au lieu d'écrire un outil qui crée des versions + de chaque fichier individuellement, comme Subversion, nous en écririons + probablement un qui permettrait de manière plus simple de conserver + des instantanés de notre projet sans avoir à copier la totalité du + dossier à chaque fois. +
+ +
+ C'est fondamentalement ce que fait Git. Vous dites à Git de sauvegarder
+ un instantané de votre projet avec la commande git commit
+ et il va simplement enregistrer l'état de tous les fichiers de votre projet
+ à ce moment. Ensuite la plupart des commandes travaillent avec ces enregistrements
+ d'état pour comparer leurs différences ou y récupérer du contenu, etc..
+
+ Si vous pensez à Git comme un outil pour conserver, comparer et fusionner des instantanés + de votre projet, il sera plus facile de comprendre ce qui se passe et comment + faire différentes choses correctement. +
+ +Aller à Obtention et Création des Projets »
diff --git a/fr/inspect/index.html b/fr/inspect/index.html new file mode 100644 index 0000000..508c0ca --- /dev/null +++ b/fr/inspect/index.html @@ -0,0 +1,488 @@ +--- +layout: fr_reference +--- + ++ Vous avez désormais plusieurs branches dont vous vous servez pour des + besoins temporaires, des fonctionnalités durables et autres. Comment + vous y retrouver parmi celles-ci ? Git a différents outils pour vous + aider à savoir où un travail donné a eu lieu, quelles sont les différences + entre deux branches et bien d'autres choses. +
+ +
+ Pour résumer, vous utilisez git log
pour retrouver des
+ commits spécifiques dans l'historique de votre projet—par auteur, date,
+ contenu et historique. Vous pouvez utiliser git diff
pour comparer
+ deux points différents dans votre historique—habituellement pour voir de quelle
+ manière deux branches diffèrent ou ce qui a changé entre une version de votre
+ logiciel et une autre.
+
Nous avons déjà vu comment utiliser git log
pour comparer
+ des branches, en visualisant les commits d'une branche (si vous ne vous
+ en souvenez pas, cela ressemble à : git log brancheA ^brancheB
).
+ Cependant, vous pouvez utiliser git log
pour rechercher un
+ commit spécifique. Ici nous allons nous intéresser à certaines options
+ communément utilisées par git log
, mais il en existe de très
+ nombreuses. Reportez-vous à la documentation officielle pour la liste complète.
+
+ Pour filtrer l'historique de vos commits suivant seulement ceux effectués
+ par un auteur en particulier, vous pouvez utiliser l'option --author
.
+ Par exemple, disons que nous recherchons les commits du code source de Git
+ qui ont été effectués par Linus. Nous exécuterions quelque chose comme
+ git log --author=Linus
. La recherche est sensible à la casse
+ et recherchera aussi l'adresse email. L'exemple suivant utilise l'option
+ -[nombre]
, qui limite les résultats aux [nombre] derniers
+ commits.
+
+$ git log --author=Linus --oneline -5 +81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory +3bb7256 make "index-pack" a built-in +377d027 make "git pack-redundant" a built-in +b532581 make "git unpack-file" a built-in +112dd51 make "mktag" a built-in ++ +
+ Si vous voulez spécifier un intervalle de temps pour filtrer vos commits,
+ vous pouvez utiliser plusieurs options comme --since
+ et --before
, ou vous pouvez aussi utiliser --until
+ et --after
. Par exemple, pour voir tous les commits du projet
+ Git d'il y a trois semaines mais après le 18 Avril, vous pourriez exécuter ceci
+ (nous allons aussi utiliser --no-merges
pour ignorer les commits
+ de fusion) :
+
+$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges +5469e2d Git 1.7.1-rc2 +d43427d Documentation/remote-helpers: Fix typos and improve language +272a36b Fixup: Second argument may be any arbitrary string +b6c8d2d Documentation/remote-helpers: Add invocation section +5ce4f4e Documentation/urls: Rewrite to accomodate transport::address +00b84e9 Documentation/remote-helpers: Rewrite description +03aa87e Documentation: Describe other situations where -z affects git diff +77bc694 rebase-interactive: silence warning when no commits rewritten +636db2c t3301: add tests to use --format="%N" ++ +
+ Vous désireriez peut-être également rechercher les commits avec une certaine
+ phrase comme message de commit. Utilisez --grep
pour cela.
+ Disons qu'il y ait un commit qui portait sur la variable d'environnement P4EDITOR
+ et que vous vouliez vous remémorer à quoi ressemblaient ses modificiations—vous
+ pourriez retrouver cet commit avec --grep
.
+
+$ git log --grep=P4EDITOR --no-merges
+commit 82cea9ffb1c4677155e3e2996d76542502611370
+Author: Shawn Bohrer
+Date: Wed Mar 12 19:03:24 2008 -0500
+
+ git-p4: Use P4EDITOR environment variable when set
+
+ Perforce allows you to set the P4EDITOR environment variable to your
+ preferred editor for use in perforce. Since we are displaying a
+ perforce changelog to the user we should use it when it is defined.
+
+ Signed-off-by: Shawn Bohrer <shawn.bohrer@gmail.com>
+ Signed-off-by: Simon Hausmann <simon@lst.de>
+
+
+
+ Git va faire un OU logique de tous les arguments --grep
et
+ --author
. Si vous voulez utiliser --grep
et
+ --author
pour voir tous les commits qui ont été crééxes
+ par quelqu'un et ont un contenu de message spécifique, vous devez utiliser
+ l'option --all-match
. Dans les exemples nous allons utiliser
+ l'option --format
, afin de voir qui est l'auteur de chaque commit.
+
Si nous recherchons les commits dont le message contient « p4 depo », + nous obtenons ces trois commits :
+ ++$ git log --grep="p4 depo" --format="%h %an %s" +ee4fd1a Junio C Hamano Merge branch 'master' of git://repo.or.cz/git/fastimport +da4a660 Benjamin Sergeant git-p4 fails when cloning a p4 depo. +1cd5738 Simon Hausmann Make incremental imports easier to use by storing the p4 d ++ +
Si nous ajoutons l'argument --author=Hausmann
,
+ au lieu de filtrer les commits de Simon, il va plutôt nous montrer
+ toutes les commtis de Simon ou dont le message contient « p4 depo ».
+$ git log --grep="p4 depo" --format="%h %an %s" --author="Hausmann" +cdc7e38 Simon Hausmann Make it possible to abort the submission of a change to Pe +f5f7e4a Simon Hausmann Clean up the git-p4 documentation +30b5940 Simon Hausmann git-p4: Fix import of changesets with file deletions +4c750c0 Simon Hausmann git-p4: git-p4 submit cleanups. +0e36f2d Simon Hausmann git-p4: Removed git-p4 submit --direct. +edae1e2 Simon Hausmann git-p4: Clean up git-p4 submit's log message handling. +4b61b5c Simon Hausmann git-p4: Remove --log-substitutions feature. +36ee4ee Simon Hausmann git-p4: Ensure the working directory and the index are cle +e96e400 Simon Hausmann git-p4: Fix submit user-interface. +38f9f5e Simon Hausmann git-p4: Fix direct import from perforce after fetching cha +2094714 Simon Hausmann git-p4: When skipping a patch as part of "git-p4 submit" m +1ca3d71 Simon Hausmann git-p4: Added support for automatically importing newly ap +... ++ +
Néanmoins, ajouter --all-match
va vous retourner les résultats
+ que vous attendiez :
+$ git log --grep="p4 depo" --format="%h %an %s" --author="Hausmann" --all-match +1cd5738 Simon Hausmann Make incremental imports easier to use by storing the p4 d ++ +
+ Que faire si vos messages de commits sont vraiment mauvais ? Ou si + vous recherchez quand une fonction a été rajoutée, ou quand des + variables ont commencé à être utilisées ? Vous pouvez aussi dire à Git + de rechercher parmi les modifications de chaque commit pour une certaine + chaîne de caractères. Par exemple, si nous voulions trouver quelles + commits ont modifié tout ce qui ressemble au nom de function + « userformat_find_requirements', nous exécuterions ceci (notez qu'il + n'y a pas de « = » entre le « -S » et ce que vous recherchez) : +
+ +
+$ git log -Suserformat_find_requirements
+commit 5b16360330822527eac1fa84131d185ff784c9fb
+Author: Johannes Gilger
+Date: Tue Apr 13 22:31:12 2010 +0200
+
+ pretty: Initialize notes if %N is used
+
+ When using git log --pretty='%N' without an explicit --show-notes, git
+ would segfault. This patches fixes this behaviour by loading the needed
+ notes datastructures if --pretty is used and the format contains %N.
+ When --pretty='%N' is used together with --no-notes, %N won't be
+ expanded.
+
+ This is an extension to a proposed patch by Jeff King.
+
+ Signed-off-by: Johannes Gilger
+ Signed-off-by: Junio C Hamano
+
+
+
+ Chaque commit est un instantané de votre projet, mais étant donné que
+ chaque commit connaît l'instantané sur lequel il est basé, Git peut toujours
+ calculer la différence et vous l'afficher sous forme de correctif. Cela
+ signifie que pour chaque commit vous pouvez obtenir le correctif que
+ ce commit a introduit dans le projet. Vous pouvez le faire soit
+ en exécutant git show [SHA]
avec un SHA spécifique de commit,
+ ou vous pouvez utiliser git log -p
, qui dit à Git de mettre le
+ correctif après chaque commit. C'est un très bon moyen de résumer ce
+ qui est arrivé sur une branche ou entre des commits.
+
+$ git log -p --no-merges -2 +commit 594f90bdee4faf063ad07a4a6f503fdead3ef606 +Author: Scott Chacon <schacon@gmail.com> +Date: Fri Jun 4 15:46:55 2010 +0200 + + reverted to old class name + +diff --git a/ruby.rb b/ruby.rb +index bb86f00..192151c 100644 +--- a/ruby.rb ++++ b/ruby.rb +@@ -1,7 +1,7 @@ +-class HiWorld ++class HelloWorld + def self.hello + puts "Hello World from Ruby" + end + end + +-HiWorld.hello ++HelloWorld.hello + +commit 3cbb6aae5c0cbd711c098e113ae436801371c95e +Author: Scott Chacon <schacon@gmail.com> +Date: Fri Jun 4 12:58:53 2010 +0200 + + fixed readme title differently + +diff --git a/README b/README +index d053cc8..9103e27 100644 +--- a/README ++++ b/README +@@ -1,4 +1,4 @@ +-Hello World Examples ++Many Hello World Examples + ====================== + + This project has examples of hello world in ++ +
C'est un très bon moyen de résumer les changements ou passer en revue + une série de commits avant de les fusionner ou de publier quoi que ce soit.
+ +Si vous trouvez l'option -p
trop verbeuse, vous pouvez résumer
+ les changements avec --stat
à la place. Voici la même sortie du
+ journal avec --stat
à la place de -p
.
+$ git log --stat --no-merges -2 +commit 594f90bdee4faf063ad07a4a6f503fdead3ef606 +Author: Scott Chacon <schacon@gmail.com> +Date: Fri Jun 4 15:46:55 2010 +0200 + + reverted to old class name + + ruby.rb | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 3cbb6aae5c0cbd711c098e113ae436801371c95e +Author: Scott Chacon <schacon@gmail.com> +Date: Fri Jun 4 12:58:53 2010 +0200 + + fixed readme title differently + + README | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) ++ +
Basiquement les mêmes informations, mais plus succintement—vous pouvez + toujours voir les différences et queles fichiers ont été modifiés.
+ +Enfin, pour voir les changements absolus entre deux instantanés,
+ vous pouvez utiliser la commande git diff
. C'est utilisé
+ principalement dans deux cas—voir en quoi deux branches diffèrent
+ l'une de l'autre et voir ce qui a changé depuis la publication d'une version
+ ou tout autre moment donné passé dans l'historique.
+ Voyons chacune de ces situations.
Pour voir ce qui a changé depuis la dernière publication, vous pouvez
+ simplement exécuter git diff [version]
(ou tout autre étiquette
+ attribuée à la publication). Par exemple, si vous voulez voir ce qui a changé
+ dans votre projet depuis la version v0.9, vous pouvez exécuter
+ git diff v0.9
.
+
+$ git diff v0.9 +diff --git a/README b/README +index d053cc8..d4173d5 100644 +--- a/README ++++ b/README +@@ -1,4 +1,4 @@ +-Hello World Examples ++Many Hello World Lang Examples + ====================== + + This project has examples of hello world in +diff --git a/ruby.rb b/ruby.rb +index bb86f00..192151c 100644 +--- a/ruby.rb ++++ b/ruby.rb +@@ -1,7 +1,7 @@ +-class HiWorld ++class HelloWorld + def self.hello + puts "Hello World from Ruby" + end + end + +-HiWorld.hello ++HelloWorld.hello ++ +
Tout comme git log
, vous pouvez utiliser l'option
+ --stat
avec.
+$ git diff v0.9 --stat + README | 2 +- + ruby.rb | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) ++ +
Pour comparer deux branches divergentes, néanmoins, vous pouvez exécuter
+ quelque chose de similaire à git diff branchA branchB
mais
+ le problème est que cela va faire exactement ce que vous lui
+ demandez—cela va concrètement vous fournir le correctif qui transformerai l'instantané
+ à la pointe de la branche brancheA en l'instantané de la pointe de la
+ branche brancheB. Cela signifie que si deux branches ont divergé—elles
+ ont pris des directions différentes—cela va occulter toutes les modifications
+ introduites dans brancheA puis ajouter tout ce qui a été introduit dans brancheB.
+ Ce n'est probablement pas ce que vous voulez—vous voulez les changements ajoutés
+ à brancheB qui ne sont pas dans brancheA, vous voulez donc vraiment les différences
+ là où les deux branches ont divergé et la pointe de brancheB. Donc,
+ si notre historique ressemble à ça :
+$ git log --graph --oneline --decorate --all +* 594f90b (HEAD, tag: v1.0, master) reverted to old class name +| * 1834130 (erlang) added haskell +| * ab5ab4c added erlang +|/ +* 8d585ea Merge branch 'fix_readme' +... ++ +
Et si nous voulions voir ce qui se trouve sur la branche « erlang »
+ par rapport à la branche « master », exécuter git diff master erlang
+ ne nous afficherait pas la bonne chose.
+$ git diff --stat master erlang + erlang_hw.erl | 5 +++++ + haskell.hs | 4 ++++ + ruby.rb | 4 ++-- + 3 files changed, 11 insertions(+), 2 deletions(-) ++ +
Vous voyez que cela a ajouté les fichiers erlang et haskell, qui est ce + que nous avons fait dans cette branche, mais la sortie revient aussi sur les + changements du fichier ruby que nous avons effectués dans la branche master. + Ce que nous voulons vraiment voir sont juste les changements qui ont été faits + dans la branche « erlang » (l'ajout des deux fichiers). Nous pouvons obtenir le + résultat attendu en faisant la différence entre le commit commun depuis lequel + elles ont divergé :
+ ++$ git diff --stat 8d585ea erlang + erlang_hw.erl | 5 +++++ + haskell.hs | 4 ++++ + 2 files changed, 9 insertions(+), 0 deletions(-) ++ +
C'est ce que nous recherchons, mais nous ne désirons pas avoir à nous
+ souvenir à chaque fois depuis quel commit les deux branches ont divergé.
+ Heureusement, Git a un raccourci pour ça. Si vous exécutez
+ git diff master...erlang
(avec trois points entre les noms de
+ branches), Git va automatiquement savoir quel est le commit commun
+ (aussi connu sous le nom de « base de fusion ») entre les deux commits et
+ afficher les modifications en se basant sur celui-ci.
+$ git diff --stat master erlang + erlang_hw.erl | 5 +++++ + haskell.hs | 4 ++++ + ruby.rb | 4 ++-- + 3 files changed, 11 insertions(+), 2 deletions(-) +$ git diff --stat master...erlang + erlang_hw.erl | 5 +++++ + haskell.hs | 4 ++++ + 2 files changed, 9 insertions(+), 0 deletions(-) ++ +
Quasiment à chaque fois que vous voudrez comparer deux branches, vous voudrez + utiliser la syntaxe du triple-point, parce-qu'elle vous donnera sûrement toujours + ce que vous désirez. +
+ +En guise de bonus, vous pouvez aussi faire calculer manuellement par Git quelle
+ serait la base de fusion (le premier commit parent commun) entre deux commits
+ avec la commande git merge-base
:
+$ git merge-base master erlang +8d585ea6faf99facd39b55d6f6a3b3f481ad0d3d ++ +
Vous pouvez faire l'équivalent de git diff master...erlang
+ en exécutant :
+$ git diff --stat $(git merge-base master erlang) erlang + erlang_hw.erl | 5 +++++ + haskell.hs | 4 ++++ + 2 files changed, 9 insertions(+), 0 deletions(-) ++ +
Vous préférerez peut-être utiliser la forme simple de la syntaxe néanmoins.
+ + +
+ Pour résumer vous pouvez utiliser git diff
pour voir
+ comment un projet a changé depuis un moment donné ou pour voir quel travail
+ est contenu dans une branche depuis qu'elle a divergé d'une autre. Utilisez
+ toujours git diff brancheA...brancheB
pour inspecter brancheB
+ par rapport à brancheA pour vous simplifier la vie.
+
Et c'est la fin ! Pour plus d'informations, veuillez lire le + Livre Pro Git.
diff --git a/fr/remotes/index.html b/fr/remotes/index.html new file mode 100644 index 0000000..e52269e --- /dev/null +++ b/fr/remotes/index.html @@ -0,0 +1,459 @@ +--- +layout: fr_reference +--- + ++ Git n'a pas de serveur central comme Subversion. Toutes les commandes + jusqu'à présent ont été exécutées localement, actualisant seulement la base + de données locale. Pour collaborer avec d'autres développeurs sous Git, + vous devez mettre toutes ces données sur un serveur auquel les autres + ont accès. Git rend cela possible en synchronisant vos données avec un + autre dépôt. Il n'y a pas de réelle différence entre un serveur et un + client—un dépôt Git est un dépôt Git et vous pouvez synchroniser + des dépôts indifféremment entre eux facilement. +
+ +Dès que vous avez un dépôt Git, que ce soit un que vous hébergez sur votre + propre serveur, ou un dépôt hébergé chez un tiers comme GitHub, vous pouvez + dire à Git soit de pousser toutes données que vous avez qui ne sont pas + présentes sur le serveur distant, soit demander à Git de récupérer en local + les différences depuis l'autre dépôt. +
+ +Vous pouvez le faire quand vous êtes en ligne, cela n'a pas à être fait
+ en même temps qu'un commit
ou tout autre commande. Généralement
+ vous ferez un certains nombres de commits localement, puis vous récupérerez
+ les données depuis le dépôt partagé distant à partir duquel vous avez cloné
+ le projet pour être à jour, puis vous pousserez vos modifications en ligne.
+ Pour résumer, vous pouvez actualiser votre projet avec git fetch
+ et partager vos modifications avec git push
. Vous pouvez gérer vos
+ dépôts distants avec git remote
.
+
Contrairement aux systèmes de gestion de versions centralisés qui ont un client + qui est très différent du serveur, les dépôts Git sont tout simplement équivalents + et vous les synchronisez simplement entre eux. Cela simplifie la possibilité + d'avoir plus d'un dépôt distant—vous pouvez en avoir certains en lecture seule + ainsi que d'autres accessibles en écriture.
+ +Afin de ne pas avoir à donner l'URL complète d'un dépôt distant à chaque
+ fois que vous désirez vous synchroniser avec, Git stocke un alias ou diminutif
+ pour chaque URL de dépôt distant qui vous intéresse. Vous utilisez la commande
+ git remote
pour gérer cette liste de dépôts distants qui vous
+ intéresse.
Sans argument, Git va simplement vous afficher les alias de dépôt distants
+ qu'ils stockent. Par défaut, si vous avez cloné le projet (par opposition
+ à en créer un nouveau localement), Git va automatiquement ajouter l'URL
+ de ce dépôt source que vous avez cloné sous le nom « origin ». SI vous exécutez
+ la commande avec l'option -v
, vous pouvez voir
+ l'URL réelle de chaque alias.
+$ git remote +origin +$ git remote -v +origin git@github.com:github/git-reference.git (fetch) +origin git@github.com:github/git-reference.git (push) ++ +
Vous voyez l'URL ici en double car Git permet d'avoir des URLs + différentes pour pousser et récupérer pour chaque dépôt au cas où + vous vouliez utiliser des protocoles différents en lecture + et en écriture.
+ +Si vous voulez partager un dépôt créé localement, ou vous voulez
+ récupérer les contributions depuis le dépôt d'un tiers—si vous voulez
+ interagir de n'importe quelle manière avec un nouveau dépôt, le plus simple
+ est généralement de l'ajouter comme dépôt distant. Vous faites cela en
+ exécutant git remote add [alias] [url]
. Cela ajoute
+ l'[url]
en local en tant que dépôt distant sous le nom
+ [alias]
.
Par exemple, si nous voulons partager notre programme Hello World avec + le reste du monde, nous pouvons créer un nouveau dépôt sur un serveur + (utilisons Github comme exemple), vous devriez obtenir une URL, + dans notre cas « git@github.com:schacon/hw.git ». Pour l'ajouter à notre + projet afin de pouvoir y pousser et récupérer des mises à jour depuis celui-ci + nous ferions :
+ ++$ git remote +$ git remote add github git@github.com:schacon/hw.git +$ git remote -v +github git@github.com:schacon/hw.git (fetch) +github git@github.com:schacon/hw.git (push) ++ +
Tout comme la dénomination des branches, le nommage des alias de dépôts
+ distants est arbitraire—tout comme « master » n'a aucune signification spéciale
+ mais est très largement utilisé car git init
le configure par défaut,
+ « origin » est souvent utilisé comme nom de dépôt distant car
+ git clone
le configure par défaut comme URL source du clonage. Dans
+ notre cas nous allons appeler ce dépôt distant « github », mais vous pourriez le
+ nommer comme bon vous semblerait.
+
Si vous avez besoin d'enlever un dépôt distant—vous ne l'utilisez plus, le projet
+ n'existe plus, etc—vous pouvez l'enlever avec git remote rm [alias]
.
+$ git remote -v +github git@github.com:schacon/hw.git (fetch) +github git@github.com:schacon/hw.git (push) +$ git remote add origin git://github.com/pjhyett/hw.git +$ git remote -v +github git@github.com:schacon/hw.git (fetch) +github git@github.com:schacon/hw.git (push) +origin git://github.com/pjhyett/hw.git (fetch) +origin git://github.com/pjhyett/hw.git (push) +$ git remote rm origin +$ git remote -v +github git@github.com:schacon/hw.git (fetch) +github git@github.com:schacon/hw.git (push) ++ +
Si vous voulez renommer des alias de dépôt distant sans avoir à les supprimer puis les
+ ajouter à nouveau vous pouvez le faire en exécutant
+ git remote rename [ancien-alias] [nouvel-alias]
. Cela va vous permettre
+ de modifier le nom en cours d'utilisation du dépôt distant.
+$ git remote add github git@github.com:schacon/hw.git +$ git remote -v +github git@github.com:schacon/hw.git (fetch) +github git@github.com:schacon/hw.git (push) +$ git remote rename github origin +$ git remote -v +origin git@github.com:schacon/hw.git (fetch) +origin git@github.com:schacon/hw.git (push) ++ +
+ Pour résumer, avec git remote
vous pouvez lister vos dépôts
+ distants et toute URL que ce dépôt utilise. Vous pouvez utiliser
+ git remote add
pour ajouter de nouveaux dépôts distants,
+ git remote rm
pour en supprimer ou
+ git remote rename [ancien-alias] [nouvel-alias]
pour les renommer.
+
Si vous aviez besoin d'actualiser l'URL d'un dépôt distant, vous
+ pouvez le faire avec la commande git remote set-url
.
+
+$ git remote -v +github git@github.com:schacon/hw.git (fetch) +github git@github.com:schacon/hw.git (push) +origin git://github.com/pjhyett/hw.git (fetch) +origin git://github.com/pjhyett/hw.git (push) +$ git remote set-url origin git://github.com/github/git-reference.git +$ git remote -v +github git@github.com:schacon/hw.git (fetch) +github git@github.com:schacon/hw.git (push) +origin git://github.com/github/git-reference.git (fetch) +origin git://github.com/github/git-reference.git (push) ++ +
De plus, vous pouvez définir une URL différente pour pousser quand
+ vous ajoutez le drapeau --push
. Cela vous permet de récupérer
+ depuis un dépôt mais de pousser vers un autre tout en leur donnant le
+ même alias.
+
+$ git remote -v +github git@github.com:schacon/hw.git (fetch) +github git@github.com:schacon/hw.git (push) +origin git://github.com/github/git-reference.git (fetch) +origin git://github.com/github/git-reference.git (push) +$ git remote set-url --push origin git://github.com/pjhyett/hw.git +$ git remote -v +github git@github.com:schacon/hw.git (fetch) +github git@github.com:schacon/hw.git (push) +origin git://github.com/github/git-reference.git (fetch) +origin git://github.com/pjhyett/hw.git (push) ++ +
En interne, la commande git remote set-url
exécute
+ git config remote
, mais avec l'avantage de vous signaler
+ en retour toute erreur. git config remote
d'un autre côté,
+ va échouer en silence si vous avez mal tapé un argument ou une option
+ pour ne rien définir au final.
+
Par exemple, nous allons mettre à jour le dépôt distant github
+ mais à la place y faire référence en tant que guhflub
à chaque
+ invocation.
+
+$ git remote -v +github git@github.com:schacon/hw.git (fetch) +github git@github.com:schacon/hw.git (push) +origin git://github.com/github/git-reference.git (fetch) +origin git://github.com/github/git-reference.git (push) +$ git config remote.guhflub git://github.com/mojombo/hw.git +$ git remote -v +github git@github.com:schacon/hw.git (fetch) +github git@github.com:schacon/hw.git (push) +origin git://github.com/github/git-reference.git (fetch) +origin git://github.com/github/git-reference.git (push) +$ git remote set-url guhflub git://github.com/mojombo/hw.git +fatal: No such remote 'guhflub' ++ +
+ Pour résumer, vous pouvez mettre à jour les emplacements de vos
+ dépôts distants avec git remote set-url
. Vous pouvez aussi définir des URLs
+ différentes pour pousser et récupérer sous le même nom d'alias de dépôt distant.
+
Git a deux commandes pour se mettre à jour depuis un dépôt distant.
+ git fetch
va vous synchroniser avec un autre dépôt, récupérant
+ en local tout donnée non présente en local et vous donnant des marqueurs sur où
+ chaque branche sur ce dépôt distant en était au momemt de la synchronisation.
+ Celles-ci sont appelées « branches distantes » et sont identiques aux branches locales
+ mis à part que Git ne vous autorisera pas d'y faire un checkout—par contre, vous pouvez
+ fusionner avec, les comparer à d'autres branches, exécuter des journaux d'historique
+ dessus, etc. Vous faites toutes ces opérations en local une fois votre synchronisation
+ faite.
+
La seconde commande qui va récupérer en local des données est la commande
+ git pull
. Cette commande va concrètement exécuter un git fetch
+ immédiatemment suivi d'un git merge
de la branche de ce dépôt distant
+ qui est suivie par toute branche courante dans laquelle vous êtes. Exécuter les commandes
+ fetch
et merge
séparément est source de moins de magie et
+ de moins de problèmes, mais si vous aimez le principe de pull
,
+ vous pouvez le retrouver de manière plus détaillée dans la
+ documentation officielle.
+
Partant du principe que vous avez un dépôt distant fonctionnel et que vous voulez tirer
+ en local des mises à jour, vous exécuteriez en premier git fetch [alias]
+ pour dire à Git de récupérer en local toutes les données du dépôt que vous n'avez pas,
+ puis vous exécuteriez git merge [alias]/[branche]
pour fusionner dans la
+ branche courante tout ce qu'il y de nouveau sur le serveur (par exemple si quelqu'un
+ a poussé entretemps). Au final, si vous travailliez sur un projet Hello World avec
+ plusieurs autres personnes et que vous vouliez récupérer toutes modifications qui
+ ont été poussées depuis votre dernière connexion, vous feriez quelque chose comme :
+$ git fetch github +remote: Counting objects: 4006, done. +remote: Compressing objects: 100% (1322/1322), done. +remote: Total 2783 (delta 1526), reused 2587 (delta 1387) +Receiving objects: 100% (2783/2783), 1.23 MiB | 10 KiB/s, done. +Resolving deltas: 100% (1526/1526), completed with 387 local objects. +From github.com:schacon/hw + 8e29b09..c7c5a10 master -> github/master + 0709fdc..d4ccf73 c-langs -> github/c-langs + 6684f82..ae06d2b java -> github/java + * [new branch] ada -> github/ada + * [new branch] lisp -> github/lisp ++ +
Dans cet exemple nous pouvons voir que depuis notre dernière synchronisation + avec le dépôt distant, cinq branches ont été créées ou mises à jour. Les + branches « ada » et « lisp » sont nouvelles, alors que les branches « master », + « c-langs » et « java » ont été actualisées. Dans notre scénario exemple, + les autres développeurs poussent leurs modifications dans des branches distantes + pour revue avant d'être fusionnées dans « master ». +
+ +Vous pouvez observer ce que Git met en place. La branche « master » sur le dépôt
+ distant devient une branche appelée « github/master » en local. De cette manière
+ vous pouvez fusionner la branche « master » de ce dépôt distant dans la branche locale
+ « master » en exécutant git merge github/master
. Ou vous pouvez voir
+ quelles sont les nouveaux commits en exécutant git log github/master ^master
.
+ Si votre dépôt distant est nommé « origin » il sera plutôt nommé origin/master
.
+ Quasiment toute commande utilisable sur les branches locales est utilisable également
+ sur les branches distantes.
+
Si vous avez plus d'un dépôt distant, vous pouvez plutôt récupérer depuis un dépôt
+ spécifique en exécutant git fetch [alias]
ou vous pouvez dire à Git
+ de se synchroniser avec tous les dépôts distants en exécutant git fetch --all
.
+
+ Pour résumer, vous exécutez git fetch [alias]
pour synchroniser
+ votre dépôt avec un dépôt distant, en récupérant toutes les données du dépôt
+ distant qui ne sont pas référencées dans une branche locale pour les fusionner
+ ou autre.
+
Pour partager vos sympathiques commits avec des tiers, vous avez besoin de pousser
+ vos modifications vers un dépôt distant. Pour cela, vous exécutez
+ git push [alias] [branche]
qui va tenter de faire de votre [branche]
+ une nouvelle [branche] sur le dépôt distant [alias]. Essayons de le faire en commençant
+ par pousser notre branche « master » vers le dépôt distant « github » créé précédemment.
+$ git push github master +Counting objects: 25, done. +Delta compression using up to 2 threads. +Compressing objects: 100% (25/25), done. +Writing objects: 100% (25/25), 2.43 KiB, done. +Total 25 (delta 4), reused 0 (delta 0) +To git@github.com:schacon/hw.git + * [new branch] master -> master ++ +
Plutôt simple. Désormais si quelqu'un clone ce dépôt il va obtenir exactement + tous ses commits et tout son historique.
+ +Comment faire si vous avez une branche spécifique comme la branche « erlang » + créée précédemment et que vous vouliez just partager celle-ci ? Vous pouvez + uniquement pousser cette branche à la place.
+ ++$ git push github erlang +Counting objects: 7, done. +Delta compression using up to 2 threads. +Compressing objects: 100% (6/6), done. +Writing objects: 100% (6/6), 652 bytes, done. +Total 6 (delta 1), reused 0 (delta 0) +To git@github.com:schacon/hw.git + * [new branch] erlang -> erlang ++ +
Désormais quand quelqu'un clonera ou récupérera depuis ce dépôt, elle aura + une branche « erlang » qu'elle pourra étudier et fusionner. Vous pouvez pousser + toute branche de cette manière vers n'importe quel dépôt distant auquel + vous avez accès en écriture. Si votre branche est déjà sur le serveur, + Git tentera de la mettre à jour. Si elle n'est pas présente, Git l'ajoutera.
+ +Le dernier problème courant que vous risquez de rencontrer en poussant vers
+ des branches distantes est dans le cas où quelqu'un pousse en même temps.
+ Si vous et une autre développeuse clone au même moment, vous créez chacun
+ vos validations, puis elle pousse et enfin vous essayez de pousser à votre tour,
+ Git va par défaut refuser que vous écrasiez ses modifications. Au lieu de ça,
+ Git va simplement exécuter un git log
de la branche sur laquelle
+ vous essayez de pousser et s'assurer qu'il peut trouver l'extrémité courante
+ de la branche du serveur dans l'historique de ce que vous poussez. S'il ne
+ peut voir ce qu'il trouve sur le serveur dans votre historique, il en conclut
+ que vous n'êtes pas à jour et ne va pas accepter que vous poussiez. Pour bien
+ faire, vous devriez récupérer, fusionner puis pousser à nouveau—pour être sûr
+ de prendre ses modifications en compte.
Voici ce qui arrive lorsque vous essayez de pousser une branche vers une branche + distante qui a été mise à jour en même temps :
+ ++$ git push github master +To git@github.com:schacon/hw.git + ! [rejected] master -> master (non-fast-forward) +error: failed to push some refs to 'git@github.com:schacon/hw.git' +To prevent you from losing history, non-fast-forward updates were rejected +Merge the remote changes before pushing again. See the 'Note about +fast-forwards' section of 'git push --help' for details. ++ +
Vous pouvez corriger cela en exécutant git fetch github; git merge github/master
+ puis en poussant à nouveau.
+
+ Pour résumer, vous exécutez git push [alias] [branche]
pour actualiser
+ une branche distante avec vos modifications locales. Cela va prendre le contenu de
+ votre [branche] et le pousser pour en faire la [branche] sur le dépôt distant, si possible.
+ Si quelqu'un a poussé depuis la dernière fois que vous avez récupéré et mis à jour,
+ le serveur Git va refuser que vous poussiez tant que vous n'êtes pas à jour.
+