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 @@ + + + + + Référence Git + + + + + + + + + + + + +
+ +
+ Référence Git +
+ +
+ +
+   +
+ +
+ + + + + + + + + + + +
+ +
+ {{ content }} +
+ +
+
+ + diff --git a/fr/.gitignore b/fr/.gitignore new file mode 100644 index 0000000..a16c005 --- /dev/null +++ b/fr/.gitignore @@ -0,0 +1,2 @@ +_site +*~ diff --git a/fr/README.md b/fr/README.md new file mode 100644 index 0000000..7ea0b58 --- /dev/null +++ b/fr/README.md @@ -0,0 +1,18 @@ +# Référence Git, Effort de traduction française # + +Ce dépot concerne l'effort de traduction en français du site en ligne +Référence Git. + +## Contribuer + +Si vous désirez contribuer, faites simplement un fork du dépôt, +poussez vos modifications dans une branche et envoyez une requête de tirage. + +Corrections typographiques, améliorations grammaticales et de lisibilité, toute +participation est la bienvenue. + +## Références pour la traduction + +Les traductions choisies pour les termes spécifiques à Git se basent sur +[les références](https://github.com/progit/progit2-fr#références-pour-la-traduction) +de l'effort de traduction en français de la deuxième édition du livre Pro Git. diff --git a/fr/about.html b/fr/about.html new file mode 100644 index 0000000..a294fcd --- /dev/null +++ b/fr/about.html @@ -0,0 +1,8 @@ +--- +layout: fr_reference +--- +
+

Qui est à l'origine de ce site ?

+
+

Le site Référence Git a été réalisé par l'équipe GitHub.

+
diff --git a/fr/basic/index.html b/fr/basic/index.html new file mode 100644 index 0000000..1c1497d --- /dev/null +++ b/fr/basic/index.html @@ -0,0 +1,1009 @@ +--- +layout: fr_reference +--- + +
+

+ + livre + + Capture d’Instantané Basique +

+
+

+ 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. +

+ +
+
+ +
+

+ + docs   + livre + + git add + ajoute le contenu d'un fichier dans la zone d'attente +

+ +
+

+ 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.

+ + +
+ +
+ +
+

+ + docs   + livre + + git status + affiche le statut de vos fichiers dans le dossier de travail et dans la zone d'attente +

+ +
+

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. +

+ +
+
+ +
+

+ + docs   + livre + + git diff + affiche les modifications indexées et non indexées +

+ +
+

+ 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.

+ +

+ git diff + affiche les modifications non indexées +

+ +

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. +

+ +

+ git diff --staged + affiche les modifications indexées +

+ +

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
+
+ +

+ git diff HEAD + affiche toutes les modifications, indexées ou non +

+ +

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
+
+ +

+ git diff --stat + affiche un résumé des modifications au lieu de leur détail +

+ +

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. +

+ + +
+
+ +
+

+ + docs   + livre + + git commit + valide un instantané à partir de la zone d'index +

+ +
+ +

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.

+ +

+ git commit -a + indexe automatiquement, avant un commit, toutes les modifications aux fichiers suivis +

+ +

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. +

+ +
+
+ +
+

+ + docs   + livre + + git reset + annule des changements et instantanés +

+ +
+

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. +

+ +

+ git reset HEAD + retire des fichiers de l'index et ré-initialise le pointeur vers HEAD +

+ +

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.

+ +

+ git reset --soft + déplace HEAD vers une référence spécifique de commit, la zone d'attente restant inchangée +

+ +

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.

+ +

+ git reset --hard + annule toute modification, indexée ou encore dans la copie de travail, survenue depuis le dernier 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.

+ +
+
+ +
+

+ + docs   + livre + + git rm + supprime des fichiers de l'index +

+ +
+ +

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.

+ +

+ git mv + git rm --staged orig; mv original nouveau; git add nouveau +

+ +

+ 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. +

+ +
+
+ +
+

+ + docs   + livre + + git stash + remise pour plus tard des modifications faites dans l'index et le 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. +

+ +

+ git stash + remise les modifications courantes sur la pile +

+ +

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)
+
+ +

+ git stash list + affiche les remisages présents sur la pile +

+ +

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
+
+ +

+ git stash apply + récupère l'élément depuis la pile et l'applique au dossier de travail +

+ +

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. +

+ +

+ git stash drop + supprime un élément de la pile +

+ +

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 +--- + +
+

+ + livre + + Création de Branches et Fusion +

+
+

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. +

+ +
+
+ +
+

+ + docs   + livre + + git branch + liste, crée et gére les contextes de travail +

+ +
+ +

+ + docs   + livre + + git checkout + bascule vers un nouveau contexte de branche +

+ +
+

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. +

+ +

+ git branch + liste vos branches disponibles +

+ +

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. +

+ +

+ git branch (nombranche) + crée une nouvelle branche +

+ +

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
+
+ +

+ git branch -v + affiche le dernier commit de chaque branche +

+ +

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
+
+ +

+ git checkout -b (nombranche) + crée puis bascule immédiatement vers une branche +

+ +

+ 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.

+ +

+ git branch -d (nombranche) + supprime une branche +

+ +

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
+
+ +

+ git push (nom-distant) :(nombranche) + supprime une branche distante +

+ +

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. +

+ +
+
+ +
+

+ + docs   + livre + + git merge + fusionne le contexte d'une branche dans votre contexte courant +

+ +
+

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
+
+ +

+ fusions plus avancées +

+ +

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.

+ +

+ conflits de fusion +

+ +

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. +

+ +
+
+ +
+

+ + docs   + livre + + git log + affiche l'historique des commits d'une branche +

+ +
+ +

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. +

+ +
+
+ +
+

+ + docs   + livre + + git tag + étiquette un moment dans l'historique comme important +

+ +
+ +

+ 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 +--- +
+

Git Cookbook

+ +
diff --git a/fr/creating/index.html b/fr/creating/index.html new file mode 100644 index 0000000..41ade81 --- /dev/null +++ b/fr/creating/index.html @@ -0,0 +1,145 @@ +--- +layout: fr_reference +--- + +
+

Obtention et Création des Projets

+
+

+ 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. +

+ +
+
+ +
+

+ + docs   + livre + + git init + initialise un répertoire comme dépôt Git +

+ +
+

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.

+ +
+
+ +
+

+ + docs   + livre + + git clone + copie un dépôt git pour pouvoir le modifier +

+
+

+ 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 +--- +
+

Introduction à Référence Git

+
+

+ 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. +

+
+
+ +
+

Comment penser à la 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 +--- + +
+

+ + livre + + Inspection et Comparaison +

+
+

+ 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. +

+
+
+ +
+

+ + docs   + livre + + git log + limite la longueur de l'historique +

+ +
+

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. +

+ +

+ git log --author + recherche uniquement les commits d'un auteur en particulier +

+ +

+ 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
+
+ +

+ git log --since --before + filtre les commits suivant leur date +

+ +

+ 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"
+
+ +

+ git log --grep + filtre les commits suivant leur message +

+ +

+ 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
+
+ +

+ git log -S + filtre suivant les changements introduits +

+ +

+ 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
+
+ +

+ git log -p + affiche le correctif introduit par chaque commit +

+ +

+ 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.

+ +

+ git log --stat + affiche un résumé des modifications introduites par chaque commit +

+ +

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.

+ +
+
+ +
+

+ + docs   + livre + + git diff + +

+ +
+ +

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 +--- + +
+

+ + livre + + Partage et Mise à Jour de Projets +

+
+

+ 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. +

+
+
+ +
+

+ + docs   + livre + + git remote + liste, ajoute et supprime les alias de dépôts distants +

+ +
+ +

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.

+ +

+ git remote + liste vos alias distants +

+ +

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.

+ +

+ git remote add + ajoute un nouveau dépôt distant à votre projet +

+ +

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. +

+ +

+ git remote rm + enlève un alias existant de dépôt distant +

+ +

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)
+
+ +

+ git remote rename [ancien-alias] [nouvel-alias] + renomme des alias de dépôt distant +

+ +

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. +

+ +

+ git remote set-url + actualise une URL distante existante +

+ +

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. +

+ +
+
+ +
+

+ + docs   + livre + + git fetch + récupère de nouvelles branches et données depuis un dépôt distant +

+ +
+ +

+ + docs   + livre + + git pull + récupère depuis un dépôt distant et essaye de fusionner dans la branche courante +

+ +
+ +

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. +

+ +
+ +
+ +
+

+ + docs   + livre + + git push + pousse vos nouvelles branches et données vers un dépôt distant +

+ +
+

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. +

+ +
+
+ +

Aller à Inspection et Comparaison »