Ne pas versionner un répertoire entier :
Source : Utilisation de .gitignore.
Admettons qu’on souhaite ne pas versionner le répertoire sass-cache/ :
|
$ git rm -r -f sass-cache/ |
Comment supprimer un fichier de mon repository Git ?
Comment supprimer un répertoire de mon repository Git ?
Source : http://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository.
|
git rm -r <libellé_de_mon_répertoire> git commit -m "Supression de <libellé_de_mon_répertoire>." git push |
Augmenter la taille maximum du volume de données qu’on peut envoyer en un seul git push sur son repository
Il peut arriver qu’on essaye de remonter un volume trop important de données au cours d’un seul et même push. Le message d’erreur obtenu lors du push est le suivant :
|
error: RPC failed; result=22, HTTP code = 411 fatal: The remote end hung up unexpectedly fatal: The remote end hung up unexpectedly |
Pour pallier à ce problème, il suffit d’augmenter la taille maximum du volume de données qu’on peut remonter, en une seule fois, dans le repository Git.
|
$ git config http.postBuffer *taille_maxi* |
…où taille maxi est en octets, ce qui nous donne pour 5 Mo :
|
$ git config http.postBuffer 5242880 |
Un convertisseur Octet, Ko, Mo, Go, Po est disponible ici http://mon-ip.awardspace.com/convertisseur.php.
Merger la branche ‘master’ dans une autre branche :
Se rendre sur la branche ‘master’: $ git checkout master
.
Faire un pull: $ git pull
.
Se rendre sur la branche dans laquelle on souhaite merger ‘master’ (toto dans mon exemple): $ git checkout toto
.
Merger ‘master’ dans ‘toto’: $ git merge master
.
Solution alternative (préférer la 1ère ci-dessus). Vous devez être dans la branche dans laquelle vous voulez merger ‘master’ avant de taper la commande:
|
git merge --no-ff origin/master |
Merger une branche avec la branche ‘master’ :
|
git co master git pull --rebase git merge --no-ff <branche_à_merger> |
Si on veut pusher du code sur le repo, ajouter:
Régler des conflits intervenus lors d’un merge ou d’un pull –rebase
Si vous obtenez des messages de type CONFLIT (contenu) : Conflit de fusion dans sites/all/themes/custom/roederer_main_theme/src/style/_roederer-actualites.scss
lors d’un merge:
|
intlangf@ubuntu:~/drupal/roederer-drupal/sites/all/themes/custom/roederer_main_theme$ git merge --no-ff develop Fusion automatique de sites/all/themes/custom/roederer_main_theme/src/style/_roederer-actualites.scss CONFLIT (contenu) : Conflit de fusion dans sites/all/themes/custom/roederer_main_theme/src/style/_roederer-actualites.scss Fusion automatique de sites/all/themes/custom/roederer_main_theme/src/style/_layout.scss Fusion automatique de sites/all/themes/custom/roederer_main_theme/src/style/_iconfont.scss CONFLIT (contenu) : Conflit de fusion dans sites/all/themes/custom/roederer_main_theme/src/style/_iconfont.scss Suppression de sites/all/themes/custom/roederer_main_theme/src/iconfont/earth-globe.svg Fusion automatique de sites/all/themes/custom/roederer/templates/page--front.tpl.php La fusion automatique a échoué ; réglez les conflits et validez le résultat. |
Faites un git status
pour revérifier quels fichiers sont en conflit:
|
Chemins non fusionnés : (utilisez "git add <fichier>..." pour marquer comme résolu) modifié des deux côtés :src/style/_iconfont.scss modifié des deux côtés :src/style/_roederer-actualites.scss |
Editer ces fichiers pour résoudre vos conflits. Puis faites en git add
de ces fichiers, puis un git ci
sans mettre de message de log (« ctrl+x » pour valider le message proposé par git). N’oubliez pas de faire un git push
pour envoyer vos modifs.
Si problème fatal: Vous n'êtes actuellement sur aucune branche.
après le git push:
Exemple:
|
fatal: Vous n'êtes actuellement sur aucune branche. Pour pousser l'historique menant à l'état actuel (HEAD détachée), utilisez git push origin HEAD:<nom-de-la-branche-amont> intlangf@ubuntu:~/hybris/aubert-hybris/bin/custom/naos/naosstorefront$ git branch * (aucune branche, rebasage de frontend) frontend master release release-integration |
Faire un git st
qui vous indiquera qu’un rebasage est en cours.
|
rebasage en cours ; sur c5a9d0d Vous êtes en train de rebaser la branche 'frontend' sur 'c5a9d0d'. |
Faire un git rebase --continue
, puis un git push
.
Régler des conflits intervenus lors d’un merge (autre méthode qui jongle entre l’interface de gitlab, de PHPStorm et la ligne de commande)
Un peu d’aide externe: On undoing, fixing, or removing commits in git.
- Contexte #1: au secours, il y a un conflit sur la branche
staging
intervenu après une tentative de merge et j’ai lamentablement foiré ma tentative de résolution du conflit. Commencer ici.
- Contexte #2: au secours, il y a un conflit sur la branche
staging
intervenu après une tentative de merge mais je n’ai pas encore tenté de résoudre quoi que ce soit. Commencer là.
[Interface de GitLab] Commencer par recréer une nouvelle branche
…dans laquelle on va redéposer le code à merger sur staging
. ATTENTION: conservez votre ancienne branche pour le moment; votre nouvelle branche doit avoir un nom unique, proche de celui de la branche qu’on essaye de merger dans staging
de préférence.
[Interface de PHPStorm]
Depuis l’interface:
On récupère l’info sur la création de notre nouvelle branche: Top menu horizontal > Git > Fetch
On se place sur notre nouvelle branche: Tout en bas à droite, via l’indicateur de la branche courante > dans « Remote Branches » > choisir origin/ma_nouvelle_branche
Depuis GitLab et PHPStorm (jonglage):
Aller dans la Merge Request foireuse (URL de type: https://gitlab.ma-boite.com/client/projet/-/merge_requests/6377/commits). Vous devriez voir un listing des commits liés à la branche que vous souhaites merge dans staging
:

En partant du commit le plus ancien (normalement celui le plus en bas de la liste) copier les uns après les autres les hash des commit qu’on souhaite récupérer dans notre nouvelle branche et retourner dans la partie Terminal de PHPStorm pour…
Puis, à partir de là, depuis le terminal bash de l’interface:
…effectuer des cherry-pick
en tapant la commande suivante:
(Répéter autant de fois que nécessaire). Une fois tous les commits souhaités récupérés, taper:
Faire une nouvelle Merge Request dans GitLab
Nous allons de nouveau avoir les mêmes conflits, mais l’idée est de les résoudre proprement cette fois-ci…
Depuis PHPStorm
On se place sur la branche staging
! Puis, pour vérifier qu’on est dans la bonne branche:
Normalement, le git status
devrait vous donner le message suivant:
On branch staging
Your branch is up to date with 'origin/staging'.
.
On merge (localement) notre nouvelle branche dans staging
:
|
git merge --no-ff origin/<ma_nouvelle_branche> |
Onb obtient logiquement un conflit:
|
Auto-merging app/design/frontend/Project/default/Magento_Theme/web/css/source/widgets/_prod-popover.less CONFLICT (content): Merge conflict in app/design/frontend/Project/default/Magento_Theme/web/css/source/widgets/_prod-popover.less Automatic merge failed; fix conflicts and then commit the result. |
Dans l’interface, dans la partie arborescence projet, se placer d’un click sur la racine du dossier projet et faire un click droit.
Git > Resolve conflict.
Bouton « Merge »
On arrive sur l’interface à 3 colonnes qui nous permet de corriger le conflit. La colonne du milieu est celle qui doit contenir le code corrigé. On peut se servir des croix « X » (supprimer du code non souhaité dans la colonne de gauche ou de droite) et des flèches « >> » ou « <<" (reporter du code dans la colonne du milieu). On peut également saisir à la main du code dans la colonne du milieu qui sera pris en compte.
Bouton « Apply » lorsque les correction sont finies.
Un petit git status
devrait afficher en vert le(s) fichier(s) pour lesquels les conflits ont été résolus. Taper:
Le log de résolution du conflit s’affiche. Pour quitter l’édition:
Puis enfin:
Vous pouvez retourner sur la page de la MR dans l’interface de Gitlab pour vérifier que le merge est passé.
On retourne dans l’interface de Gitlab pour finaliser la merge request
Le mieux est d’en profiter pour supprimer la branche qu’on a souhaité mergé initialement dans staging
(celle qu’on a refaite) et qui posait problème. Ne pas oublier de la supprimer également en local!
Créer une nouvelle branche à partir de la branche ‘release’ :
En premier lieu s’assurer que la branche ‘release’ (ou ‘release’ est le nom de la branche à partir de laquelle vous voulez créer votre nouvelle branche) est à jour avec les derniers devs consignés sur le repository en lançant depuis celle-ci la commande :
Ensuite, toujours depuis la branche à partir de laquelle on souhaite créer une nouvelle branche :
|
git checkout -b <nouvelle_branche> release |
Faire un premier pull
|
git pull origin <nouvelle_branche> |
Et pour le premier push dans la nouvelle branche :
|
git push -u origin <nouvelle_branche> |
Mettre une branche à jour à partir de la branche ‘release’
Je travaille sur du debug ou une feature que je versionne dans une branche à part. Du code à été versé sur la branche ‘release’ dont je pourrais avoir besoin. Je dois donc récupérer ce code. Au lieu de merger, je lance la commande suivante:
Supprimer un ensemble de fichiers ajoutés depuis le dernier pull
et encore non-versionnés
Cette commande peut s’avérer pratique (mais dangereuse) lorsqu’on a effectué des modifications sur un certain nombre de fichiers et qu’on ne souhaite pas les conserver.
x
pour les dossiers, f
pour les fichiers.
J’ai créé une nouvelle branche et le git status m’affiche tous les fichiers qui sont normalement ignorés
Taper git checkout .
pour réinitialiser en l’état de ce qui est versé sur la branche Master distante. Un git status
ne devrait plus montrer les chemins et fichiers consignés dans le .gitignore.
J’ai modifié un fichier et je ne dois pas le versionner, mais pour l’instant il est surveillé
Source : Stop tracking and ignore changes to a file in Git.
tu peux faire :
|
git update-index --assume-unchanged {fichier} |
par contre, si un jour tu veux commiter un changement que t’as fait sur un fichier ou tu a utiliser cette commande, il faudra faire :
|
git update-index --no-assume-unchanged {fichier} |
Réinitialiser le code d’une branche à l’état de celui se trouvant sur le repository distant
Solution préférée
Supposons que la branche qu’on souhaite réinitialiser s’appelle: feature/ma_branche.
- Retourner sur la branche master avec un
$ git co master
.
- Supprimer la branche qu’on souhaite réinitialiser du repo local en tapant:
$ git branch -D feature/ma_branche
.
- Refaire un checkout de la branche pour la récupérer depuis le repo distant:
$ git checkout feature/ma_branche
.
Autre solution
Voir toutes les branches existantes, y-compris celles du repo distant
Bonus: rechercher dans toutes les branches existantes, y-compris celles du repo distant, une branche en particulier via un mot clé.
|
git branch -a | grep <mon_mot_clé> |
J’ai add
et commit (-m)
plusieurs fois sur la branche master sans avoir pushé. Comment revenir sur une base propre?
Premièrement, faire un git log
pour vérifier le nombre exact de commits qui ont été faits sur la branche master (/Frank
, où « Frank » est votre Git username, pour mettre en surbrillance vos commits, n
pour les passer en revue l’un après l’autre et q
pour quitter).
Ensuite, créer une nouvelle branche à partir de master pour sauvegarder vos commits: $ git checkout -b <nom_de_votre_nouvelle_branche> master
.
Puis revenir sur master: $ git checkout master
et exécuter la commande $ git reset --hard HEAD^
autant de fois que vous aviez effectué de commits sur master.
Lister les nouvelles branches disponibles uniquement en remote repository et les récupérer en local
How do I list remote branches in Git?
git checkout a Remote Branch
|
git checkout --track origin/newsletter |
Revenir à un commit précédent en local avec git revert
Source: How to With Git: Rollback Commit.
Pour afficher l’index des commits en local: $ git reflog
Pour revenir en arrière sur tous les commits depuis “1a890e7” jusqu’à “HEAD,”: $ git revert 1a890e7..HEAD
Autre solution:
Il est également possible de faire un simple checkout: $ git checkout 1a890e7
.
Debug: la recherche dichotomique avec git bisect start / good / bad / reset
Source: Utilitaires Git – Deboguer avec Git – La recherche dichotomique.
Annoter un fichier peut aider si vous savez déjà où le problème se situe. Si vous ne savez pas ce qui a cassé le code, il peut y avoir des douzaines, voire des centaines de commits depuis le dernier état où votre code fonctionnait et vous aimeriez certainement exécuter git bisect pour vous aider.
Configuration de Git: formatage et espaces blancs
Source: https://git-scm.com/ – 8.1 Personnalisation de Git – Configuration de Git – Formatage et espaces blancs.
Les problèmes de formatage et de blancs sont parmi les plus subtils et frustrants que les développeurs rencontrent lorsqu’ils collaborent, spécifiquement d’une plate-forme à l’autre. Il est très facile d’introduire des modifications subtiles de blancs lors de soumission de patchs ou d’autres modes de collaboration, car les éditeurs de texte les insèrent silencieusement ou les programmeurs Windows ajoutent des retours chariot à la fin des lignes qu’ils modifient. Git dispose de quelques options de configuration pour traiter ces problèmes.
Si vous utilisez un système Linux ou macOS qui utilise les fins de ligne LF, vous ne souhaitez sûrement pas que Git les convertisse automatiquement lorsque vous extrayez des fichiers. Cependant, si un fichier contenant des CRLF est accidentellement introduit en gestion de versions, vous souhaitez que Git le corrige. Vous pouvez indiquer à Git de convertir CRLF en LF lors de la validation mais pas dans l’autre sens en fixant core.autocrlf
à input
:
|
$ git config --global core.autocrlf input |
Récupérer une branche distante encore non suivie en local
Lister l’ensemble des branches distantes:
J’obtiens par exemple:
|
... remotes/origin/feature/VC-31_html_product_list remotes/origin/feature/VC-32_integration_detail_produit remotes/origin/feature/VC-34_styleguide ... |
Pour récupérer la branche qui nous intéresse (par exemple: remotes/origin/feature/VC-32_integration_detail_produit
):
|
$ git checkout --track remotes/origin/feature/VC-32_integration_detail_produit |
Supprimer une branche local alors qu’on a des conflits de merge en cours
|
$ git merge --abort $ git checkout <branche_principale-master_ou_autre> $ git branch -D <nom_de_la_branche_locale_à_supprimer> |