====== GIT ======
Git est un outil de dépôt de logiciel. Il s'adresse aux kaznautes avertis.
??? Comment déposer mes sources sur votre git ?
!!!
Nous réservons cette fonction aux kaznautes (toujours dans le souci de localiser les données au plus proche des utilisateurs).
Si vous souhaitez avoir un compte sur notre git, envoyez-nous un courriel à [[contact@kaz.bzh|]]
???
====== Quelques commandes utiles ======
Voici quelques commandes utiles. La liste n'est pas exhaustive. En particulier, il n'est pas expliqué comment détruire des branches ou des rétractations d'évolution des sources sur le serveur.
Ceci est très dangereux car, si un autre développeur a entre-temps fait des mises à jour les changements incrémentaux n'auront plus aucun sens (c'est un peu comme modifier le continuum espace-temps et entraîner la destruction de l'univers. Dans le meilleur des cas, cela pourrait se limiter à votre espace git).
===== Principe =====
GIT est un moyen pour les développeurs de gérer des versions de leurs sources.
On distingue :
* une base de données sur un ou des serveurs (remote)
* une base de données locale chez chaque développeur (local)
{{ :git:git-schema.png?direct&400 |}}
Voici 4 familles de commande GIT suivant le sens de déplacement des données :
* (1) copie une branche de la BD locale vers le répertoire courant
git checkout ...
* (2) copie du répertoire courant vers une branche de ta BD locale.
git commit -a
* (3) copie du serveur vers le répertoire courant
git pull ...
* (4) copie du répertoire courant vers le serveur
git push ...
===== Initialisation =====
Si vous êtes développeurs voici quelques commandes pratiques :
Pour clone en écriture (vous devez avant déposer votre clef SSH)
git clone git+ssh://git@git.kaz.bzh:2202/mon-projet-git.git
Ensuite on suppose que vous êtes dans le répertoire cloné :
cd mon-projet-git
Pour pouvoir pousser du code il faut être identifié :
git config user.email mon-login@kaz.bzh
git config user.name Mon-Nom
Vous pouvez utiliser votre éditeur préféré pour écrire un message de version.
En plus il indique dans des lignes en commentaire les fichiers modifiés et ceux qui ne sont pas référencés.
export EDITOR=emacs
Il faut faire la modification dans son ~/.bashrc
On peut vérifier les branches existantes :
git branch -a
On peut visualiser la structure des branches avec :
gitk
On se place dans une branche (exemple master) avec :
git checkout master
===== Développement =====
Pour la création d'une sous-branche
git checkout -b develop master
git checkout -b develop-perso develop
On obtient la structure suivante
master
└── develop
└── develop-perso
On peut créer des répertoires et des fichiers, ils ne seront pas affectés par les changements de branche tant qu'ils ne sont pas inclus dans la liste des fichiers de référence.
On peut ajouter des fichiers avec la commande suivante (la tabulation complète avec les fichiers pas encore dans le git) :
git add mon-fichier
A tout moment, on peut synchroniser les fichiers avec la référence locale qui se trouve dans .git (synchronisation répertoire - base locale) avec la commande :
git commit -a
On peut changer de branche à condition faire une synchronisation avant chaque changement.
Une fois que le code est satisfaisant, on peut pousser la branche sur le git (synchronisation base locale - base du serveur) avec la commande :
git push origin develop
Avant de modifier une branche pensez à synchroniser votre branche avec la dernière version du serveur :
git fetch -a
git pull une-branche
Pour ne pas à avoir à indique quel branche vous voulez charger, vous pouvez indiquer que votre branche locale suit les mis-à-jour d'une branche distante :
git branch --set-upstream-to=origin/develop develop
git config push.default current
De même si vous acceptez en cas de conflit que git fasse le mélange les modifications des autres avec votre version actuelle, vous pouvez indiquer ce paramètre par défaut :
git config pull.rebase false
Dans ce cas, il pourra identifier des conflits qui seront signalés dans les sources (ça les rend invalides tant qu'un humain n'a pas fait des corrections nécessaires).
pour intégrer les modifications d'une autre branche faire :
git merge une-branche-avec-de-nouvelles-fonctions
Pour réinitialiser vos fichiers à la dernière synchronisation locale (commit), c'est à dire perdre votre travail en cours :
git reset --hard HEAD
Si vous êtes plusieurs développeurs, git fait des fusions automatiques et va prendre de chaque contribution les modifications ajout ou suppression de ligne. En revanche, si 2 développeurs vont chacun dans leur branche faire une modification différente (comme renommer une variable i en j dans les 2 cas mais ne pas mettre le même nombre d'espaces avant). Dans ce cas, seul un être humain peut résoudre ce problème.
Mais git vous le signale avec le motif suivant :
<<<<<<< votre branche
votre code
=======
Autre code
>>>>>>> autre branche
Prenons l'exemple du fichier test.c qui contient :
int i; // une variable
Vous avez modifié votre branche develop-perso avec :
int j; // compteur de brouzouf (avant c'était i)
Sur le site une modification a été enregistrée :
int j; // compteur de brouzouf (modif dans develop)
Au moment de git pull ou de git merge develop, il y a le message :
Fusion automatique de test.c
CONFLIT (contenu) : Conflit de fusion dans test.c
La fusion automatique a échoué ; réglez les conflits et validez le résultat.
L'édition du fichier donne :
{{ :git:conflit-fussion.png?direct&600 |}}
Voici quelques commandes utiles :
key binding
--- -------
C-c ^ n smerge-next
C-c ^ p smerge-prev
C-c ^ u smerge-keep-upper
C-c ^ l smerge-keep-lower
C-c ^ a smerge-keep-all
C-c ^ RET smerge-keep-current
C-c ^ C smerge-combine-with-next
Pour rechercher les conflits faire
git diff --name-only --diff-filter=U
ou
find . -type f -exec grep -q "<<<<<<<" {} \; -exec grep -q ">>>>>>>" {} \; -print
===== Fusion =====
Vous pourrez modifier toutes vos branches, mais vous n'aurez peut-être pas le droit de modifier master (c'est une bonne pratque).
Dans ce cas, il faut passer par une demande de fusion via le serveur.
Tout ce fait avec des cliques.
{{ :git:demande-fusion.png?direct&400 |}}
Ensuite vous remplissez le formulaire en indiquant à gauche la branche de destination et à droite la branche qui contient modifications récentes (le sens n'est pas naturel).
{{ :git:confirme-fusion.png?direct&600 |}}
L'administrateur va lui ensuite valider sans rien faire s'il est d'accord ou bien charger cette branche, la modifier et utiliser la commande "merge".
{{ :git:valide-fusion.png?direct&600 |}}