Table des matières

GIT

Installation

Serveur Git en HTTP

Installation d'un serveur Git accessible en HTTPS sous Debian.

Installer apache et git depuis les repos :

apt install git-core apache2 php phpunit unzip php-zip

Créez un dossier pour les projets git (la racine du site web) :

mkdir /var/www/git
chown -R www-data:www-data /var/www/git

Activer les modules apache (notamment WebDAV):

a2enmod dav_fs env cgi rewrite alias ssl

Configurer apache. Créer et éditer le fichier /etc/apache2/sites-available/git.domain.local.conf

<VirtualHost *:80>
        ServerName git.domain.local

        DocumentRoot "/var/www/git"

        <Directory "/var/www/git">
                Options none
                AllowOverride AuthConfig
                #AllowOverride None
                Order allow,deny
                Allow from all
                Require all granted
        </Directory>

        SetEnv GIT_PROJECT_ROOT /var/www/git
        SetEnv GIT_HTTP_EXPORT_ALL
        ScriptAlias / /usr/lib/git-core/git-http-backend/

        <Files "git-http-backend">
            AuthType Basic
            AuthName "Git Access"
            AuthUserFile "/var/www/.htpasswd"
            Require valid-user
        </Files>
</VirtualHost>

Activer le site:

a2ensite git.domain.local

Installation de Gitlist

Gitlist permet de visionner le dépôt depuis un simple navigateur sans devoir utiliser le client Git. Installation sous Debian.

Aller dans le dossier :

cd /var/www

Récupérer le projet sur GitHub:

git clone https://github.com/klaussilveira/gitlist.git

Installer les dépendances avec Composer :

curl -s http://getcomposer.org/installer | php
php composer.phar install

Copiez le fichier config.ini-exemple en config.ini

cp config.ini-example config.ini

Changez le propriétaire du dossier gitlist :

chown -R www-data:www-data .

Configurer apache. Créer et éditer le fichier /etc/apache2/sites-available/gitlist.domain.local.conf

<VirtualHost *:80>
        ServerName gitlist.domain.local

        DocumentRoot "/var/www/gitlist"
        <Directory "/var/www/gitlist">
                #Options none
                AllowOverride All
                AuthName "GitList"
                AuthType Basic
                AuthUserFile "/var/www/.htpasswd"
                #AllowOverride None
                Order allow,deny
                Allow from all
                Require all granted
        </Directory>
</VirtualHost>

Activer le site :

a2ensite gitlist.domain.local

Configuration de Gitlist

Editez le fichier config.ini

vim /var/www/gitlist/config.ini

Changez les lignes suivantes :

repositories[] = '/var/www/git/' ;

title = "My Git"

show_http_remote = true ;
http_host = 'git.domain.local' ;
use_https = true ;
http_url_subdir = '' ;

http_user_dynamic = true ;

Créer un projet sur le serveur

Se positionner à la racine de Git:

cd /var/www/git

Créer le dossier du projet :

mkdir myproject.git

Initialisez votre projet

cd myproject.git
git --bare init
git update-server-info
chown -R www-data:www-data .

Le projet est disponible via git : https://git.domain.local/myproject.git Sur gitlist le projet ainsi : https://gitlist.domain.local/myproject.git

Utilisation du client

Initialisation d'un dépôt

Définir le nom et email qui apparait dans les commits :

git config --global user.name benoit
git config --global user.email benoit@domain.local

Si le dépôt est encore vierge, le premier commit se passe ainsi :

mkdir myproject
touch .gitignore
git init
git add .
git commit -m "Initial commit"
git remote add origin https://benoit@domain.local/myproject.git
git push --set-upstream origin master

Si a tout hasard vous souhaitez changer l'adresse :

git remote set-url origin https://domain.local/myproject.git

Si le projet est existant et contient déjà des commit pour récupérer un projet :

mkdir myproject
cd myproject
git clone https://benoit@git.domain.local/myproject.git

Si votre dépôt est avec un certificat autosigné :

git -c http.sslVerify=false clone https://benoit@git.domain.local/myproject.git

Mettre à jour son dépôt local à partir du dépôt distant

Il faut systématiquement avoir le reflex le faire pour s'assurer d'avoir une copie à jour du projet.

git pull

Ajouter un fichier ou dossier au dépôt

Ajouter un fichier :

git add file.php

Pour ajouter tout ce qu'il y a dans le dossier

git add .

Supprimer un fichier ou dossier du dépôt

Pour retirer un fichier du dépôt :

git rm test.php

Renommer/déplacer un fichier ou dossier du dépôt

Pour retirer un fichier du dépôt :

git mv test.php test_ren.php

Commit et Push vers le dépôt

Le commit met à jour votre dépôt local. Quant au push il poussera vos commit locaux vers le serveur GIT distant.

Mise à jour du dépôt local :

git commit * -m "Commit files"

Mise à jour du dépôt distant :

git push

Restaurer une ancienne version

Vous avez accidentellement supprimé le fichier test.php? Pour le restaurer :

git checkout HEAD test.php

Ou bien pour restaurer tout :

git checkout HEAD .

Vous souhaitez restaurer un version particulière. Lister l'historique des commit pour commencer :

git log --oneline

Vous aurez une liste des commits. Identifier la version à restaurer (exemple 2c1bc23) :

f42d29c erreur fichier info.php
2c1bc23 bon fichier info.php
28a9443 autre commit

Pour la restaurer :

git checkout 2c1bc23 info.php
git add info.php
git commit -m 'restauration info.php de 2c1bc23'
git push

Restaurer tout le projet au dernier push

Annule toutes les modifications dans les fichiers suivis :

git reset --hard

Supprime tous les fichiers non suivis (-f pour forcer, et -d pour supprimer les répertoires) :

git clean -fd

Checkout de la branche :

git checkout master

Gestion des conflits

Prenons l'exemple ci-dessous:

L'utilisateur “A” a modifier, commit et push le fichier test.php avec le contenu suivant:

<?php echo "toto\n" ?>
toto

L'utilisateur “B”, ne fait pas de git pull, modifie et commit le même fichier test.php avec le contenu suivant:

<?php echo "toto\n" ?>
titi

L'utilisateur “B” fait git push et obtient l'erreur suivante :

hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Celà signifie que sa copie n'est pas à jour. Il doit faire un git pull. Il obtiendra l'erreur suivante:

remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://git.domain.local/myproject
   2589a58..8f037d9  master     -> origin/master
Auto-merging test.php
CONFLICT (content): Merge conflict in test.php
Automatic merge failed; fix conflicts and then commit the result.

L'utilisateur “B” peut lister les conflits ainsi :

git status

Il peut visionner les différences en éditant le fichier test.php:

vim test.php

Qui a le contenu suivant :

<?php echo "toto\n" ?>
<<<<<<< HEAD
titi
=======
toto
>>>>>>> 8f037d9489ed346ab644e65654ca406c07904dcb

Pour voir le début du conflit de fusion du fichier, recherchez dans le fichier le marqueur de conflit «««<. Lorsque vous ouvrez le fichier dans votre éditeur de texte, vous verrez les modifications de la branche HEAD ou de base après la ligne «««< HEAD. Ensuite, vous verrez =======, qui divise vos modifications à partir des modifications dans l'autre branche, suivi de »»»> BRANCH-NAME. Dans cet exemple, l'utilisateur “B” a écrit titi dans la branche de base ou HEAD et l'utilisateur “B” a écrit toto dans la branche de comparaison ou la 8f037d9489ed346ab644e65654ca406c07904dcb.

Choix 1 - Editer le fichier et fusionner manuellement les différences

A vous de décider ce que vous voulez modifier. Admettons que ce contenu est ce que l'utilisateur B souhaite garder :

<?php echo "toto\n" ?>
titi
toto

Il doit maintenant ajouter le fichier :

git add test.php
git commit -m "Resolved merge conflict"
git push

Choix 2 - Rejeter la copie distante et imposer la notre

On garde notre copie :

git checkout --ours .

Marquer tous les fichiers en conflits comme fusionnés :

git add -u

Commit et push :

git commit -m "On impose notre copie"
git push

Choix 3 - Accepter la copie distante

On garde la copie distante :

git checkout --theirs .

Marquer tous les fichiers en conflits comme fusionnés :

git add -u

Commit et push :

git commit -m "Copie distante acceptée"
git push

Gestion des branchs

Créer une nouvelle branche

Créer la branch nommée par exemple test1_branch:

git checkout -b test1_branch

Ajouter les fichiers, vos modifications, les comit etc… Puis pour faire le premier push sur cette branche :

git push --set-upstream origin test1_branch

Switcher sur une autre branche

Si quelqu'un d'autre doit aussi travailler sur la nouvelle branche. Il peut switcher ainsi :

git checkout test1_branch

Pour revenir à la branch master :

git checkout master

Fusionner une branch vers le master

Switcher sur la branche master :

git checkout master

Fusionner la branche test1_branch :

git merge test1_branch

Commit de la fusion :

git commit . -m "fusion branch test1_branch avec master"

Puis un push :

git push

Pour récupérer un fichier venant d'une autre branche et l'intégrer à la votre. Ci-dessous, on récupère le fichier hotfix.php depuis la branche hotfix :

git checkout test1_branch
git checkout origin/hotfix hotfix.php

Renommer une branch

Récupérer la copie à renommer:

git checkout old_branch_name

Renommer la branch:

git branch -m new_branch_name

Pousser la nouvelle branch:

git push origin -u new_branch_name

Effacer l'ancienne branch:

git push origin --delete old_branch_name

Créer une branch orpheline

git checkout --orphan NEWBRANCH
git rm -rf .

Lister les branchs

Lister les branchs

git branch