|
|
Ligne 337 : |
Ligne 337 : |
| | git push --force-with-lease || gpf || | | | git push --force-with-lease || gpf || |
| |} | | |} |
|
| |
| = [https://git-scm.com/docs/gitrevisions git revision] =
| |
| {| class="wikitable wtp wtmono1"
| |
| |-
| |
| | HEAD~N || Nth ancestor
| |
| |}
| |
|
| |
| = Créez un dépôt =
| |
| <kode lang=bash>
| |
| # depuis le répertoire qui deviendra la racine du dépôt
| |
| git init
| |
| </kode>
| |
|
| |
| == Ignorez des fichiers ==
| |
| <filebox fn=.gitignore lang=bash>
| |
| # ignorez les fichiers temporaires
| |
| *~
| |
| # ignorez un dossier
| |
| MonDossier/*
| |
| </filebox>
| |
| {{info | Le fichier {{boxx|.gitignore}} affecte le dossier dans lequel il se trouve ainsi que les sous-dossiers.<br />
| |
| On peut donc créer des fichiers {{boxx|.gitignore}} spécifiques pour certains sous-dossiers.}}
| |
|
| |
| * [[Visual_studio_et_git#gitignore|ASP.NET applications]]
| |
|
| |
| == ignore locally without .gitignore ==
| |
| Works as {{boxx|.gitignore}} but this file is not tracked.
| |
| <filebox fn='.git\info\exclude'>
| |
|
| |
| </filebox>
| |
|
| |
| = [https://git-scm.com/docs/git-clone Clonez un dépôt] =
| |
| <kode lang=bash>
| |
| # créé un dossier contenant une copie du dépôt distant
| |
| git clone git://url/projet.git [destination]
| |
| # si destination n'est pas précisée, git extrait un nom de l'url, ici: projet
| |
|
| |
| # Récupérer seulement les n dernier commit de la branche pointé par HEAD
| |
| git clone --depth n git://url/projet.git
| |
|
| |
| # Récupérer seulement une branche (par défaut, la branche pointé par HEAD)
| |
| git clone git://url/projet.git [--branch master] --single-branch [destination]
| |
|
| |
| # Partial clone
| |
| ## Blobless clone: without files content
| |
| git clone --filter=blob:none git://url/projet.git [destination]
| |
|
| |
| ## Treeless clone: without files content and folders
| |
| git clone --filter=tree:none git://url/projet.git [destination]
| |
|
| |
| # Shallow clone: get only the n last commits
| |
| git clone --depth n git://url/projet.git [destination]
| |
| </kode>
| |
| * [https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone Get up to speed with partial clone and shallow clone]
| |
|
| |
| = [https://git-scm.com/docs/git-add Add: from the Working Directory to the Index] =
| |
| <kode lang=bash>
| |
| # add MonFichier from the Working Copy to the Index
| |
| git add MonFichier
| |
|
| |
| # add all the files and folders from the Working Copy to the Index
| |
| git add .
| |
| # git add -u → add only the modified and deleted, but not the new and untracked files
| |
| # git add -n → dry-run
| |
|
| |
| # remove MonFichier from the Index and keep it in the Working Directory
| |
| git rm --cached MonFichier
| |
| # remove all the files and folders from the Index and keep them in the Working Directory
| |
| git rm --cached -r .
| |
| </kode>
| |
|
| |
| == Indexation partielle ==
| |
| Permet de ne valider qu'une partie des modifications d'un fichier.<br />
| |
| Utilisez l'option patch de git : <syntaxhighlight lang=bash inline>git add -p</syntaxhighlight><br />
| |
| Options pour chaque bloc de modification du fichier :
| |
| <pre>
| |
| indexer cette partie [y,n,a,d,/,j,J,g,e,?]?
| |
| y - indexer cette partie
| |
| n - ne pas indexer cette partie
| |
| a - indexer cette partie et toutes celles restantes dans ce fichier
| |
| d - ne pas indexer cette partie ni aucune de celles restantes dans ce fichier
| |
| g - sélectionner une partie à voir
| |
| / - chercher une partie correspondant à la regexp donnée
| |
| j - laisser cette partie non décidée, voir la prochaine partie non encore décidée
| |
| J - laisser cette partie non décidée, voir la prochaine partie
| |
| k - laisser cette partie non décidée, voir la partie non encore décidée précédente
| |
| K - laisser cette partie non décidée, voir la partie précédente
| |
| s - couper la partie courante en parties plus petites
| |
| e - modifier manuellement la partie courante
| |
| ? - afficher l'aide
| |
| </pre>
| |
|
| |
| = Commit: from the Index to the Head =
| |
| <kode lang=bash>
| |
| # Valider l'index
| |
| git commit
| |
|
| |
| # Ajouter tous les nouveaux fichiers et les fichiers modifiés à l'index puis valider l'index
| |
| git commit -a
| |
| </kode>
| |
| * [https://git-scm.com/docs/git-commit git commit]
| |
|
| |
| = Visualiser les modifications =
| |
| <kode lang=bash>
| |
| # visualiser l'état dans lequel se trouve les changements: indexé, non-indexé, non-versionné
| |
| git status
| |
|
| |
| # visualiser les modifications qui n'ont pas encore été ajoutées à l'index
| |
| git diff
| |
|
| |
| # visualisez les modifications ajoutées à l'index
| |
| git diff --cached
| |
|
| |
| # comparer un fichier entre 2 branches
| |
| git diff master MaBranche -- MonFichier.ext
| |
| </kode>
| |
| * [https://git-scm.com/docs/git-status git status]
| |
| * [https://git-scm.com/docs/git-diff git diff]
| |
|
| |
| = Supprimer / déplacer des fichiers =
| |
| <kode lang=bash>
| |
| # supprimer MonFichier de git (arrêtez le suivi de version du fichier) et de la copie de travail
| |
| git rm MonFichier
| |
|
| |
| # supprimer le MonFichier de git (arrêtez le suivi de version du fichier) mais le conserver dans la copie de travail
| |
| git rm --cached MonFichier
| |
|
| |
| git mv ancien_fichier nouveau_fichier
| |
| # équivalent de:
| |
| # mv ancien_fichier nouveau_fichier
| |
| # git rm ancien_fichier
| |
| # git add nouveau_fichier
| |
| </kode>
| |
| * [https://git-scm.com/docs/git-rm git rm]
| |
| {{info | Le dossier parent peut être renommé sans influence sur le dépôt local ou distant.}}
| |
|
| |
| = Visualisez l'historique des validations =
| |
| <kode lang=bash>
| |
| # énumère en ordre chronologique inversé les commits réalisés
| |
| git log
| |
| </kode>
| |
| <u>Options :</u>
| |
| * <tt>-p</tt> : montre les différences introduites entre chaque validation
| |
| * <tt>-2</tt> : limite la sortie de la commande aux 2 entrées les plus récentes
| |
| * <tt>-pretty=format="%h - %an, %ar : %s"</tt> : décrit précisément le format de sortie
| |
| * <tt>--name-only</tt> : affiche la liste des fichiers modifiés
| |
| * <tt>--name-status</tt> : affiche la liste des fichiers affectés accompagnés du staus ajout, modification ou suppression
| |
|
| |
| <kode lang=bash>
| |
| # Utilisez une interface graphique pour visualiser l'historique
| |
| gitk
| |
| </kode>
| |
|
| |
| = Modifier l'historique =
| |
| <kode lang='bash'>
| |
| # accès à l'historique de MaBranche (HEAD par défaut)
| |
| git reflog MaBranche
| |
| # possibilité de reset à un moment de l'historique
| |
| </kode>
| |
| {{warn | Si les modifications ont déjà été envoyées au serveur, il est toujours possible d'écraser les commits envoyés <syntaxhighlight lang='bash' inline>git push --force-with-lease</syntaxhighlight>}}
| |
|
| |
| == Modifier le dernier commit ==
| |
| <kode lang=bash>
| |
| # Modification du dernier commit en y ajoutant les modifications des fichiers indexés
| |
| git commit --amend
| |
| # Modifier l'auteur du dernier commit
| |
| git commit --amend --author "New Author Name <email@address.com>"
| |
| # Modifier le commentaire du dernier commit
| |
| git commit --amend -m "Nouveau commentaire"
| |
| </kode>
| |
|
| |
| === [http://stackoverflow.com/questions/12481639/remove-files-from-git-commit Retirer un fichier du dernier commit sans le supprimer] ===
| |
| <kode lang=bash>
| |
| # delete the file from the git repository without deleting it on the file system
| |
| git rm --cached unwanted-file.ext
| |
| # amend the latest commit
| |
| git commit --amend
| |
|
| |
| # other solution: met le dernier commit en édition
| |
| git reset --soft HEAD~
| |
|
| |
| # retire de l'index le fichier souhaité
| |
| git reset unwanted-file.ext
| |
|
| |
| # sauvegarde le commit avec le même message et le même timestamp
| |
| git commit -c ORIG_HEAD
| |
| # -C: reuse-message, take an existing commit object, and reuse the log message and the authorship information (including the timestamp) when creating the commit.
| |
| # -c: reedit-message, like -C, but with -c the editor is invoked, so that the user can further edit the commit message.
| |
| # ORIG_HEAD: is previous state of HEAD, set by commands that have possibly dangerous behavior, to be easy to revert them.
| |
| </kode>
| |
|
| |
| == Modifiez un commit autre que le dernier ==
| |
| <kode lang=bash>
| |
| # pour modifier l'avant-dernier commit
| |
| git rebase -i HEAD~2
| |
| # ici on désigne le parent du commit à modifier : HEAD~2
| |
| # dernier commit : HEAD , avant-dernier commit : HEAD~1 , parent de l'avant-dernier commit : HEAD~2
| |
| # first commit: --root
| |
|
| |
| # marquer les commits à modifier → remplacer pick par edit
| |
|
| |
| # apporter les modifications nécessaires puis éditer le dernier commit
| |
| git commit --amend
| |
|
| |
| # pour terminer, continuer le rebase qui va réécrire tous les commits suivant
| |
| git rebase --continue
| |
| </kode>
| |
| {{info | Tous les commit entre celui qui sera modifié et HEAD seront réécrit }}
| |
|
| |
| === [https://stackoverflow.com/questions/52096295/git-modify-an-old-commit-with-the-file-currently-in-my-working-directory Modify a commit with the content of working directory] ===
| |
| <kode lang='bash'>
| |
| # first create a new commit with the content of working directory
| |
| git add file.txt
| |
| git commit
| |
|
| |
| # rebase on the parent of the commit you want to change
| |
| git rebase -i xxxxx
| |
|
| |
| # move the commit you newly created just after the one you want to change
| |
| # and mark it as fixup (like squash but retains the commit message of the commit being squashed into)
| |
|
| |
| # finish the rebase
| |
| git rebase --continue
| |
| </kode>
| |
|
| |
| === [https://stackoverflow.com/questions/2719579/how-to-add-a-changed-file-to-an-older-not-last-commit-in-git Ajouter une modification à l'avant-dernier commit] ===
| |
| <kode lang=bash>
| |
| # mettre de côté la modification
| |
| git stash
| |
|
| |
| # rebase jusqu'au commit à modifier HEAD~2: parent de l'avant-dernier commit
| |
| git rebase -i HEAD~2
| |
| # marquer l'avant-dernier commit à modifier → remplacer pick par edit
| |
|
| |
| # ressortir la modification
| |
| git stash pop
| |
|
| |
| # ajouter le fichier contenant la modification
| |
| git add my-file.txt
| |
|
| |
| # modifier le commit
| |
| git commit --amend
| |
|
| |
| # terminer le rebase
| |
| git rebase --continue
| |
| </kode>
| |
|
| |
| === [https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History Squashing Commits] ===
| |
| Exemple: squash commits HEAD~3..HEAD
| |
| <kode lang=bash>
| |
| # HEAD~3: target the 3rd parent of last commit
| |
| # Edit the last 3 commits (HEAD~0, HEAD~1, HEAD~2)
| |
| git rebase -i HEAD~3
| |
|
| |
| # replace the "pick" word by "squash" or "s" on commits HEAD~0, HEAD~1, HEAD~2
| |
| # so they will be merged into a new commit
| |
| </kode>
| |
|
| |
| In case of the following error: [https://stackoverflow.com/questions/39595034/git-cannot-squash-without-a-previous-commit-error-while-rebase cannot 'squash' without a previous commit]<br>
| |
| When squashing, the commit selected for squashing is combined with the commit that precedes it in the (edited) list, i.e. the commit from the previous line.<br>
| |
| In your case - there is no previous commit for 56bcce7. You have to do one of the following
| |
| <kode lang='bash'>
| |
| # reword the first commit in the list
| |
| 1 r 01cc5a08 ...
| |
| 2 s a2b6eecf ...
| |
| </kode>
| |
|
| |
| === Diviser l'avant-dernier commit ===
| |
| <kode lang=bash>
| |
| # HEAD~2: parent de l'avant-dernier commit
| |
| git rebase -i HEAD~2
| |
| # marquer l'avant-dernier commit à modifier -> edit
| |
|
| |
| # défait le commit et laisse les fichiers modifiés non indexés
| |
| git reset HEAD^
| |
|
| |
| # indexation d'une partie des fichiers non indexés
| |
| git add -p
| |
| # commit de la première partie
| |
| git commit -m "partie1"
| |
| # commit du reste
| |
| git commit -m "partie2"
| |
|
| |
| # terminer le rebase
| |
| git rebase --continue
| |
| </kode>
| |
|
| |
| == Stopper temporairement le suivi d'un fichier ==
| |
| <kode lang=bash>
| |
| # ignore temporairement tous les changement apportés à MonFichier
| |
| git update-index --assume-unchanged MonFichier
| |
|
| |
| # reprend le suivi de MonFichier
| |
| git update-index --no-assume-unchanged MonFichier
| |
| </kode>
| |
|
| |
| == Supprimer les modifications non-commitées ==
| |
| <kode lang=bash>
| |
| # Réinitialisez un fichier
| |
| git checkout -- fichier_à_réinitialiser
| |
|
| |
| # Réinitialisez tous le dépôt
| |
| git reset --hard && git clean -dfx
| |
| </kode>
| |
|
| |
| == Supprimez les éléments non-versionnés ==
| |
| <kode lang=bash>
| |
| git clean -dxf
| |
| </kode>
| |
| <u>Options</u> :
| |
| * <tt>-d</tt> : affecte les dossiers en plus des fichiers
| |
| * <tt>-n</tt> : affiche les éléments qui seront supprimés mais ne supprime rien
| |
| * <tt>-x</tt> : ne pas utiliser les règles d'exclusion (.gitignore, $GIT_DIR/info/exclude)
| |
| * <tt>-f</tt> : obligatoire si la variable <tt>clean.requireForce</tt> est à true
| |
|
| |
| == Supprimer les derniers commits ==
| |
| * [https://stackoverflow.com/questions/3528245/whats-the-difference-between-git-reset-mixed-soft-and-hard What's the difference between git reset --mixed, --soft, and --hard?]
| |
|
| |
| === [https://www.atlassian.com/git/tutorials/undoing-changes#git-reset reset pour les commits locaux] ===
| |
| * [https://git-scm.com/book/en/v2/Git-Tools-Reset-Demystified Reset Demystified]
| |
|
| |
| {| class="wikitable wtp"
| |
| |-
| |
| | HEAD || Pointer to the current commit. Parent of the next commit.
| |
| |-
| |
| | Index || Staged files proposed to the next commit.<br>
| |
| Stage convert working directory into index.<br>
| |
| Commit convert Index into a commit.
| |
| |-
| |
| | Working directory || Sandbox. The actual files.
| |
| |}
| |
|
| |
| Fait reculer HEAD, les commits resetés sont perdus.
| |
| <kode lang=bash>
| |
| # move HEAD to the previous commit, reset commit is merge in Index and Working directory is unchanged
| |
| git reset --soft HEAD~1
| |
|
| |
| # move HEAD to the previous commit, reset Index, reset commit is merged in Working directory
| |
| git reset --mixed HEAD~1
| |
|
| |
| # move HEAD to the previous commit, reset Index and Working directory, reset commit is lost
| |
| git reset --hard HEAD~1
| |
| # instead of HEAD~1 you can use the 8 first characters of a commit id
| |
|
| |
| # obtenir l'id des commits
| |
| git log --pretty=oneline
| |
|
| |
| # il peut être utile de créer une branche qui pointe sur le dernier commit avant de faire reculer HEAD
| |
| git branch test
| |
| </kode>
| |
|
| |
| === [https://www.atlassian.com/git/tutorials/undoing-changes#git-revert revert pour les commits publics] ===
| |
| Créé un nouveau commit qui contient les modifications inverses du commit à annuler.<br />
| |
| Permet d'annuler un commit qui n'est pas le dernier.
| |
| <kode lang='bash'>
| |
| git revert --hard xxxxxxxx
| |
| # xxxxxxxx : 8 premiers caractères du code du commit
| |
| # --hard: overwrites all uncommitted changes in the working directory
| |
| </kode>
| |
|
| |
| == [https://git-scm.com/docs/git-cherry-pick Ré-appliquer un commit] ==
| |
| <kode lang='bash'>
| |
| git cherry-pick xxxxxxxx
| |
| # xxxxxxxx : 8 premiers caractères de l'id du commit
| |
| </kode>
| |
| {{info | Utiliser {{boxx|git log}} pour connaitre les ids des commits.}}
| |
|
| |
| == [https://eddmann.com/posts/move-last-git-commit-to-new-or-existing-branch/ Déplacer les commits d'une branche locale vers une autre] ==
| |
| Des commits locaux ont été fait sur la branche {{boxx|badone}} par erreur. Il faut les déplacer vers la branche {{boxx|goodone}}.
| |
| <kode lang='bash'>
| |
| # Si la branche goodone n'existe pas encore: depuis la branche badone, création de la branche goodone
| |
| git checkout goodone
| |
| # Si la branche goodone existe déjà: on merge badone dans goodone
| |
| git checkout goodone
| |
| git merge badone
| |
|
| |
| # suppression de tous les commits locaux sur la branche badone
| |
| git checkout badone
| |
| git reset --hard origin/badone
| |
| </kode>
| |
|
| |
| = [https://git-scm.com/book/en/v2/Git-Tools-Reset-Demystified git reset] =
| |
| <kode lang='bash'>
| |
| # unstage all
| |
| git reset
| |
| # default values: git reset --mixed HEAD
| |
|
| |
| # undo all changes made in the working directory + unstage all
| |
| git reset --hard
| |
| </kode>
| |
|
| |
| <kode lang='bash'>
| |
| # undo the last commit
| |
| # keep the current index and merge the index from the parent commit into the current index, in cases of conflict current index overwrites parent commit index
| |
| # working directory is not changed
| |
| git reset --soft HEAD~
| |
|
| |
| # undo the last commit
| |
| # undo the current index and the index from the last commit
| |
| # keep the working directory and merge current index and index from the last commit in it
| |
| # in cases of conflict working directory overwrites current index which overwrites parent commit index
| |
| git reset HEAD~
| |
|
| |
| # undo the last commit
| |
| # undo the current index and the index from the last commit
| |
| # undo modifications made in the working directory
| |
| git reset --hard HEAD~
| |
| </kode>
| |
|
| |
| = Se déplacer dans l'arbre =
| |
| <kode lang='bash'>
| |
| # se déplacer à un commit précis (detached head state)
| |
| git checkout [commit id]
| |
|
| |
| # retourner au dernier commit (se réattacher à la branche)
| |
| git checkout [branch name]
| |
|
| |
| # pour lister les commit ids
| |
| git log
| |
| </kode>
| |
|
| |
| = [https://git-scm.com/docs/git-stash Remisage: git stash] =
| |
| <kode lang='bash'>
| |
| # remise les modifications non-commitées
| |
| git stash push -u
| |
| # -u, remise aussi les untracked files puis les supprime avec un clean
| |
|
| |
| # lister les remises
| |
| git stash list
| |
|
| |
| # afficher le contenu de la dernière remise
| |
| git stash show
| |
|
| |
| # applique la dernière remise, puis la supprime
| |
| git stash pop
| |
|
| |
| # scénario: impossible de faire un pull à cause de conflits
| |
| # remiser les modifications locales
| |
| git stash
| |
| # récupérer les modifications distantes sans conflics
| |
| git pull
| |
| # ré-appliquer les modifications locales et gérer les éventuels conflits
| |
| git stash pop
| |
| </kode>
| |
| [https://git-scm.com/book/fr/v1/Utilitaires-Git-Le-remisage Le remisage]
| |
|
| |
| = Étiquetage (Tags) =
| |
| {{info | Par défaut la commande {{boxx|git push}} n'envoie pas les étiquettes vers les serveurs distants.<br />
| |
| Pour ce faire : {{boxx|git push --tags}}}}
| |
|
| |
| == Créez des étiquettes ==
| |
| <kode lang=bash>
| |
| # Étiquette la dernière validation
| |
| git tag v2.0
| |
|
| |
| # Étiquette la dernière validation dont la somme de controle commence par 9fceb02
| |
| git tag v1.2 9fceb02
| |
|
| |
| # Supprimez le tag v1.2
| |
| git tag -d v1.2
| |
| # Supprimez le tag v1.2 sur la branche distante
| |
| git push --delete origin v1.2
| |
| </kode>
| |
|
| |
| == Listez vos étiquettes ==
| |
| <kode lang=bash>
| |
| # Listez les étiquettes existantes
| |
| git tag
| |
|
| |
| # Recherchez les étiquettes correspondant à un motif particulier
| |
| git tag -l 'v1.*'
| |
|
| |
| # Affichez le commit correspondant au tag v1.0.0
| |
| git show v1.0.0
| |
| </kode>
| |
|
| |
|
| = Dépots distants = | | = Dépots distants = |