# Git/Recettes

* Principes
* Apprendre à travailler avec Git
** Avant de commencer : installation et configuration de Git
** Création de votre dépôt local
** Visualiser le contenu de votre dépôt local
** Premiers pas
** Gestion des branches
** Synchroniser le dépôt local avec le dépôt distant
* Fonctionnalités avancées
** Étiquetage (tags)
** Remise (stash)
** Recombinaison (rebase)
** Sous-modules et Super-projets
** Structure interne
** Pull-request
* Recettes
** Exclure des fichiers du dépôt
** Écrire des messages de commit
* Environnement
** Intégration dans les IDEs
** Améliorer sa productivité en configurant Git
** Git sous Linux
** Git sous Windows
** Forges
*** GitLab
*** GitHub
*** Bitbucket
* Git et Subversion (svn)
** Passer de Subversion à Git
** Travailler avec Git local et un dépôt Subversion distant
** Participer au développement de Wikimédia (Gerrit)
* Problèmes connus
* Ressources externes
* Principes
* Apprendre à travailler avec Git
** Avant de commencer : installation et configuration de Git
** Création de votre dépôt local
** Visualiser le contenu de votre dépôt local
** Premiers pas
** Gestion des branches
** Synchroniser le dépôt local avec le dépôt distant
* Fonctionnalités avancées
** Étiquetage (tags)
** Remise (stash)
** Recombinaison (rebase)
** Sous-modules et Super-projets
** Structure interne
** Pull-request
* Recettes
** Exclure des fichiers du dépôt
** Écrire des messages de commit
* Environnement
** Intégration dans les IDEs
** Améliorer sa productivité en configurant Git
** Git sous Linux
** Git sous Windows
** Forges
*** GitLab
*** GitHub
*** Bitbucket
* Git et Subversion (svn)
** Passer de Subversion à Git
** Travailler avec Git local et un dépôt Subversion distant
** Participer au développement de Wikimédia (Gerrit)
* Problèmes connus
* Ressources externes
[ Modifier le sommaire ]

## Supprimer un fichier du dépôt tout garder le fichier

git rm fichier.txt supprime le fichier du dépôt mais supprime aussi le fichier local.
Pour ne l'enlever que du dépôt, utiliser git rm --cached fichier.txt.
Ajouter "-r" pour les dossiers.

## Annuler une soumission

Quand on ne peut pas réécrire l'historique (par exemple en production) mais qu'il faut annuler un commit, on utilise git revert avec HEAD pour désigner la dernière soumission effectuée :
Pour signifier d'autres soumissions que la dernière :
* git revert HEAD^ : l'avant dernière.
* git revert HEAD~5 : la cinquième moins récente.
* git revert e6337879 : la soumission n°e6337879.
Ensuite, il est recommandé de vérifier que le rollback a bien fonctionné en s'assurant de l'absence de différence entre le code actuel et celui de n-1 (où n est le nombre de commits annulés)

### Annuler un merge

On ne peut pas annuler un merge comme un commit, il faut indiquer le nombre reverté (où réverter un seul merge de plusieurs commits reverte tous les commits) :

## Nettoyer les changements non soumis

Pour annuler les modifications de fichiers non soumises (discard) :
Pour annuler les créations de fichiers non soumises :

## Annuler les changements soumis
### reset

Par ailleurs, il existe plusieurs niveaux de reset :
* soft : ne touche pas à l'index ni au répertoire de travail. Les fichiers en reset retournent juste de la liste des commités à celle à commiter.
* hard : efface l'index et le répertoire de travail. Cette option équivaut à un reset + clean.
* mixed : celui par défaut, mélange des deux précédents. Il laisse les fichiers du répertoire de travail, mais annule l'index.
* merge
* keep
Pour effacer les changements en cours, en rétablissant les états de la dernière soumission :
ou
Pour ne toucher qu'un seul fichier :
* Pour effacer les deux derniers commits sans toucher aux fichiers : git reset 'HEAD~2'.
* Pour effacer les deux derniers commits et leurs modifications dans les fichiers : git reset HEAD~2 --hard.
* Pour revenir deux opérations en arrière sur la branche : git reset HEAD@{2} (utilise la liste des opérations visible dans git reflog). Cela peut donc permettre d'annuler un reset malencontreux.

### restore

git restore revient à la version du fichier spécifié en paramètre.
Par exemple, pour restaurer tous les fichiers du dossier courant :
Pour annuler des "git add" (donc retirer un fichier de la zone de transit) :

## Récupérer une version de fichier

Il faut d'abord récupérer l'identifiant de la version avec git log :
Ensuite pour lire la version, utiliser git show :

## Créer et appliquer un patch

Créer un patch génère un texte de toute la série des changements entre les branches origines et master.
Pour appliquer un patch :
Le patch est aussi le mode de transfert entre dépôts.

## Références

* ↑ http://serebrov.github.io/html/2014-01-04-git-revert-multiple-recent-comments.html
* ↑ https://git-scm.com/docs/git-reset
* ↑ https://git-scm.com/docs/git-restore
* ↑ https://git-scm.com/docs/git-format-patch