Fork me on GitHub

Concepts de Git Diffs, commits, branches, remotes

Le répertoire (repository)

Le dossier qui contient l’intégralité du projet

Créer un répertoire de zéro

git init nouveau_projet
  • Crée un dossier vide nouveau_projet, prêt pour le contrôle de versions.

Copier un répertoire existant

git clone mon_projet ma_copie
git clone https://github.com/moi/mon_projet
  • Crée un dossier contenant une copie du projet.
  • Garde une référence vers le projet d’origine (remote origin) pour les push et les pull.

Sauvegardes incrémentales

Git représente l’historique par une séquence de différences (diffs). Une différence est décrite :

  • par les lignes ajoutées,
  • par les lignes enlevées.
diff --git a/js/polyfills.js b/js/polyfills.js
index 38f8652..9de8f99 100644
--- a/js/polyfills.js
+++ b/js/polyfills.js
@@ -81,13 +81,13 @@ Element.prototype.css = function(css) {
 }
 
-Element.prototype.on = function(evts, cb, bubble) {
+Window.prototype.on = function(evts, cb, bubble) {
     var evts = evts.split(/\s+/);
     for (var i = 0 ; i < evts.length ; i++)
        this.addEventListener(evts[i], cb, bubble);
     return this;
}

Examiner une diff

Le commit

Le commit est l’unité de sauvegarde de Git. Il est composé

  • de la diff par rapport à la dernière sauvegarde,
  • du message de commit, l’auteur, la date, etc.,
  • des commits parents,
  • du commit hash (20 octets), qui est son identifiant unique.
commit bf02e55732fd922e17a1cb20bf127e630261f069
Author: Luca De Feo <dfl@deagol>
Date:   Sat Feb 14 14:18:40 2015 +0100
 
    Amended TD 3 to cope with many platform problems
 
 TODO.md                |  1 +
 tutorials/tutorial3.md | 46 +++++++++++++---------------------------------
 2 files changed, 14 insertions(+), 33 deletions(-)

commit 3fb01d6b6d561cfa77f5f441353e90a6f842f4c1

Créer un commit

Par la ligne de commande

  1. Ajouter les fichiers à sauvegarder (staged files)

    git add fichier1.c fichier2.html
    
  2. Créer le commit (ouvre un éditeur pour écrire le message de commit)

    git commit
    

Autres méthodes

Examiner les commits

  • La liste de tous les commits

    git log
    

    options : --stat résumé des fichiers changés, --graph montre le DAG de l’historique.

  • Examiner un seul commit

    git show c7f717e9b5a8fb34
    

    demande un identifiant du commit : partie initiale du hash, ou autre code (ex. : HEAD represente le dernier commit).

  • Explorateur graphique : gitk.

  • Explorateur web :
    https://github.com/defeo/in202.github.io/commits/master.

Examiner le répertoire

git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
	new file:   classes/class5.md
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:   index.md
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	classes/.#class5.md

Les branches

Une branche est une ligne de développement :

  • L’historique des commits qui amènent à la branche.
  • En pratique, une branche est un pointeur à un commit.

Un répertoire peut contenir plusieurs branches. La branche par défaut s’appelle master.

  • Créer une branche :

    git branch nouvelle_branche
    
  • Changer de branche courante (attention, il ne doit pas y avoir de modifications non commitées) :

    git checkout nouvelle_branche
    

La branche courante

À tout moment le répertoire est dans une branche. Pour voir le nom de la branche courante :

git branch -av
* master                     3dbc6a4 Fixed bug
  test                       7b4c982 Wild experiment
  remotes/boilerplate/master bf02e55 Version 2.0
  • Une branche indentifie un commit

    git log master
    
    commit 3dbc6a4bc0885c6af3f4f3ea8738781d31f971ac
    Author: Luca De Feo <dfl@deagol>
    Date:   Sun Feb 15 21:47:41 2015 +0100
    
  • La branche courante évolue : git commit ajoute le nouveau commit à la branche courante.

Travailler avec des remotes

Les remotes sont des copies distantes du répertoire (par ex., GitHub).

  • Un répertoire cloné a toujours un remote appelé origin.

    git remote -v
    
    origin	git@github.com:/defeo/in202.github.io (fetch)
    origin	git@github.com:/defeo/in202.github.io (push)
    
  • On peut ajouter et enlever des remotes

    git remote add jean https://github.com/jean/son_projet.git
    git remote remove mon_collegue
    

Branches tracées

Dans un répertoire cloné, les branches locales tracent les branches distantes.

git branch -vv
  test   7b4c982 [jean/test] Wild experiment
* master 3dbc6a4 [origin/master] Version 1.1
  • test trace jean/test,
  • master trace origin/master.

Télécharger les changements

git fetch jean

Télécharge les modifications dans le remote jean, sans faire des modifications à la branche locale. git status montre les différences entre la branche courante et sa branche tracée.

Pousser, tirer

  • Tirer : appliquer les changements de la branche tracée.

    git pull --ff-only
    

    donne une erreur si les historiques ont divergé.

  • Pousser : envoyer les changements à la branche tracée.

    git push
    

    donne une erreur si les historiques ont divergé. Requiert les droits en écriture sur le répertoire distant.

  • Tirer et merger : appliquer les changements, même s’il y a des confilts

    git pull
    

    Si un conflit se présente git merge --abort revient à l’état avant le pull.

Lectures

Le Git Book :