Git pour les nuls
Ceci est un aide-mémoire très clair et simple qui décrit tout ce dont vous avez besoin pour utiliser le gestionnaire de contenu Git et Gerrit . Il doit vous donner au moins le savoir minimal nécéssaire pour faire vos push sur tous les dépôts majeurs que nous utilisons, y compris ceux de GitHub et des autres sites.
Si vous êtes un expert de Git, votre aide est bienvenue pour améliorer ce manuel, d'autant qu'il reste extrêmement simple.
Installer Git
Windows
Télécharger l'installeur ici : https://git-scm.com/download/win installe une version de terminal similaire à celle de Linux
MacOS
Il doit y avoir un paquet sur https://git-scm.com/download/mac, ou vous pourriez le compiler vous-même !
Linux
Pour une raison insondable, le package git sur Debian et Ubuntu est appelé git-core et git ne se relie pas à lui. Obtenir git-core permettra de l'installer.
Pour les autres distributions, voir https://git-scm.com .
Configuration
Pour installer il vous faut :
- un compte sur gerrit Wikimedia ou tout autre hébergeur de dépôt git
- une adresse courriel
- votre clé publique et clé privée
Terminologie
VCS
Abbréviation du terme générique Version control system. Git est l'un des nombreux VCS.
Git
Gestionnaire de contenu créé par Linus Torvalds. Git, contrairement à beaucoup d'autres VCS est distribué, cela signifie que chacun possède une copie de l'ensemble du dépôt, au lieu d'accéder à un serveur central.
Branche
Cela vous permet de diverger de la ligne principale de développement et de continuer à travailler sans vous préoccuper de cette ligne principale. Habituellement, vous voulez faire toutes vos modifications dans votre propre branche au lieu de les écrire dans la branche master.
Révision
Lorsque vous validez vos modifications par un commit, une nouvelle révision (comprendre version) est créée. L'historique dans Git est formée de versions. Chaque version possède un message de commit et un identifiant unique.
Remote
Dépôt hébergé sur un système distant, généralement accessible par ssh ou https.
Dépôt
Base de tout contenu qui est géré par Git.
Origin
Dans Git, l'alias par défaut pour le dépôt distant que vous avez cloné est appelé origin. Si vous clonez le dépôt foo à partir du serveur http://bar/foo.git sera votre origine.
Master
Branche par défaut de Git qui est généralement créée à la création du dépôt, mais elle n'a pas besoin de l'être. C'est un nom très commun pour une branche par défaut d'un dépôt mais pas nécessairement. (Tout comme le superutilisateur dans Linux, n'a pas besoin d'être appelé root, mais c'est presque toujours le cas).
Gerrit
Système de relecture construit au-dessus de Git. Il permet aux développeurs expérimentés de relire les modifications apportés par d'autres personnes et de les fusionner dans la branche master.
Guide
Télécharger le dépôt : clone
Extraction initiale - appelée clone. Récupère un dépôt distant sur un serveur distant et le sauvegarde dans un dossier local.
git clone <repository goes here>
Exemple
# Télécharger une copie en lecture seule (push non autorisé) de huggle en utilisant http git clone https://github.com/huggle/huggle3-qt-lx # Télécharger une copie de huggle en lecture seule à l'aide de http dans le dossier foobar git clone https://github.com/huggle/huggle3-qt-lx foobar
Mettre à jour le dépôt téléchargé : pull
- mettre à jour votre copie du dépôt avec la version présente sur le serveur distant
git pull
- mise à jour qui fusionnent automatiquement les éléments - appelé rebase; met à jour le dépôt et le fusionne avec vos commit
git pull --rebase
- Corriger les conflits
Il arrive souvent de rencontrer un conflit de modification. C'est ennuyeux, mais Git a un assez bon mécanisme pour les gérer. Il existe une commande magique
git mergetool
Vous pouvez également installer un troisième éditeur tel que kdiff3 qui ouvrira une belle IHM pouvant vous aider à fusionner; mergetool vous demandera ensuite quel éditeur vous souhaitez utiliser.
git review -d <number>
où <number> est le numéro de la modification Gerrit pour télécharger les corrections d'une nouvelle branche, et travailler dessus à la place. Notez que si vous avez déjà utilisé git review -d
pour télécharger un ensemble de corrections et y avoir apporté des modifications, mais que vous n'avez pas encore téléversé les modifications dans Gerrit, l'exécution de la commande à nouveau détruirait toutes les modifications locales, donc vous devez d'abord utiliser git checkout -b branch_name
pour copier les modifications locales sur une nouvelle branche si vous voulez les conserver.
Vérifier ce qui a été modifié : diff
Pour voir ce qui a été modifié avant votre commit, faire :
git diff
Pour voir ce que vous avez modifié après votre commit, faire :
# comparer le HEAD actuel au commit précédent, ce qui signifie que l'on compare simplement ce qui fait partie du commit avec ce qu'il y avait précédemment git diff HEAD^1 # comparer avec tous les ID donnés git diff <commit-id>
Créez votre propre branche
Vous pouvez voir toutes les branches qui ont été extraites pour votre copie locale en utilisant
git branch
Si vous souhaitez créer une nouvelle branche en réalisant un fork à partir de la branche sur laquelle vous vos trouvez, utiliser
git checkout -b <branch_name>
Si vous souhaitez pousser votre branche dans l'origine
git push origin <branch_name>
Enregistrer les modifications : commit
Contrairement à svn, le commit est effectué localement et doit ensuite être envoyé au serveur (en utilisant git push) ou pour une relecture de code (en utilisant git review).
Vous devez indiquer les fichiers du commit Même si vous changez le fichier, il ne sera pas validé, sauf si vous demandez Git de le faire. Vous pouvez utiliser la commande git add qui fera le commit des modifications
# ajouter un fichier pour le 'commit' git add file2 # si vous avez décidé de ne pas faire de ''commit'' sur file2, vous pouvez annuler le ''git add'' en faisant ''git reset file2'' # Ou sur toutes les modifications en attente avec juste : ''git reset'' (mais cela ne modifiera pas les fichiers sur le disque) git add file.cpp # faire le commit des fichiers marqués uniquement par git add git commit # ou validez aussi tous les fichiers suivis par git et qui ont été modifiés git commit -a
Si vous voulez modifier le commit que vous venez de faire, faites
git commit --amend # par exemple si vous avez oublié d'ajouter important_thing.c git add important_thing.c git commit --amend
Ceci va modifier le contenu du commit existant; si vous avez déjà fait un push dessus, alors vous ne pouvez pas faire de nouveaux push sur le distant parce que vous allez modifier une modification déjà faite. Faites ceci uniquement si le push n'a pas encore été exécuté.
Une fois le commit fait sur vos modifications, vous pouvez réaliser le push.
Fusionner les commit multiples : squash
Gerrit n'aime pas trop de commit dans un push, il faut donc parfois faire un commit de plusieurs éléments (cette action est dénommée squashing).
# sauvegarder le dépôt complètement
cp -r . /tmp/backup
# demander à git de fusionner les deux derniers 'commit' (HEAD avec l'avant dernier 'commit')
git rebase -i HEAD~1
# laissez le choix près du message que vous voulez garder, modifiez tous les messages que vous voulez fusionner avec 'squash'
# quelques fois il est nécessaire de faire cela
git rebase
# maintenant vous pouvez essayer à nouveau le push
git-review -R
# ou
git push
Afficher l'état d'une branche : git status
git status
Afficher le journal des commit d'une branche : log
git log
Pressez q pour quitter cette vue.
Téléverser ses commit, branches ou balises sur le serveur : push
Si tout se passe bien
En entrant git push
, tout doit normalement fonctionner.
Malheureusement cela fonctionne rarement.
En cas de problème
- Vous êtes rejeté parce que vous n'avez pas les droits :
- Il est possible qu'il manque le nom d'utilisateur dans l'URL; chaque fois que vous utilisez ssh, vous devez spécifier votre nom d'utilisateur (petrb@server.com)
- Vous avez extrait en utilisant http
- Vous pouvez modifier l'URL dans .git/config
- Vous n'avez en réalité aucun droit
- Vous devez contacter le propriétaire du dépôt
- Vous avez oublié certaines accroches
- Gerrit a besoin de l'accroche commit-msg (il est possible que cela ne soit plus nécessaire)
scp -p -P 29418 username@gerrit.wikimedia.org:hooks/commit-msg .git/hooks/ git commit --amend
- Des mises à jour ont été faites et vous n'êtes pas synchronisé.
git pull --rebase
- Vous utilisez une mauvaise commande pour faire le push
- Quelques fois vous devez utiliser ce qui suit (si vous savez pourquoi, expliquez-le) :
git push origin HEAD:refs/publish/master
- Certains dépôts ont leur propre système
git push-for-review-production
- Certains dépôts nécessitent git review
git-review -R
Si vous utilisez git-review vous devez avoir un fichier .gitreview dans le dépôt; si ce n'est pas le cas, créez-le :
[gerrit] host=gerrit.wikimedia.org port=29418 project= vous ajoutez ici un chemin relatif; exemple : labs/toollabs.git defaultbranch=master defaultrebase=0
Réinitialisation du dépôt : reset et stash
C'est très difficile pour Git d'annuler les modifications ou les réinitialisations que vous avez faites au dépôt pour le remettre dans l'état original qu'il avait lorsque vous l'avez cloné. Dans svn, il suffit simplement de supprimer les fichiers et d'exécuter svn up pour les restaurer. Dans Git, cela n'a aucun effet.
Il y a beaucoup de façons de réinitialiser le dépôt pour qu'il retrouve son état d'origine, mais le plus simple est de le supprimer et de le recloner à nouveau. Dans le cas d'un gros dépôt, vous ne voudrez certainement pas perdre votre temps et essayer ceci :
# réinitialisation logicielle - va réinitaliser tous les 'git add <partout ici>' - mais ne va pas annuler les modifications faites aux fichiers
git reset
# annuler tous les fichiers sur lesquels vous avez fait le 'commit' pour les remettre à la version qu'ils avaient après le dernier 'commit' - cela va annuler toutes les modifications que vous aurez apportées dans le 'commit' le plus récent
git stash
# réinitialisation matérielle
git reset --hard origin/master
# si vous voulez annuler toutes les modifications apportées à tous les fichiers et supprimer tous les fichiers qui ont été ajoutés depuis le dernier 'commit',
# restaure tous les fichiers que vous avez supprimés; ce que vous voulez c'est de réinitialiser le dépôt à l'état qu'il avait quand vous l'avez cloné.
# ou validé, aller sur la racine du dépôt (où se trouve '.git') et tout supprimer sauf '.git'
rm -r *
git stash
Spécificités Gerrit
Installer git review
Ubuntu / Debian
sudo apt-get install git-review
Télécharger un ensemble de corrections de gerrit
git review -d 31337
Ceci télécharge le contenu de https://gerrit.wikimedia.org/r/c/31337/ dans une nouvelle branche et déclare celle-ci comme étant la branche courante.
Rebaser un ensemble de corrections sur le master
Essayez d'abord de cliquer sur Rebase dans Gerrit. En cas d'échec, vérifiez que le commit a été fait sur tous les éléments, puis exécutez
git checkout master git pull git checkout branch_name git rebase master
Suivez les instructions sur l'écran.
Exemples
# configurer git
git config --global user.email some.guy@example.org
git config --global user.name Petrb
#########################################
# GERRIT
#########################################
# obtenir un dépôt
git clone https://gerrit.wikimedia.org/r/mediawiki/core.git mediawiki
cd mediawiki
# maintenant faites quelques modifications suivies du 'commit' :
git commit -a
# maintenant faire le push
git-review -R
#######################################
# GITHUB
#######################################
# obtenir un dépôt
git clone git@github.com:huggle/huggle3-qt-lx hg
cd hg
# extraire la nouvelle branche
git checkout -b feature
# maintenant, faites quelques modifications et validez-les :
git commit -a
# maintenant faire le push
git push origin feature