Puis-je désactiver le transfert rapide par défaut dans git?

263

Je ne peux pas vraiment penser jamais d'un moment où j'utiliser git mergeplutôt que git rebaseet ne veulent avoir un commettras apparaissent. Existe-t-il un moyen de configurer git pour désactiver le transfert rapide par défaut? Le fait qu'il existe une --ffoption semble impliquer qu'il existe un moyen, mais je n'arrive pas à le trouver dans la documentation.

Jason Baker
la source
3
J'utilise mergetout le temps pour les succursales qui n'ont effectué aucune validation de leur télécommande afin de les faire avancer rapidement. Cela semble être le moyen le plus simple et le plus sûr de le faire. Je suis curieux, vous avez évidemment un cas d'utilisation. Pourquoi voudriez-vous jamais créer un commit de fusion où il n'y a pas de commit d'un côté de la branche?
CB Bailey
12
J'utilise des branches pour créer un regroupement logique de commits. Donc, si je fais une fusion, c'est essentiellement une façon de dire "ces commits vont de pair". Vous pouvez presque le considérer comme le rebase et le squash interactif d'un pauvre. :-)
Jason Baker
13
La désactivation de l'avance rapide est extrêmement utile, en particulier lorsque vous suivez un modèle comme Un modèle de branchement Git réussi
steinybot
2
Veuillez modifier la réponse acceptée pour cela par la réponse d'Eric Platon stackoverflow.com/a/6810687/3408 - J'ai fait les étapes de la réponse acceptée, puis j'ai réalisé que c'était uniquement pour la branche principale dans le référentiel actuel, ce qui est idiot.
rjmunro
3
@ jpmc26 Chacun à sa façon, je suppose. Je suis en désaccord avec cet article. Trouver les deux parents d'un commit de fusion n'est pas difficile et vous indique exactement quels étaient les changements. Ensuite, vous pouvez prendre ces modifications et effectuer un "rebase sur" une autre branche. Avec le modèle plat, vous devez rechercher et sélectionner manuellement les cerises. Nous choisissons d'embrasser la ramification. Bien sûr, c'est complexe lorsque l'on regarde l'arbre entier, mais c'est la réalité, de multiples changements se produisent en parallèle. Aplatir tout cache simplement ce qui s'est réellement passé.
steinybot

Réponses:

282

Oui, bien sûr --no-ff. Vous pouvez configurer les options de fusion par branche, par exemple

git config branch.master.mergeoptions  "--no-ff"

ajoute ce qui suit à votre $(REPO)/.git/configfichier:

[branch "master"]
    mergeoptions = --no-ff

Note de bas de page: en parlant de mon expérience, j'ai finalement trouvé que le basculement de l'avance rapide sur off était surtout utile pour les nouveaux arrivants git - mais une fois que la sensation pour les workflows et les concepts commence à se dissiper, vous voulez certainement éviter de brouiller votre graphique de journal avec des tonnes de fusion inutile le type ..blarf distant commet.

Note de bas de page 2, une décennie plus tard: les autres réponses ci-dessous fournissent des options de configuration plus modernes, mais vraiment, vous voulez probablement rester avec les valeurs par défaut (c'est-à-dire avancer rapidement dans la mesure du possible) de nos jours, car la fusion vide ne valide vraiment que rendre l'histoire beaucoup plus difficile à raisonner.

conny
la source
142
Apprendre le git, c'est un peu comme l'alpinisme; mais au lieu de commencer par de petites falaises et de progresser vers des plus difficiles, git vous fait gravir la même montagne encore et encore, pour tomber à des hauteurs différentes à chaque fois, à chaque fois tout aussi surpris que la ligne de vie ne soit pas attachée.
conny
12
@Thomas: Oui; git pullest git fetch+ git merge.
Michelle Tilley
9
Cela semble bien, mais existe-t-il un moyen de le faire globalement, pour toutes les branches, au lieu de devoir le configurer pour chaque branche?
bwinton
33
Méfiez-vous des dragons. Cette option est dangereuse comme @Thomas l'a dit ... Chaque pull git crée un commit de fusion. git pull --ff ne remplace pas les mergeoptions = no-ff dans git config.
Dalibor Filus du
15
Et si je suis juste fatigué de taper git merge --no-ff (branchname)? Et je veux git pullfonctionner comme il l'a toujours fait?
Dogweather
341

Il semble qu'il y ait encore une question en suspens dans le fil: comment le faire globalement (c'est-à-dire pour toutes les branches)? Pour les enregistrements, nous pouvons utiliser les éléments suivants:

git config --add merge.ff false

... pour l'appliquer à toutes les branches du référentiel actuel. Pour le faire s'appliquer à toutes les branches dans tous les référentiels où quelqu'un ne l' a pas exécuté sans l' --globaloption (les paramètres locaux remplacent global) exécutez ceci:

git config --global --add merge.ff false

De la documentation :

merge.ff
Par défaut, git ne crée pas de commit de fusion supplémentaire lors de la fusion d'un commit descendant du commit actuel. Au lieu de cela, la pointe de la branche actuelle est avancée rapidement. Lorsqu'elle est définie sur false, cette variable indique à git de créer un commit de fusion supplémentaire dans un tel cas (équivalent à donner l' --no-ffoption depuis la ligne de commande). Lorsqu'il est défini sur seulement, seules ces fusions à avance rapide sont autorisées (équivalent à donner l' --ff-onlyoption à partir de la ligne de commande).

Eric Platon
la source
18
Remarque: a merge.ffété introduit dans Git 1.7.6. Il n'est pas efficace dans les anciennes versions.
Chris Johnsen
2
Pour les personnes utilisant Git 1.7.6, c'est la solution la meilleure et la plus simple.
Ryan Lundy
22
J'utilise ceci avec un aliaspuff = "pull --ff --ff-only"
stigi
11
Il y a aussi (maintenant, voir git-scm.com/docs/git-config ) l'option pull.ff qui ne peut être définie que , ce qui fera la même chose que l'alias.
jotomo
1
Merci, @jotomo. Cette fonctionnalité est disponible à partir de Git v2.0.0 (à partir de la validation b814da891e8261b909fc5d9fb07b4e8b13989c2d).
Eric Platon
14

En lisant le fil des réponses, j'ai fini par utiliser les deux options suivantes

git config --global pull.ff only # Disallows non ff merges on pull. Overrides merge.ff when pulling
git config --global merge.ff false # even create extra merge commit when fast forward merge would be possible

Seulement vaguement lié, j'ai également trouvé que ce paramètre évite les problèmes lors de la traction

git config --global pull.rebase true # set up pull to rebase instead of merge
Bastian
la source
1
git config --global pull.rebase true # avis 'true' à la fin de la ligne
zowers
Merci @zowers J'ai résolu ce problème
Bastian