====== 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