====== Git ====== Gestionnaire de code sources. Voir aussi: [[/informatique/gitlab]], [[http://gogs.io/|Gogs]] [[http://git-scm.com]] [[http://nvie.com/posts/a-successful-git-branching-model/|A successful Git branching model]] (January 05, 2010), This article talks about GIT as a tool for the versioning of source code and explains a sucessful branching and release management strategy (with a very comprehensive graph). > [[http://dmathieu.com/fr/git/pourquoi-vous-ne-devriez-pas-utiliser-la-fork-queue-de-github|Pourquoi vous ne devriez pas utiliser la Fork Queue de GitHub]]. GitHub propose une fonctionnalité qui peut sembler magique : la fork queue. Cette fonctionnalité est en soi assez simple à expliquer : elle affiche à l'écran tous les commits faits dans des forks de votre projet et vous permet, en quelques clics, d'appliquer ceux-ci à votre version du projet. Vu comme cela, c'est assez sympa. En pratique, je vous déconseille de l'utiliser. Nous allons voir pourquoi et comment faire sans. >> Il est possible d'utiliser la commande cherry-pick sans appliquer le commit immédiatement, de façon a lancer les tests avant de faire le commit. C'est utile si on doit extraire un commit qui se trouve aux milieux de plusieurs autres indésirable. --- //Yann Lugrin// => [[/informatique/gitlab|gitlab]] pour héberger soit même. ===== Docs ===== * Le [[http://www.git-scm.com/book/fr/v1|GIT book en français]]. * [[http://openclassrooms.com/courses/gerer-son-code-avec-git-et-githubl|Gérez vos codes sources avec Git]] sur OpenClassRooms. Git commands tips: * https://dev.to/jagroop2001/20-git-command-line-tricks-every-developer-should-know-1i21 ===== Credentials ===== === Spécifier la clé ssh === Sur la ligne de commande: GIT_SSH_COMMAND='ssh -i .ssh/the_private_key' git clone git@gitlab.com:Namespace/Project/theproject.git Dans la configuration git du projet: # vi .git/config [core] sshCommand="/usr/bin/ssh -i /home/user/.ssh/the_private_key" Dans la configuration du client ssh: # cat ~/.ssh/config Host gitlab.com Hostname gitlab.com IdentityFile /home/user/.ssh/the_private_key IdentitiesOnly yes === avec HTTPs === On peut configurer git pour conserver en cache (en mémoire) un certain temps le mot de passe pour HTTPs. [core] user = username [credential] helper = cache --timeout=3600 ===== Tips ===== * [[http://stackoverflow.com/questions/1123344/merging-between-forks-in-github|Merging between forks in GitHub]] * [[http://www.siteduzero.com/tutoriel-3-254198-gerez-vos-codes-source-avec-git.html#ss_part_8|Travailler avec des branches]] * [[http://stackoverflow.com/questions/2641146/handling-file-renames-in-git|Handling file renames in git]] * Annulé un/des Commit(s) : Revert or Reset ? * [[http://stackoverflow.com/questions/2389361/git-undo-a-merge|git: undo a merge?]] => Si les modifs n'ont pas été "pushées" un Reset est la bonne solution pour ne pas ajouter toutes les manips dans les logs. Par contre, après un Push un Revert est nécessaire. * [[http://stackoverflow.com/questions/179123/edit-an-incorrect-commit-message-in-git|Edit an incorrect commit message]], Amending the commit message * sub-modules * [[http://git-scm.com/book/en/Git-Tools-Submodules|6.6 Git Tools - Submodules]] * [[https://delicious-insights.com/fr/articles/git-submodules/|Comprendre et maîtriser les submodules Git]] === Revenir à une version précédente, pour toujours === Rewind local & remote Attention, pas de retour arrière possible, c'est pour toujours git reset --hard 4a3ba7 git push -f **Gitlab** interdit par défaut le push forcé ''remote: GitLab: You are not allowed to force push code to a protected branch on this project''. Il faut l'autoriser dans les options de la branche: "Settings / Repositories / Protected branches / Allowed to force push". {{ :informatique:git:gitlab_forced-push_allow.png?nolink&620 |}} === Créer un dépôt depuis un projet existant === source: [[https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/#platform-linux|https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line]] git config user.name and user.email for local (not global) config, juste remove "--global" option ;-) $ git config user.name "Your Name" $ git config user.email "you@example.com" === Cancel last commit === Annuler le dernier **commit** : $ git reset HEAD~ === Cancel an add === Annuler le "git add" de fichier(s) $ git reset === Amend last commit === Juste pour changer le commentaire : $ git commit --amend -m 'bla bla bla' Pour ajouter un fichier : $ git add le_fichier $ git commit --amend === Changer des commits de branche === //move commits to another branch// **La version simple**: Je viens de pousser un ou plusieurs commits mais j'aurai dû le faire dans une branche # Créer nouvelle branche depuis main, elle contiendra les commits en question git branch oups-branch # reset d'un ou plusieurs (n) commits selon HEAD~n git reset --hard HEAD~1 # ou remplacer HEAD~n par le hash du commit voulu git checkout oups-branch # forcer le push vers le remote git push -f # possible erreur si branch protégée: # remote: GitLab: You are not allowed to force push code to a protected branch on this project. === Force pull === Forcer le **pull** : # downloads the latest from remote without trying to merge or rebase anything $ git fetch --all # resets the master branch to what you just fetched git reset --hard origin/master === Faire un pull en conservant ses modifs === error: Your local changes to the following files would be overwritten by merge La solution: mettre ses modifs de côté pendant le pull: $ git stash $ git pull $ git stash pop === Merge only a specific commit === Merger **un seul commit** - Parfois on veut merger un seul commit, mais il est situé après d'autres commit que l'on ne veut pas intégrer. 1. Retrouver le SHA du commit $ git checkout branch-avec-le-commit $ git log 2. Retourner dans la branche sur laquelle on souhaite appliquer le commit (merge) $ git checkout branch-destination $ git cherry-pick -n [Le SHA du commit] $ git diff --cached # pour vérifier la modif $ git commit -a -m “merge [SHA du commit]" === Rétablir un fichier depuis un commit === ''git checkout -- '' $ git log --oneline resources/views/auth/register.blade.php f5d16d4 (HEAD -> main, origin/main) WIP refactorize User data #13 1f27c64 User registration 5cfb6d7 initial code (bis) $ git checkout 1f27c64 -- resources/views/auth/register.blade.php $ git status Sur la branche main Votre branche est à jour avec 'origin/main'. Modifications qui seront validées : (utilisez "git restore --staged ..." pour désindexer) modifié : resources/views/auth/register.blade.php === Create a Tag === Créer un **tag** $ git tag -a v1.0 -m 'version 1.0 is the initial github import' Et ne pas oublier de publier ce nouveau tag (par défaut créé localement): $ git push origin v1.0 === Delete a Tag === Pour supprimer une tag localement: $ git tag -d release01 puis sur le remote: $ git push origin --delete release01 ou $ git push origin :refs/tags/release01 === Create a Branch === Créer une **branche** Créer la branche sur le remote $ git push origin origin:refs/heads/nom_nouvelle_branche Se connecter localement à la branch $ git checkout nom_nouvelle_branche $ git pull === Merge a Branch === Fusionner une branche. Se rendre dans la branche « destination » : git checkout destination Intégrer le travail de la branche « autre_branche » : git merge autre_branche Tous les commits de la branche « autre_branche » se retrouvent maintenant dans « destination ». === Delete a Branch === On peut supprimer une branche « autre_branche » (si mergée dans master ou une autre branche). Delete local: git branch -d autre_branche Delete remote: git push origin --delete === Log & graph === {{ :informatique:git:git-log-graph.png?nolink&400}} ''git log --graph'' ===== Tools ===== [[/web#hebergement_de_projets|Hébergement en ligne de projets]] avec Git. ==== SmartGit ==== http://www.syntevo.com/smartgit/index.html SmartGit is an efficient user interface for Git, focussing on simplicity and targeting non-experts and people who prefer a graphical application over command line usage. The current version of SmartGit supports those Git features which are required for the every-day work in software development projects, most notably: * Virtually all local working tree operations * Status, diff, log * Push, pull, fetch (for all protocols) * Tag and branch management * Merge, cherry-pick, rebase * Stash management * Submodule support * Basic Git-SVN support (to use SmartGit as SVN client)