Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
- 2.47.0 10/06/24
- 2.43.2 → 2.46.2 no changes
- 2.43.1 02/09/24
- 2.43.0 11/20/23
- 2.42.1 → 2.42.3 no changes
- 2.42.0 08/21/23
- 2.39.4 → 2.41.2 no changes
- 2.39.3 04/17/23
- 2.38.1 → 2.39.2 no changes
- 2.38.0 10/02/22
- 2.35.1 → 2.37.7 no changes
- 2.35.0 01/24/22
- 2.34.1 → 2.34.8 no changes
- 2.34.0 11/15/21
- 2.33.2 → 2.33.8 no changes
- 2.33.1 10/12/21
- 2.33.0 08/16/21
- 2.30.1 → 2.32.7 no changes
- 2.30.0 12/27/20
- 2.29.1 → 2.29.3 no changes
- 2.29.0 10/19/20
- 2.27.1 → 2.28.1 no changes
- 2.27.0 06/01/20
- 2.25.1 → 2.26.3 no changes
- 2.25.0 01/13/20
- 2.24.1 → 2.24.4 no changes
- 2.24.0 11/04/19
- 2.23.1 → 2.23.4 no changes
- 2.23.0 08/16/19
- 2.22.2 → 2.22.5 no changes
- 2.22.1 08/11/19
- 2.22.0 06/07/19
- 2.20.1 → 2.21.4 no changes
- 2.20.0 12/09/18
- 2.19.1 → 2.19.6 no changes
- 2.19.0 09/10/18
- 2.18.1 → 2.18.5 no changes
- 2.18.0 06/21/18
- 2.17.1 → 2.17.6 no changes
- 2.17.0 04/02/18
- 2.16.6 12/06/19
- 2.15.4 12/06/19
- 2.14.6 12/06/19
- 2.13.7 05/22/18
- 2.12.5 09/22/17
- 2.10.5 → 2.11.4 no changes
- 2.9.5 07/30/17
- 2.8.6 07/30/17
- 2.7.6 no changes
- 2.6.7 05/05/17
- 2.5.6 05/05/17
- 2.4.12 05/05/17
- 2.3.10 no changes
- 2.2.3 09/04/15
- 2.1.4 12/17/14
- 2.0.5 12/17/14
SYNOPSIS
git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit] [--no-verify] [-s <strategie>] [-X <option-de-strategie>] [-S[<id-clĂ©>]] [--[no-]allow-unrelated-histories] [--[no-]rerere-autoupdate] [-m <msg>] [-F <fichier>] [--into-name <branche>] [<commit>…] git merge (--continue | --abort | --quit)
DESCRIPTION
IntĂšgre les modifications des commits nommĂ©s (depuis le moment oĂč leur historique a divergĂ© de la branche actuelle) dans la branche actuelle. Cette commande est utilisĂ©e par git pull pour incorporer les modifications d’un autre dĂ©pĂŽt et peut ĂȘtre utilisĂ©e Ă la main pour fusionner les modifications d’une branche dans une autre.
Supposons que l’historique suivant existe et que la branche actuelle est master
âŻ:
A---B---C theme / D---E---F---G master
Alors, "git merge theme
" rejouera les modifications apportées à la branche theme
puisquâelle sâest Ă©cartĂ©e de master
(câest-Ă -dire E
) jusquâĂ son commit actuel (C
) par-dessus master
, et enregistrera le rĂ©sultat dans un nouveau commit comprenant les noms des deux parents et un message de validation de lâutilisateur dĂ©crivant les modifications. Avant lâopĂ©ration, ORIG_HEAD
est défini sur le sommet de la branche actuelle (C).
A---B---C theme / \ D---E---F---G---H master
Une fusion s’arrĂȘte s’il y a un conflit qui ne peut ĂȘtre rĂ©solu automatiquement ou si --no-commit
a Ă©tĂ© fourni lors de l’amorce de la fusion. Ă ce moment vous pouvez lancer git merge --abort
ou git merge --continue
.
git merge --abort
annulera le processus de fusion et tentera de reconstruire l’Ă©tat antĂ©rieur Ă la fusion. Cependant, s’il y a eu des changements non validĂ©s au dĂ©but de la fusion (et surtout si ces changements ont Ă©tĂ© modifiĂ©s aprĂšs le dĂ©but de la fusion), git merge --abort sera dans certains cas incapable de reconstruire les modifications originales (avant la fusion). Par consĂ©quentâŻ:
AttentionâŻ: l’exĂ©cution de git merge avec des modifications non triviales non validĂ©es est dĂ©couragĂ©eâŻ: bien que possible, elle peut vous laisser dans un Ă©tat duquel il est difficile de revenir en arriĂšre en cas de conflit.
OPTIONS
- --commit
- --no-commit
-
Effectuer la fusion et valider le rĂ©sultat. Cette option peut ĂȘtre utilisĂ©e pour passer outre --no-commit.
Avec --no-commit, effectuer la fusion et s’arrĂȘter juste avant de crĂ©er un commit de fusion, pour donner Ă l’utilisateur une chance d’inspecter et de peaufiner le rĂ©sultat de la fusion avant de valider.
Notez que les mises Ă jour en avance rapide ne crĂ©ent pas de commit de fusion et qu’il n’y a donc aucun moyen d’arrĂȘter ces fusions avec --no-commit. Ainsi, si vous voulez vous assurer que votre branche n’est pas modifiĂ©e ou mise Ă jour par la commande de fusion, utilisez --no-ff avec --no-commit.
- --edit
- -e
- --no-edit
-
Avant de procĂ©der Ă une fusion automatisĂ©e rĂ©ussie, lancer un Ă©diteur pour modifier le message de fusion gĂ©nĂ©rĂ© automatiquement, afin que l’utilisateur puisse expliquer et justifier la fusion. L’option
--no-edit
peut ĂȘtre utilisĂ©e pour accepter le message gĂ©nĂ©rĂ© automatiquement (ce qui est gĂ©nĂ©ralement dĂ©conseillĂ©). L’option--edit
(ou-e
) est toujours utile si vous donnez un brouillon de message avec l’option-m
de la ligne de commande et que vous voulez l’Ă©diter dans l’Ă©diteur.Les scripts plus anciens peuvent dĂ©pendre du comportement historique de ne pas autoriser l’utilisateur Ă modifier le message du journal de fusion. Ils verront un Ă©diteur ouvert lorsqu’ils exĂ©cuteront
git merge
. Pour faciliter l’ajustement de ces scripts au comportement mis Ă jour, la variable d’environnementGIT_MERGE_AUTOEDIT
peut ĂȘtre dĂ©finie surno
à leur début. - --cleanup=<mode>
-
Cette option dĂ©termine comment le message de fusion sera nettoyĂ© avant d’ĂȘtre envoyĂ©. Voir git-commit[1] pour plus de dĂ©tails. De plus, si le <mode> a la valeur
scissors
, les ciseaux seront ajoutĂ©s Ă MERGE_MSG avant d’ĂȘtre transmis Ă la machinerie de commit dans le cas d’un conflit de fusion. - --ff
- --no-ff
- --ff-only
-
PrĂ©cise comment une fusion est traitĂ©e lorsque l’historique fusionnĂ© est dĂ©jĂ un descendant de l’historique actuel.
--ff
est la valeur par dĂ©faut, sauf si l’on fusionne une Ă©tiquette annotĂ©e (et Ă©ventuellement signĂ©e) qui n’est pas stockĂ©e Ă sa place naturelle dans la hiĂ©rarchierefs/tags/
, auquel cas--no-ff
est supposé.Avec
--ff
, lorsque c’est possible, rĂ©soudre la fusion comme une avance rapide (ne mettre Ă jour le pointeur de branche que pour qu’il corresponde Ă la branche fusionnĂ©eâŻ; ne pas crĂ©er de commit de fusion). Lorsque ce n’est pas possible (lorsque l’historique fusionnĂ© n’est pas un descendant de l’historique actuel), crĂ©er un commit de fusion.Avec
--no-ff
, crĂ©er un commit de fusion dans tous les cas, mĂȘme si la fusion peut ĂȘtre rĂ©solue en avance rapide.Dans le cas
--ff-only
, il faut rĂ©soudre la fusion en avance rapide lorsque c’est possible. Lorsque ce n’est pas possible, refuser de fusionner et sortir avec un statut non nul. - -S[<idclĂ©>]
- --gpg-sign[=<idclé>]
- --no-gpg-sign
-
Signer le commit rĂ©sultant de la fusion avec GPG. L’argument
idclé
est optionnel avec par dĂ©faut l’identitĂ© du validateur ; si spĂ©cifiĂ©e, elle doit ĂȘtre collĂ©e Ă l’option sans aucun espace.--no-gpg-sign
est utile pour annuler l’effet de la variable de configurationcommit.gpgSign
ainsi que tout--gpg-sign
précédent. - --log[=<n>]
- --no-log
-
En plus des noms de branches, remplir le message du journal avec les descriptions d’une ligne depuis au maximum <n> commits rĂ©els qui sont en train d’ĂȘtre fusionnĂ©s. Voir aussi git-fmt-merge-msg[1].
Avec --no-log, ne pas indiquer les descriptions d’une ligne des commits rĂ©els qui sont fusionnĂ©s.
- --signoff
- --no-signoff
-
Ajouter une ligne finale
Signed-off-by
du validateur Ă la fin du message de validation. La signification de signoff dĂ©pend du projet sur lequel vous validez. Par exemple, cela peut certifier que le validateur a le droit de soumettre son travail sous la licence du projet ou accepte une certaine reprĂ©sentation du contributeur, tel qu’un Certificat d’Origine de DĂ©veloppeur. (Voir https://developercertificate.org/ pour celui utilisĂ© par les projet du noyau Linux ou de Git). Consultez la documentation ou la direction du projet auquel vous contribuez pour comprendre comment les signatures sont utilisĂ©es dans ce projet.L’option --no-signoff peut ĂȘtre utilisĂ©e pour contrecarrer une option --signoff prĂ©cĂ©dente sur la ligne de commande.
- --stat
- -n
- --no-stat
-
Afficher un diffstat Ă la fin de la fusion. Le diffstat est Ă©galement contrĂŽlĂ© par l’option de configuration merge.stat.
Avec -n ou --no-stat, ne pas afficher de diffstat Ă la fin de la fusion.
- --squash
- --no-squash
-
Produire l’arbre de travail et l’Ă©tat d’index comme si une fusion rĂ©elle s’Ă©tait produite (sauf pour les informations de fusion), mais ne pas faire de commit, dĂ©placer la
HEAD
, ou enregistrer$GIT_DIR/MERGE_HEAD
(pour forcer le prochaingit commit
Ă crĂ©er un commit de fusion). Cela vous permet de crĂ©er un seul commit au-dessus de la branche actuelle dont l’effet est identique Ă la fusion d’une autre branche (ou plus dans le cas d’une fusion pieuvre).Avec --no-squash, effectuer la fusion et valider le rĂ©sultat. Cette option peut ĂȘtre utilisĂ©e pour passer outre --squash.
Avec --squash, --commit n’est pas permis, et Ă©chouera.
- --[no-]verify
-
Par défaut, les crochets pre-merge et commit-msg sont exécutés. Lorsque
--no-verify
est donné, ils sont contournés. Voir aussi githooks[5]. - -s <stratégie>
- --strategy=<strategie>
-
Utiliser la stratĂ©gie de fusion donnĂ©eâŻ; peut ĂȘtre fourni plus d’une fois pour spĂ©cifier l’ordre dans lequel elles doivent ĂȘtre essayĂ©es. S’il n’y a pas d’option
-s
, une liste intégrée de stratégies est utilisée à la place (ort
lors de la fusion d’une seule tĂȘte,octopus
sinon). - -X <option>
- --strategy-option=<option>
-
Faire passer l’option spĂ©cifique de la stratĂ©gie de fusion Ă la stratĂ©gie de fusion.
- --verify-signatures
- --no-verify-signatures
-
VĂ©rifier que le commit sommet de la branche latĂ©rale Ă fusionner est signĂ© avec une clĂ© valide, c’est-Ă -dire une clĂ© qui a un uid valideâŻ: dans le modĂšle de confiance par dĂ©faut, cela signifie que la clĂ© de signature a Ă©tĂ© signĂ©e par une clĂ© de confiance. Si le commit sommet de la branche latĂ©rale n’est pas signĂ© avec une clĂ© valide, la fusion est annulĂ©e.
- --summary
- --no-summary
-
Synonymes de --stat et --no-stat ; ils sont dĂ©conseillĂ©s et seront supprimĂ©s Ă l’avenir.
- -q
- --quiet
-
Mode Silencieux. Implique --no-progress.
- -v
- --verbose
-
Mode bavard.
- --progress
- --no-progress
-
Activer/dĂ©sactiver explicitement l’affichage du progrĂšs. Si aucun des deux n’est spĂ©cifiĂ©, la progression est indiquĂ©e si l’erreur standard est connectĂ©e Ă un terminal. Notez que toutes les stratĂ©gies de fusion peuvent ne pas prendre en charge le rapport d’avancement.
- --autostash
- --no-autostash
-
CrĂ©er automatiquement une entrĂ©e temporaire de remisage avant le dĂ©but de l’opĂ©ration, l’enregistrer dans la rĂ©f
MERGE_AUTOSTASH
et l’appliquer aprĂšs la fin de l’opĂ©ration. Cela signifie que vous pouvez exĂ©cuter l’opĂ©ration sur un arbre de travail sale. Cependant, utilisez-le avec prĂ©cautionâŻ: l’application finale du remisage aprĂšs une fusion rĂ©ussie peut entraĂźner des conflits non nĂ©gligeables. -
Par défaut, la commande
git merge
refuse de fusionner les historiques qui ne partagent pas un ancĂȘtre commun. Cette option peut ĂȘtre utilisĂ©e pour passer outre cette sĂ©curitĂ© lors de la fusion des historiques de deux projets qui ont commencĂ© leur vie indĂ©pendamment l’un de l’autre. Comme c’est une occasion trĂšs rare, il n’existe pas de variable de configuration pour activer cette option par dĂ©faut et elle ne sera pas ajoutĂ©e.
- -m <msg>
-
DĂ©finir le message de commit Ă utiliser pour le commit de fusion (dans le cas oĂč un commit est crĂ©Ă©).
Si
--log
est spécifié, un journal court des commits en cours de fusion sera ajouté au message spécifié.La commande
git fmt-merge-msg
peut ĂȘtre utilisĂ©e pour donner une bonne valeur par dĂ©faut pour les invocations automatisĂ©es degit merge
. Le message automatisé peut inclure la description de la branche. - --into-name <branche>
-
Préparer le message de fusion par défaut comme si la fusion se faisait vers la branche
<branche>
, au lieu du nom de la branche réelle vers laquelle la fusion est faite. - -F <fichier>
- --file=<fichier>
-
Lire le message de commit Ă utiliser pour le commit de fusion (dans le cas oĂč un commit est crĂ©Ă©).
Si
--log
est spécifié, un journal court des commits en cours de fusion sera ajouté au message spécifié. - --rerere-autoupdate
- --no-rerere-autoupdate
-
AprĂšs que le mĂ©canisme rerere rĂ©utilise une rĂ©solution enregistrĂ©e sur le conflit actuel pour mettre Ă jour les fichiers dans l’arbre de travail, lui permettre de mettre Ă©galement Ă jour l’index avec le rĂ©sultat de la rĂ©solution.
--no-rerere-autoupdate
est un bon moyen de revérifier ce quererere
a fait et de dĂ©tecter des erreurs de fusion potentielles, avant de valider le rĂ©sultat dans l’index avec ungit add
séparé.
- --overwrite-ignore
- --no-overwrite-ignore
-
Ăcraser silencieusement les fichiers ignorĂ©s du rĂ©sultat de la fusion. C’est le comportement par dĂ©faut. Utilisez
--no-overwrite-ignore
pour abandonner. - --abort
-
Abandonner le processus actuel de rĂ©solution des conflits, et essayer de reconstruire l’Ă©tat antĂ©rieur Ă la fusion. Si une entrĂ©e de remisage automatique est prĂ©sente, l’appliquer Ă l’arbre de travail.
S’il y avait des modifications non validĂ©es dans l’arbre de travail lorsque la fusion a commencĂ©,
git merge --abort
sera dans certains cas incapable de reconstruire ces changements. Il est donc recommandé de toujours valider ou remiser vos modifications avant de lancergit merge
.git merge --abort
est Ă©quivalent Ăgit reset --merge
quandMERGE_HEAD
est présent à moins queMERGE_AUTOSTASH
soit également présent, auquel casgit merge --abort
applique l’entrĂ©e de la remisage Ă l’arbre de travail alors quegit reset --merge
sauvegardera les changements remisés dans la liste de remisage. - --quit
-
Oublier la fusion en cours. Laisser l’index et l’arbre de travail en l’áșżtat. Si
MERGE_AUTOSTASH
est prĂ©sent, l’entrĂ©e de la remisage sera sauvegardĂ©e dans la liste des remisages. - --continue
-
AprĂšs l’arrĂȘt d’un
git merge
en raison de conflits, vous pouvez conclure la fusion en lançantgit merge --continue
(voir la section "COMMENT RĂSOUDRE LES CONFLITS" ci-dessous). - <commit>…
-
Les commits, gĂ©nĂ©ralement les sommets des autres branches, Ă fusionner avec notre branche. En spĂ©cifiant plus d’un commit, on crĂ©e une fusion avec plus de deux parents (affectueusement appelĂ©e fusion Octopus).
Si aucun commit n’est donnĂ© sur la ligne de commande, fusionner les branches de suivi Ă distance que la branche actuelle est configurĂ©e pour utiliser comme sa branche amont. Voir aussi la section configuration de cette page de manuel.
Lorsque
FETCH_HEAD
(et aucun autre commit) est spécifié, les branches enregistrées dans le fichier.git/FETCH_HEAD
par l’invocation prĂ©cĂ©dente degit fetch
pour la fusion sont fusionnées à la branche courante.
VĂRIFICATIONS AVANT LA FUSION
Avant d’appliquer des modifications extĂ©rieures, vous devez faire en sorte que votre propre travail soit en bon Ă©tat et validĂ© localement, afin qu’il ne soit pas Ă©crasĂ© en cas de conflits. Voir aussi git-stash[1]. git pull
et git merge
s’arrĂȘteront sans rien faire lorsque des modifications locales non validĂ©es chevaucheront des fichiers que git pull
/git merge
devront mettre Ă jour.
Pour Ă©viter d’enregistrer des modifications sans rapport dans le commit de fusion, git pull
et git merge
seront Ă©galement annulĂ©s s’il y a des modifications enregistrĂ©es dans l’index par rapport au commit HEAD
. (Des exceptions rares Ă cette rĂšgle peuvent exister selon la stratĂ©gie de fusion utilisĂ©e, mais en gĂ©nĂ©ral, l’index doit correspondre Ă HEAD.)
Si tous les commit nommĂ©s sont dĂ©jĂ des ancĂȘtres de HEAD
, git merge
sortira plus tÎt avec le message « Déjà à jour ».
FUSION EN AVANCE RAPIDE
Souvent, le sommet de la branche actuelle est un ancĂȘtre du commit nommĂ©. C’est le cas le plus courant, surtout lorsqu’il est invoquĂ© depuis git pull
âŻ: vous suivez un dĂ©pĂŽt amont, vous n’avez pas validĂ© de modifications locales, et vous voulez maintenant mettre Ă jour vers une rĂ©vision amont plus rĂ©cente. Dans ce cas, un nouveau commit n’est pas nĂ©cessaire pour stocker l’historique combinĂ©âŻ; Ă la place, la HEAD
(avec l’index) est mise Ă jour pour pointer vers le commit nommĂ©, sans crĂ©er un commit de fusion supplĂ©mentaire.
Ce comportement peut ĂȘtre supprimĂ© avec l’option --no-ff
.
VĂRITABLE FUSION
Sauf dans le cas d’une fusion en avance rapide (voir ci-dessus), les branches Ă fusionner doivent ĂȘtre liĂ©es par un commit de fusion qui a pour parents les deux branches.
Une version fusionnée réconciliant les changements de toutes les branches à fusionner est validées, et votre HEAD
, votre index et votre arbre de travail sont mis Ă jour en consĂ©quence. Il est possible d’avoir des modifications dans l’arbre de travail tant qu’elles ne se chevauchent pasâŻ; la mise Ă jour les prĂ©servera.
Lorsqu’il n’est pas Ă©vident de rĂ©concilier les modifications, voici ce qui se passe :
-
Le pointeur
HEAD
reste le mĂȘme. -
La référence
MERGE_HEAD
est dĂ©finie pour pointer vers l’autre tĂȘte de branche. -
Les chemins qui ont Ă©tĂ© fusionnĂ©s proprement sont mis Ă jour Ă la fois dans le fichier d’index et dans votre arbre de travail.
-
En cas de conflit de chemins, le fichier d’index enregistre jusqu’Ă trois versionsâŻ: l’Ă©tape 1 stocke la version de l’ancĂȘtre commun, l’Ă©tape 2 de
HEAD
, et l’Ă©tape 3 deMERGE_HEAD
(vous pouvez inspecter les Ă©tapes avecgit ls-files -u
). Les fichiers de l’arbre de travail contiennent le rĂ©sultat de l’opĂ©ration de fusion, c’est-Ă -dire les rĂ©sultats de la fusion Ă 3 points avec les marqueurs de conflit familiers<<<
===
>>>
. -
Une réf nommée
AUTO_MERGE
est Ă©crite, indiquant un arbre correspondant au contenu actuel de l’arbre de travail (y compris les marqueurs de conflit pour les conflits textuels). Notez que cette rĂ©f n’est Ă©crite que lorsque la stratĂ©gie de fusion ort est utilisĂ©e (par dĂ©faut). -
Aucune autre modification n’est apportĂ©e. En particulier, les modifications locales que vous aviez avant de commencer la fusion resteront les mĂȘmes et les entrĂ©es de l’index qui les concernent resteront telles quelles, c’est-Ă -dire correspondant Ă
HEAD
.
Si vous avez essayé une fusion qui a donné lieu à des conflits complexes et que vous voulez recommencer, vous pouvez vous remettre à zéro avec git merge --abort
.
LA FUSION D’ĂTIQUETTE
Lors de la fusion d’une Ă©tiquette annotĂ©e (et Ă©ventuellement signĂ©e), Git crĂ©e toujours un commit de fusion mĂȘme si une fusion en avance rapide est possible, et le modĂšle de message de validation est prĂ©parĂ© avec le message de l’Ă©tiquette. De plus, si l’Ă©tiquette est signĂ©e, la vĂ©rification de la signature est signalĂ©e sous forme de commentaire dans le modĂšle de message. Voir aussi git-tag[1].
Lorsque vous souhaitez simplement intĂ©grer le travail menant au commit qui se trouve ĂȘtre Ă©tiquetĂ©, par exemple lors de la synchronisation avec un point de publication en amont, vous ne voudrez peut-ĂȘtre pas faire un commit de fusion inutile.
Dans ce cas, vous pouvez "dĂ©baller" l’Ă©tiquette vous-mĂȘme avant de la donner Ă git merge
, ou passer --ff-only
lorsque vous n’avez pas de travail Ă faire vous-mĂȘme par exemple
git fetch origin git merge v1.2.3^0 git merge --ff-only v1.2.3
COMMENT LES CONFLITS SONT PRĂSENTĂS
Lors d’une fusion, les fichiers de l’arbre de travail sont mis Ă jour pour reflĂ©ter le rĂ©sultat de la fusion. Parmi les modifications apportĂ©es Ă la version de l’ancĂȘtre commun, celles qui ne se chevauchent pas (c’est-Ă -dire que vous avez modifiĂ© une zone du fichier alors que l’autre cĂŽtĂ© a laissĂ© cette zone intacte, ou vice versa) sont incorporĂ©es directement dans le rĂ©sultat final. Cependant, lorsque les deux cĂŽtĂ©s ont apportĂ© des modifications Ă la mĂȘme zone, Git ne peut pas choisir au hasard un cĂŽtĂ© par rapport Ă l’autre, et vous demande de rĂ©soudre le problĂšme en laissant ce que les deux cĂŽtĂ©s ont fait Ă cette zone.
Par dĂ©faut, Git utilise le mĂȘme style que celui utilisĂ© par le programme "merge" de la suite RCS pour prĂ©senter une telle section conflictuelle, comme ceci :
Voici des lignes qui sont soit inchangĂ©es par rapport Ă l'ancĂȘtre commun, ou rĂ©solues proprement parce qu'un seul cĂŽtĂ© a changĂ©, ou parce que les deux cĂŽtĂ©s ont changĂ© de la mĂȘme maniĂšre. <<<<<<< yoursâŻ: exemple.txt La rĂ©solution des conflits est difficileâŻ; allons faire du shopping. ======= Git facilite la rĂ©solution des conflits. >>>>>>> theirsâŻ: exemple.txt Et voici une autre ligne qui est rĂ©solue proprement ou non modifiĂ©e.
La zone oĂč une paire de modifications contradictoires s’est produite est marquĂ©e par les marqueurs <<<<<<<
, ========
, et >>>>>>>>>>`
. La partie qui précÚde le =======
est généralement votre cÎté, et la partie qui suit est généralement leur cÎté.
Le format par dĂ©faut ne montre pas ce que l’original a dit dans la zone de conflit. Vous ne pouvez pas savoir combien de lignes sont supprimĂ©es et remplacĂ©es par la remarque de Barbie Ă votre cĂŽtĂ©. La seule chose que vous pouvez dire, c’est que votre cĂŽtĂ© veut dire que c’est difficile et que vous prĂ©fĂ©rez faire du shopping, alors que l’autre cĂŽtĂ© veut prĂ©tendre que c’est facile.
Un autre style peut ĂȘtre utilisĂ© en rĂ©glant la variable de configuration merge.conflictStyle
sur "diff3" ou "zdiff3". Dans le style "diff3", le conflit ci-dessus peut ressembler Ă ceciâŻ:
Voici les lignes qui sont soit inchangĂ©es par rapport Ă l'ancĂȘtre commun, ou proprement rĂ©solues parce qu'un seul cĂŽtĂ© a changĂ©, <<<<<<<< yours:exemple.txt ou parce que les deux cĂŽtĂ©s ont changĂ© de la mĂȘme façon. La rĂ©solution des conflits est difficile ; Allons faire du shopping. ||||||| base:sample.txt ou parce que les deux cĂŽtĂ©s ont changĂ© de la mĂȘme façon. La rĂ©solution des conflits est difficile. ======= ou parce que les deux cĂŽtĂ©s ont changĂ© de la mĂȘme façon. Git facilite la rĂ©solution des conflits. >>>>>>> theirs:exemple.txt Et voici une autre ligne qui est proprement rĂ©solue ou non modifiĂ©e.
alors que dans le style "zdiff3", cela peut ressembler Ă ceci :
Voici les lignes qui sont soit inchangĂ©es par rapport Ă l'ancĂȘtre commun, ou proprement rĂ©solu parce qu'un seul cĂŽtĂ© a changĂ©, ou parce que les deux cĂŽtĂ©s ont changĂ© de la mĂȘme maniĂšre. <<<<<<<< yours:exemple.txt La rĂ©solution des conflits est difficile ; Allons faire du shopping. ||||||| base:sample.txt ou parce que les deux cĂŽtĂ©s ont changĂ© de la mĂȘme maniĂšre. La rĂ©solution des conflits est difficile. ======= Git facilite la rĂ©solution des conflits. >>>>>>> theirs:exemple.txt Et voici une autre ligne qui est proprement rĂ©solue ou non modifiĂ©e.
En plus des marqueurs <<<<<<<<
, =======
, et >>>>>>>>>>>, il utilise un autre marqueur `||||||||
qui est suivi par le texte original. Vous pouvez voir que l’original ne faisait qu’Ă©noncer un fait, et que votre camp a simplement cĂ©dĂ© Ă cette dĂ©claration et a abandonnĂ©, tandis que l’autre camp a essayĂ© d’avoir une attitude plus positive. Vous pouvez parfois aboutir Ă une meilleure rĂ©solution en regardant l’original.
COMMENT RĂSOUDRE LES CONFLITS
AprĂšs avoir vu un conflit, vous pouvez faire deux chosesâŻ:
-
Décider de ne pas fusionner. Les seuls nettoyages dont vous avez besoin sont de réinitialiser le fichier index au commit
HEAD
Ă inverser 2. et pour nettoyer les modification dâarbre de travail effectuĂ©es par 2. et 3. âŻ;git merge --abort
peut ĂȘtre utilisĂ© pour cela. -
RĂ©soudre les conflits. Git marquera les conflits dans lâarbre de travail. Modifier les fichiers en forme et les
git add
Ă lâindex. Utilisergit commit
ougit merge --continue
pour sceller lâaffaire. Cette derniĂšre commande vĂ©rifie sâil y a une fusion (interrompue) en cours avant dâappelergit commit
.
Vous pouvez rĂ©soudre le conflit Ă l’aide d’un certain nombre d’outils :
-
Utiliser un mergetool.
git mergetool
pour lancer un outil de fusion graphique qui vous permettra de travailler sur la fusion. -
Regarder les différences. ` git diff` affichera une différence à trois points, en mettant en évidence les modifications apportées par les versions
HEAD
etMERGE_HEAD
.git diff AUTO_MERGE
va afficher quelles modifications vous avez rĂ©alisĂ©es jusqu’ici pour rĂ©soudre les conflits textuels. -
Regarder les différences de chaque branche.
git log --merge -p <chemin>
montrera les diffĂ©rences d’abord pour la versionHEAD
et ensuite pour la versionMERGE_HEAD
. -
Regarder les originaux.
git showâŻ:1:nom-de-fichier
montre l’ancĂȘtre commun,git showâŻ:2:nom-de-fichier
montre la versionHEAD
, etgit showâŻ:3:nom-de-fichier
montre la versionMERGE_HEAD
.
EXEMPLES
-
Fusionner les branches
corrections
et "améliorations` par dessus la branche actuelle, en faisant une fusion octopus :$ git merge corrections améliorations
-
Fusionner la branche
obsolĂšte
dans la branche actuelle, en utilisant la stratégie de fusionours
:$ git merge -s ours obsolĂšte
-
Fusionner la branche
maint
dans la branche actuelle, mais ne pas faire un nouveau commit automatiquement :$ git merge --no-commit maint
Ceci peut ĂȘtre utilisĂ© lorsque vous souhaitez inclure d’autres modifications Ă la fusion ou lorsque vous souhaitez rĂ©diger votre propre message de validation de la fusion.
Vous devriez vous abstenir d’abuser de cette possibilitĂ© pour introduire en douce des modifications substantielles dans un commit de fusion. De petites corrections comme le remplacement du nom de la version ou de la livraison seraient acceptables.
LES STRATĂGIES DE FUSION
Le mécanisme de fusion (commandes git merge
et git pull
) permet de choisir les stratĂ©gies de fusion du backend avec l’option -s
. Certaines stratĂ©gies peuvent Ă©galement prendre leurs propres options, qui peuvent ĂȘtre passĂ©es en donnant des arguments -X<option>
Ă git merge
et/ou git pull
.
- ort
-
C’est la stratĂ©gie de fusion par dĂ©faut lors du tirage ou de la fusion d’une branche. Cette stratĂ©gie ne peut rĂ©soudre que deux tĂȘtes en utilisant un algorithme de fusion Ă trois voies. Lorsqu’il y a plus d’un ancĂȘtre commun qui peut ĂȘtre utilisĂ© pour la fusion Ă trois, il crĂ©e un arbre fusionnĂ© des ancĂȘtres communs et l’utilise comme arbre de rĂ©fĂ©rence pour la fusion Ă trois. Il a Ă©tĂ© rapportĂ© que cela permettait de rĂ©duire les conflits de fusion sans provoquer de fausses fusions, grĂące Ă des tests effectuĂ©s sur de vraies fusions tirĂ©es de l’historique de dĂ©veloppement du noyau Linux 2.6. En outre, cette stratĂ©gie permet de dĂ©tecter et de gĂ©rer les fusions impliquant des renommages. Elle ne peut actuellement pas utiliser les copies dĂ©tectĂ©es. Le nom de cet algorithme est un acronyme ("Ostensibly Recursive’s Twin"âŻ: Jumeau ostensible de recurse) et vient du fait qu’il a Ă©tĂ© Ă©crit pour remplacer l’algorithme par dĂ©faut prĂ©cĂ©dent,
recursive
.La stratégie ort peut prendre les options suivantes :
- ours
-
Cette option oblige Ă rĂ©soudre les sections en conflit de maniĂšre autonome et propre en favorisant notre version (our). Les modifications par rapport Ă l’autre arbre qui n’entrent pas en conflit avec notre version se reflĂštent dans le rĂ©sultat de la fusion. Pour un fichier binaire, tout le contenu est pris de notre cĂŽtĂ©.
Il ne faut pas la confondre avec la stratĂ©gie de fusion ours, qui ne tient mĂȘme pas compte de ce que contient l’autre arbre. Elle rejette tout ce que l’autre arbre a fait, dĂ©clarant que "notre" historique (our) contient tout ce qui s’y est passĂ©.
- theirs
-
C’est le contraire de ours ; notez que, contrairement Ă ours, il n’y a pas de stratĂ©gie de fusion theirs avec laquelle confondre cette option de fusion.
- ignore-space-change
- ignore-all-space
- ignore-space-at-eol
- ignore-cr-at-eol
-
Traiter les lignes avec le type de changement d’espace indiquĂ© comme inchangĂ©es dans l’intĂ©rĂȘt d’une fusion Ă trois points. Les changements d’espacement mĂ©langĂ©s Ă d’autres changements de ligne ne sont pas ignorĂ©s. Voir aussi git-diff[1]
-b
,-w
,--ignore-space-at-eol
, et--ignore-cr-at-eol
.-
Si "leur" version (theirs) n’introduit que des changements d’espacement sur une ligne, "notre" version (our) est utilisĂ©e ;
-
Si "notre" version introduit des modifications dans l’espace blanc mais que "leur" version inclut un changement substantiel, "leur" version est utilisĂ©e ;
-
Dans le cas contraire, la fusion se déroule de la maniÚre habituelle.
-
- renormalize
-
Il s’agit d’une extraction et d’un validation virtuelle des trois Ă©tapes d’un fichier lors de la rĂ©solution d’une fusion Ă trois points. Cette option est destinĂ©e Ă ĂȘtre utilisĂ©e lors de la fusion de branches avec diffĂ©rents filtres clean ou rĂšgles de normalisation de fin de ligne. Voir "Fusion de branches avec diffĂ©rents attributs de validation/extraction" dans gitattributes[5] pour plus de dĂ©tails.
- no-renormalize
-
DĂ©sactiver l’option
renormalize
. Cela surcharge la variable de configurationmerge.renormalize
. - find-renames[=<n>]
-
Activer la dĂ©tection de renommage, en fixant Ă©ventuellement le seuil de similaritĂ©. C’est la valeur par dĂ©faut. Cela surcharge la variable de configuration
merge.renames
. Voir aussi git-diff[1]--find-renames
. - rename-threshold=<n>
-
Synonyme obsolĂšte pour
find-renames=<n>
. - subtree[=<chemin>]
-
Cette option est une forme plus avancĂ©e de stratĂ©gie subtree, oĂč la stratĂ©gie fait une estimation de la façon dont deux arbres doivent ĂȘtre dĂ©placĂ©s pour correspondre l’un Ă l’autre lors de la fusion. Au lieu de cela, le chemin spĂ©cifiĂ© est prĂ©fixĂ© (ou tronquĂ© au debut) pour faire correspondre la forme de deux arbres.
- recursive
-
Cela ne peut rĂ©soudre que deux tĂȘtes en utilisant un algorithme de fusion Ă trois voies. Lorsqu’il y a plus d’un ancĂȘtre commun qui peut ĂȘtre utilisĂ© pour la fusion Ă trois, il crĂ©e un arbre fusionnĂ© des ancĂȘtres communs et l’utilise comme arbre de rĂ©fĂ©rence pour la fusion Ă trois. Il a Ă©tĂ© rapportĂ© que cela permettait de rĂ©duire les conflits de fusion sans provoquer de fausses fusions, grĂące Ă des tests effectuĂ©s sur de vraies fusions tirĂ©es de l’historique de dĂ©veloppement du noyau Linux 2.6. En outre, cela permet de dĂ©tecter et de gĂ©rer les fusions impliquant des renommages. Cela n’utilise les copies dĂ©tectĂ©es. C’Ă©tait la stratĂ©gie par dĂ©faut lors de la rĂ©solution de deux sommets pour Git depuis la version v0.99.9k jusqu’Ă v2.33.0.
La stratĂ©gie recursive utilise les mĂȘmes options que ort. Cependant, il y a trois options supplĂ©mentaires que ort ignore (non documentĂ©es ci-dessus) et qui sont potentiellement utiles avec la stratĂ©gie recursiveâŻ:
- patience
-
Synonyme obsolĂšte pour
diff-algorithm=patience
. - diff-algorithm=[patience|minimal|histogram|myers]
-
Utiliser un algorithme de diff différent lors des fusions, ce qui peut aider à éviter les erreurs de fusion dues à des lignes de correspondance sans importance (comme des accolades de fonctions distinctes). Voir aussi git-diff[1]
--diff-algorithm
. Notez queort
utilise spécifiquementdiff-algorithm=histogram
, alors querecursive
utilise par défaut le paramÚtre de configurationdiff.algorithm
. - no-renames
-
Désactiver la détection de renommage. Ceci annule la variable de configuration
merge.renames
. Voir aussi git-diff[1]--no-renames
.
- resolve
-
Cela ne peut rĂ©soudre que deux tĂȘtes (c’est-Ă -dire la branche actuelle et une autre branche dont vous avez tirĂ©) en utilisant un algorithme de fusion Ă trois points. Cela essaie de dĂ©tecter avec soin les ambiguĂŻtĂ©s de la fusion croisĂ©e. Les renommages ne sont pas gĂ©rĂ©s.
- octopus
-
Cela permet de rĂ©soudre les cas Ă plus de deux tĂȘtes, mais refuse de faire une fusion complexe qui nĂ©cessite une rĂ©solution manuelle. C’est principalement destinĂ© Ă ĂȘtre utilisĂ© pour regrouper les tĂȘtes de branches thĂ©matiques. C’est la stratĂ©gie de fusion par dĂ©faut lorsque l’on tire ou fusionne plusieurs branches.
- ours
-
Cela rĂ©sout un nombre quelconque de tĂȘtes, mais l’arbre rĂ©sultant de la fusion est toujours celui de la tĂȘte de la branche actuelle, ignorant effectivement toutes les modifications provenant de toutes les autres branches. C’est censĂ© ĂȘtre utilisĂ© pour remplacer l’ancienne historique du dĂ©veloppement des branches latĂ©rales. Notez que cette stratĂ©gie est diffĂ©rente de l’option -Xours de la stratĂ©gie de fusion recursive.
- subtree
-
Il s’agit d’une stratĂ©gie
ort
modifiĂ©e. Lors de la fusion des arbres A et B, si B correspond Ă un sous-arbre de A, B est d’abord ajustĂ© pour correspondre Ă la structure arborescente de A, au lieu de lire les arbres au mĂȘme niveau. Cet ajustement est Ă©galement effectuĂ© sur l’arbre de l’ancĂȘtre commun.
Avec les stratĂ©gies qui utilisent la fusion Ă trois points (y compris la fusion par dĂ©faut, ort), si une modification est effectuĂ©e sur les deux branches, mais qu’elle est ensuite inversĂ©e sur l’une des branches, ce changement sera prĂ©sent dans le rĂ©sultat de la fusionâŻ; certaines personnes trouvent ce comportement dĂ©routant. Cela se produit parce que seules les tĂȘtes et la base de la fusion sont prises en compte lors d’une fusion, et non le commit individuel. L’algorithme de fusion considĂšre donc le changement inversĂ© comme n’Ă©tant pas un changement du tout, et substitue la version modifiĂ©e Ă la place.
CONFIGURATION
Warning
|
Missing See original version for this content. |
Warning
|
Missing See original version for this content. |
GIT
Fait partie de la suite git[1]
TRADUCTION
Cette page de manuel a été traduite par Jean-Noël Avila <jn.avila AT free DOT fr> et les membres du projet git-manpages-l10n. Veuillez signaler toute erreur de traduction par un rapport de bogue sur le site https://github.com/jnavila/git-manpages-l10n .