====== 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''
ServerName git.domain.local
DocumentRoot "/var/www/git"
Options none
AllowOverride AuthConfig
#AllowOverride None
Order allow,deny
Allow from all
Require all granted
SetEnv GIT_PROJECT_ROOT /var/www/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias / /usr/lib/git-core/git-http-backend/
AuthType Basic
AuthName "Git Access"
AuthUserFile "/var/www/.htpasswd"
Require valid-user
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''
ServerName gitlist.domain.local
DocumentRoot "/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
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:
toto
L'utilisateur "B", ne fait pas de ''git pull'', modifie et commit le même fichier ''test.php'' avec le contenu suivant:
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 :
<<<<<<< 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 :
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