Utiliser un dépôt git en local c'est bien, mais le gros intérêt du versionning c'est de pouvoir travailler à distance mais aussi de collaborer à plusieurs.
--bare
Lorsque l'on fait un git init
on a la possibilité d'ajouter le drapeau --bare. Cette option permet de préciser que ce dossier ne contiendra pas de dossier de travail mais seulement l'historique de notre projet. Ces dossiers --bare peuvent être utilisés comme dépôt distant.
cd mon-remote
git init --bare
Avec git n'importe quoi peut servir de dépôt distant. On peut utiliser un dossier spécifique, un chemin ssh://, un service tiers comme bitbucket ou github. Je vous conseille de vous faire la main avec un dossier servant de remote dans un premier temps avant de vous lancer sur ces services qui introduisent de nouvelles notions.
remote
La commande remote
vous permet de créer voir et supprimer des connexions. Il faut voir ces connexions comme de simples alias vers le véritable chemin du dépôt. Ces chemins étant beaucoup plus simple à taper et surtout à retenir !
git remote # Liste les dépôts distants
git remote -v # Liste les dépôts distants et les chemins associés
git remote add <alias> <chemin/url> # Ajoute un nouveau dépôt distant
git remote rm <alias> # Supprimé un dépôt distant
git remote rename <old> <new>
push
La commande push permet de transférer les commits locaux vers le dépôt distant.
git push <remote> <branche>
git push <remote> --all # Permet d'envoyer toutes les branches
La commande push permet d'envoyer tous les commits d'une ou plusieurs branche au dépôt distant. Git ne permet pas de push si le dépôt distant est en décalage (pas de fast-forward possible) et dans ce cas là vous pouvez utiliser le drapreau --force
git push <remote> --force
Ce drapeau doit être utilisé en dernier recours (normalement vous n'en aurez jamais besoin) car il va modifier l'historique distant et peu ainsi affecter tous les collaborateurs. Mais ça peut être utile en cas de problème, si par exemple vous envoyez un commit en oubliant de retirer une clef d'API ou une information sensible.
fetch
La commande fetch permet d'importer les informations du dépôt distant. L'import se fait à travers des branches spéciales pour nous donner la possibiliter de comparer et si besoin fusionner manuellement.
git fetch <remote> # Récupère toutes les branches et tous les commits
git fetch <remote> <branche>
En général on peut sauter cette étape mais si on souhaite par exemple comparer notre branche master à celle disponible à distance un fetch est essentiel.
git fetch origin master
git log master..origin/master # Permet de voir les commits entre ma branche master et celle du remote
Si les modifications me semble acceptable pour une fusion je peux alors fusionner manuellement
git merge origin/master
pull
Récupérer les infos du remote avec un fetch puis un merge n'est pas forcément très "user-friendly". La commande pull permet de faire un git fetch
suivi d'un git merge
en une seule commande.
git pull <remote>
git pull <remote> <branche>
Si votre dépôt local est en avance git fera alors un 3-way merge. Si vous souhaitez éviter ça vous pouvez demander à git de faire un rebase automatiquement lors du pull.
git pull --rebase <remote>
Il est possible d'indiquer à git que l'on souhaite faire un rebase par défaut en modifiant dans la configuration branch.autosetuprebase
.
git config --global branch.autosetuprebase always
Cela permet d'éviter de "poluer" l'historique de multiples "merge origin/master".