« Git » : différence entre les versions
De Banane Atomic
Aller à la navigationAller à la recherche
Aucun résumé des modifications |
|||
Ligne 253 : | Ligne 253 : | ||
</kode> | </kode> | ||
= | = [https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git/ Aliases] = | ||
{| class="wikitable wtp wtmono1 wtmono2" | {| class="wikitable wtp wtmono1 wtmono2" | ||
! Alias | ! Alias | ||
! | ! Command | ||
|- | |- | ||
| | | g || git | ||
|- | |- | ||
| | | ga || git add | ||
|- | |- | ||
| gaa || git add --all | |||
|- | |- | ||
| | | gc || git commit --verbose | ||
|- | |- | ||
| git | | gc! || git commit --verbose --amend | ||
|- | |- | ||
| | | gcmsg || git commit --message | ||
|- | |- | ||
| | | gca || git commit --verbose --all | ||
|- | |- | ||
| git | | gca! || git commit --verbose --all --amend | ||
|- | |- | ||
! | | gcan! || git commit --verbose --all --no-edit --amend | ||
|- | |- | ||
| | | gcam || git commit --all --message | ||
|- | |- | ||
| git | | gpristine || git reset --hard && git clean -dffx | ||
|- | |- | ||
| | | gcp || git cherry-pick | ||
|- | |- | ||
| | | gf || git fetch | ||
|- | |- | ||
| gfa || git fetch --all --prune | |||
|- | |- | ||
| git | | ggfl || git push --force-with-lease origin $(current_branch) | ||
|- | |- | ||
| | | ggl || git pull origin $(current_branch) | ||
|- | |- | ||
| | | ggp || git push origin $(current_branch) | ||
|- | |- | ||
| grh || git reset | |||
|- | |- | ||
| | | grhh || git reset --hard | ||
|- | |- | ||
| | | gst || git status | ||
|- | |- | ||
| | | gsta || git stash push | ||
|- | |- | ||
| | | gstu || git stash --include-untracked | ||
|- | |- | ||
| | | gstp || git stash pop | ||
| git | |||
|} | |} | ||
Version du 10 avril 2023 à 21:16
Links
init
# execute the command from the root of the future repo git init |
clone
# create a folder containing a copy of the remote repo git clone git://url/projet.git [destination] # if destination is not set, git will extract the destination name from the url (here: projet) # get only the latest version of a repo git clone --depth 1 --recurse-submodules --shallow-submodules git://url/projet.git # --branch <branch_name> get another branch or tag # --filter=blob:none get a blobless clone: without files content # --filter=tree:none get a treeless clone: without files content and folders |
add
Move files from the Working Directory to the Index.
# add file.ext from the Working Copy to the Index git add file.ext # 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 file.ext from the Index and keep it in the Working Directory git rm --cached file.ext # remove all the files and folders from the Index and keep them in the Working Directory git rm --cached -r . |
patch
Select interactively blocks of modifications to index them.
git add -p file.ext |
Options pour chaque bloc de modification du fichier :
y - stage this hunk n - do not stage this hunk q - quit; do not stage this hunk or any of the remaining ones a - stage this hunk and all later hunks in the file d - do not stage this hunk or any of the later hunks in the file e - manually edit the current hunk 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
commit
Move changes from the Index into a new commit to the Head.
# create a new commit and move in it the staged files (Index) git commit # -m 'commit message' # move from the Working Directory to the Index all the modified and new files # then create a new commit and move in it the staged files (Index) git commit -a |
status
# display paths that have been modified git status # -v show the textual changes that are staged to be committed (like git diff --cached) # -vv also show the changes in the working tree (like git diff) |
diff
# display changes in the working tree not yet staged for the next commit git diff # display changes between the index and your last commit git diff --cached # compare file.ext between 2 branches git diff master MaBranche -- file.ext |
restore
# undo the unstaged changes made in file.txt git restore file.txt # undo all the unstaged changes git restore . |
reset
# unstage all git reset # default values: git reset --mixed HEAD # unstage all then undo all changes made in the working directory git reset --hard |
# merge the changes from HEAD to HEAD~x with the current index # in cases of conflict, current index overwrites changes from commits # working directory remains unchanged # delete all the commits from HEAD to HEAD~x (not included) git reset --soft HEAD~x # merge the changes from HEAD to HEAD~x with the current index # then move and merge the index with the working directory # in cases of conflict working directory overwrites current index which overwrites changes from commits # delete all the commits from HEAD to HEAD~x (not included) git reset HEAD~x # delete all the commits from HEAD to HEAD~x (not included) # unstage all then undo all changes made in the working directory git reset --hard HEAD~x |
amend
Update the last commit.
# add the modification to the index # then update the last commit with the changes from the index git commit --amend # --author "New Author Name <email@address.com>" update the author # -m "New comment" update the comment |
Modify a previous commit
# rebase the branch on the parent of the commit to modify git rebase -i HEAD~x git rebase -i [commit id] # last commit : HEAD , before last commit : HEAD~1 , parent of the before last commit : HEAD~2 # first commit: --root # use 'git log' to get the HEAD~x or the commit id # you can edit (e), reword (r), drop (d), squash (s) # update the files and add them to the index git add . # then update the current commit git commit --amend # finish the rebase git rebase --continue |
All the commits between the one which will be modified and HEAD will be re-written. |
stash
# move the changes of the WD and the Index to a temporary branch git stash # --include-untracked / -u stash untracked files too # --keep-index / -k move only the changes of the WD # --staged / -S move only the changes of the Index # move back the changes to the WD and the Index # delete the temporaray branch git stash pop # list the stashes git stash list # drop a specific stash git stash drop stash@{x} # drop all the stashes git stash clear |
cherry-pick
git checkout my-branch # apply a specific commit to the current branch git cherry-pick [commit-id] |
Undo the modifications
# remove the WD modifications of file.ext only git checkout -- file.ext # remove the WD and Index modifications of the whole repository git reset --hard # delete the unversioned files git clean -dfx # -d recurse into folders # -f needed if clean.requireForce is set to true # -x don’t follow the ignore rules (.gitignore, $GIT_DIR/info/exclude) # -n dry-run |
Move the HEAD
# move the HEAD to a specific commit (detached head state) git checkout [commit-id] # move back to the last commit git checkout [branch-name] |
Étiquetage (Tags)
Par défaut la commande git push n'envoie pas les étiquettes vers les serveurs distants. Pour ce faire : git push --tags |
Créez des étiquettes
# É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 |
Listez vos étiquettes
# 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 |
Aliases
Alias | Command |
---|---|
g | git |
ga | git add |
gaa | git add --all |
gc | git commit --verbose |
gc! | git commit --verbose --amend |
gcmsg | git commit --message |
gca | git commit --verbose --all |
gca! | git commit --verbose --all --amend |
gcan! | git commit --verbose --all --no-edit --amend |
gcam | git commit --all --message |
gpristine | git reset --hard && git clean -dffx |
gcp | git cherry-pick |
gf | git fetch |
gfa | git fetch --all --prune |
ggfl | git push --force-with-lease origin $(current_branch) |
ggl | git pull origin $(current_branch) |
ggp | git push origin $(current_branch) |
grh | git reset |
grhh | git reset --hard |
gst | git status |
gsta | git stash push |
gstu | git stash --include-untracked |
gstp | git stash pop |
Dépots distants
Ajoutez des dépôts distants
# listez les dépôts distants git remote -v # ajoutez un dépôt distant (nom donné au dépôt: origin) git remote add origin git://github.com/createur/projet.git # if the remote branch doesn't exist yet, push the current branch and set the remote as upstream git push --set-upstream origin master # origin = <remote repository name> # master = <local branch name> # si la brache distante existe déjà, lier origin/master à la branche courante git branch -u origin/master # -u origin/master : --set-upstream-to=origin/master # origin/master = <remote branch name> # renommez un dépôt distant git remote rename current_name new_name # retirez un dépôt distant git remote rm repo_name # modifier l'url du dépôt distant git remote set-url origin https://github.com/createur/projet.git |
Mise à jour et validation
# récupère les modifications effectués sur le dépôt distant origin (met à jour les branches distantes origin/*) # ne modifie pas la branche courante ni ne bascule vers une autre branche git fetch origin # fusionne la branche distante origin/master dans la branche locale courante git merge origin/master # récupérer la branche MaBranche du dépôt distant origin et la nommer localement MaBranche git branch MaBranche origin/MaBranche # équivalent avec checkout en plus git checkout -b MaBranche origin/MaBranche git checkout --track origin/MaBranche # fetch + merge : récupère les modifications effectués sur le dépôt distant et les fusionne avec la branche courante git pull origin master # Pousser son travail sur un dépôt distant git push --tags origin master # --tags permet de pousser ses tags vers le dépôt distant, ce que ne fait pas push par défaut # Pousser une branche locale nouvellement créée git push -u origin <Ma_Nouvelle_Branche> |
Branches des dépôts distants
# listez les branches distantes git branch -r # listez toutes les branches git branch -a # url d'une branche distante git config --get remote.origin.url # supprimez la branche MaBranche sur le dépôt distant origin git push origin :MaBranche |
Branches locales
# listez les branches locales et indique quelle est la branche courante git branch # listez les branches qui ont déjà été fusionnées et qui peuvent donc être supprimées git branch --merged # listez les branches qui n'ont pas encore été fusionnées git branch --no-merged # listez toutes les branches locales et distantes git branch -a |
# création de MaBranche à partir du dernier commit de la branche courante git branch MaBranche # création de MaBranche à partir du dernier commit d'une AutreBranche ou d'un ID de commit ou d'un tag git branch MaBranche [AutreBranche|Commit-ID|Tag] # bascule vers MaBranche git checkout MaBranche # créé une nouvelle branche et bascule dessus # les changements non commités reste inchangés et peuvent être commités sur cette nouvelle branche git checkout -b NouvelleBranche # supprimer la branche locale NouvelleBranche git branch -d NouvelleBranche # renommer une branche locale git branch -m NewBranchName # supprimer la branche distante avec le mauvais nom et créer la branche distante avec le nouveau nom git push origin :OldBranchName NewBranchName git push origin -u NewBranchName # récupérer un fichier d'une autre branche git checkout AutreBranche path/file.ext |
git ne permet de basculer vers une branche que si toutes les modifications de la branche courante ont été commitées |
Merge
# fusion de MaBranche avec master : # 1 - bascule vers master git checkout master # 2 - fusion de MaBranche avec la branche courante (master) git merge MaBranche # 3 - suppression de MaBranche git branch -d MaBranche # en cas de conflits # lancez l'outils graphique d'édition de conflits git mergetool # marquez le conflit comme résolu pour MonFichier.ext git add MonFichier.ext # merge partiel de MaBranche dans master: seulement jusqu'au commit <commit-hash> git merge --ff-only <commit-hash> |
Rebase
# 1 - rebase de MaBranche au bout de master git rebase master MaBranche # ou en 2 temps # 1 - bascule vers MaBranche git checkout MaBranche # 2 - rebase de la branche courante (MaBranche) au bout de master git rebase master # 3 - retour sur master git checkout master # 4 - avance rapide (fast forward) de la branche courante (master) vers MaBranche git merge MaBranche # suppression de MaBranche git branch -d MaBranche |
Undo a rebase
# get the head commit before the rebase started git reflog # reset to head commit just before the rebase started git reset --hard HEAD@{X} |
Rebase vs Merge
- Réécrit les commits de la branche à rebaser (MaBranche) comme des tout nouveaux commit au sommet de la branche courante (master)
- Permet de simplifier l'historique.
Ne rebasez jamais des commits qui ont déjà été poussés sur un dépôt public |
Règle générale:
- When pulling changes from origin/develop onto your local develop use rebase.
- When finishing a feature branch merge the changes back to develop.
Noms de branches insensible à la casse
Les noms de branches git ne sont pas sensible à la casse
# checkout d'une branche distante en minuscule vers une branche locale en majuscule git checkout -b My_New_Branch /origin/my_new_branch # pull fonctionne, mais lors du push, création d'une nouvelle branche en majuscule # renommer My_New_Branch en my_new_branch # comme git est insensible à la casse il faut passer par une branche intermédiaire git branch -m My_New_Branch tmp_branch git branch -m tmp_branch my_new_branch |
Autre solution: forcer git à ignorer la casse
%HomePath%\.gitconfig |
[core] ignorecase = true |
# supprimer les branches locales et locale-remote # mettre à jour les branches distantes git fetch -p |
Exportez dans une archive
git archive mon_tag -o mon_archive.zip -9 --prefix=mon_dossier/ # -9 compression max de l'archive, -0 pas de compression # HEAD peut-être utilisé comme tag # tar.gz git archive mon_tag --prefix=mon_dossier/ >mon_archive.tar.gz |
Blame
# Affiche les lignes 12 à 22 de fichier.ext avec pour chaque ligne son auteur et la révision associée git blame -L 12,22 fichier.ext # seulement la ligne 12 git blame -L 12,12 fichier.ext # avec une interface graphique, ouvre fichier.ext à la ligne 12 git gui blame --line=12 fichier.ext # blame a deleted file # git blame works when providing a commit reference that contains the file. Find the most recent one with log git log -2 --oneline -- deletedFile.cs # ac173c96f Merged PR 121163: File already deleted # 37f91c2fa Merged PR 113177: Before deleting file git blame 37f91c2fa -- deletedFile.cs git gui blame 37f91c2fa deletedFile.cs |
bisect
Définit un commit de début et un commit de fin et permet de lancer un test sur chaque commit intermédiaire.
Permet de localiser un commit introduisant un bug.
Installation
sudo pacman -S git tk # tk pour gitk # sans tk l'erreur suivante s'affiche: /usr/bin/gitk: line 3: exec: wish: not found |
~/.bashrc |
# activer l'autocomplétion source /usr/share/git/completion/git-completion.bash |
GUI
- gitk, installé avec git. Nécessite l'installation du paquet tk. À lancer dans le répertoire à analyser.
- GitFiend
- GitKraken (la version gratuite ne supporte pas les dépôts privés ni azure)
- giggle (linux)
- Git Extensions (windows)
Git for Windows
- MinGW64
- MinTTY, thèmes: C:\Users\<Moi>\.mintty\themes\*.minttyrc
- Customize your Windows Git shell, MinTTY
Filename too long
git config --system core.longpaths true |
Configuration
Fichiers
- .git/config accès par défaut ou avec l'option --local
- ~/.gitconfig accès avec l'option --global
- /etc/gitconfig accès avec l'option --system
# ouvre le fichier de configuration dans le éditeur de texte git config --global --edit git config --system --edit git config --local --edit # work only from a git repo # display all the config by file git config --list --show-origin |
Commandes
git config --global core.editor "nano -w" git config --global user.name "Prénom Nom" git config --global user.email "compte@email.com" git config --global color.ui true git config --global merge.tool meld # autorise git à conserver le mot de passe pendant 15mn (valeur par défaut) git config --global credential.helper cache # autorise git à conserver le mot de passe pendant 1h git config --global credential.helper 'cache --timeout=3600' # stocke les informations d'identification dans le fichier ~/.git-credentials git config --global credential.helper store # LF - CRLF # lors du checkout converti les LF → CRLF git config --global core.autocrlf true # lors du commit converti les CRLF → LF git config --global core.autocrlf input # checkout et commit des fichiers tels quels git config --global core.autocrlf false # Gnome Keyring # compilez le credential pour gnome-keyring cd /usr/share/git/credential/gnome-keyring sudo make # configurez git git config --global credential.helper /usr/share/git/credential/gnome-keyring/git-credential-gnome-keyring |
~/.gitconfig |
[core] editor = nano -w [user] name = Prénom Nom email = compte@email.com [color] ui = true [merge] tool = meld [credential] helper = cache | store |
Les alias Git
# permet de taper 'git unstage' au lieu de 'git reset HEAD --' git config --global alias.unstage 'reset HEAD --' # alias pour visualiser plus facilement le dernier commit git config --global alias.last 'log -1 HEAD' # permet de taper 'git ci' au lieu de 'git commit' git config --global alias.ci commit git config --global alias.co checkout git config --global alias.br branch git config --global alias.st status |
~/.gitconfig |
[alias] unstage = reset HEAD -- last = log -1 HEAD ci = commit co = checkout br = branch st = status |
git diff avec meld
meld
# se placer dans le dossier git meld . |
difftool
git difftool -y fichier.ext # -y: no prompt |
diff external
git-diff-meld.sh |
#!/bin/bash meld $2 $5 |
git config --global diff.external /path/to/git-diff-meld.sh |
~/.gitconfig |
[diff] external = /path/to/git-diff-meld.sh |
Serveur Git
# créer un dossier de stockage cd /srv mkdir git chown git:git git # créer un projet de test cd /srv/git git init project.git --bare --shared # bare: dépôt vide # shared: dépôt partagé rwxrwsr-x au lieu de rwxr-xr-x # et le fichier config contient sharedrepository = 1 et denyNonFastforwards = true chown -R git:git project.git # ajouter le groupe git aux utilisateurs pour qu'ils puissent pousser leurs modifications # ajouter le dépôt fraîchement créé à un dépôt local git remote add origin user@server:/srv/git/projet.git # envoyer les modifications locales vers le dépôt distant git push origin master # récupérer le projet depuis un client avec le protocole ssh git clone user@server:/srv/git/projet.git # démarrer le serveur Git. Seulement utile pour le protocole git systemctl start git-daemon.socket |
Protocoles
local | le dépôt distant est un autre répertoire dans le système de fichiers par exemple un répertoire partagé via NFS |
git clone /srv/git/projet.git
|
ssh | permet de cloner et de pousser | git clone utilisateur@serveur:/srv/git/projet.git
|
git | daemon écoute sur le port 9418 pas d'authentification, tous le monde peut cloner et pousser |
|
http(s) | permet de cloner mais pas de pousser | git clone http://server/projetgit.git
|
Gitweb
pacman -S perl-cgi fcgiwrap # démarrer le service fcgiwrap sc-start fcgiwrap.socket |
/etc/nginx/nginx.conf |
server { listen 80; server_name gitweb.myserver; location /gitweb.cgi { include fastcgi_params; gzip off; fastcgi_param SCRIPT_FILENAME /usr/share/gitweb/gitweb.cgi; fastcgi_param GITWEB_CONFIG /etc/gitweb.conf; fastcgi_pass unix:/run/fcgiwrap.sock; } location / { root /usr/share/gitweb; index gitweb.cgi; } } |
/etc/gitweb.conf |
# The directories where your projects are. Must not end with a slash. our $projectroot = "/srv/git"; # Base URLs for links displayed in the web interface. our @git_base_url_list = qw(git://myserver http://git@myserver); # enable "blame" view $feature{'blame'}{'default'} = [1]; # enable syntax highlighting (installer le package highlight) $feature{'highlight'}{'default'} = [1]; |
Gitolite
- Gitolite on Ubuntu ARM 18.04