Avance rapide de la fusion de sens que pour une courte durée branches, mais en plus complexe de l'histoire, non d'avance rapide, de la fusion peut rendre l'histoire plus facile à comprendre, et de le rendre plus facile pour rétablir un groupe de commits.
(À partir de nvie.com, Vincent Driessen, poster "Un succès Git ramification modèle")
Intégrant un fini fonctionnalité à développer
Fini les caractéristiques peuvent être fusionnés dans le fait de développer direction de l'ajouter dans la prochaine version:
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop
L' --no-ff
indicateur provoque la fusion de toujours créer un nouveau commit objet, même si la fusion peut être réalisée avec une avance rapide. Cela évite de perdre des informations sur l'existence historique de la branche, et regroupe tous les commits qui, ensemble, ajout de la fonctionnalité.
Jakub Narębski aussi mentionne la config merge.ff
:
Par défaut, Git ne pas créer un supplément de fusion s'engager lors de la fusion d'un commit qui est un descendant du commit courant. Au lieu de cela, l'extrémité de la branche courante est l'avance rapide.
Lorsque la valeur false
, cette variable indique à Git pour créer un supplément de fusion s'engager dans un tel cas (équivalent à donner l' --no-ff
option de la ligne de commande).
Lorsque la valeur 'only
', avance rapide fusionne sont autorisés (équivalent à donner l' --ff-only
option de la ligne de commande).
L'avance rapide est la valeur par défaut parce que:
- de courte durée, les branches sont très faciles à créer et à utiliser dans Git
- de courte durée branches souvent d'isoler de nombreux s'engage à ce que peut être réorganisé librement à l'intérieur de la branche
- ces commits sont en fait une partie de la branche principale: une fois réorganisé, la branche principale est l'avance rapide pour les inclure.
Mais si vous prévoyez un processus itératif de flux de travail sur un sujet/branche (c'est à dire, je les fusionner, puis-je revenir à cette branche, et ajouter plus valide), puis il est utile d'inclure uniquement l'opération de fusion dans la branche principale, plutôt que tous les intermédiaires commits de la branche.
Dans ce cas, vous pouvez finir par ce type de fichier de configuration:
[branch "master"]
# This is the list of cmdline options that should be added to git-merge
# when I merge commits into the master branch.
# The option --no-commit instructs git not to commit the merge
# by default. This allows me to do some final adjustment to the commit log
# message before it gets commited. I often use this to add extra info to
# the merge message or rewrite my local branch names in the commit message
# to branch names that are more understandable to the casual reader of the git log.
# Option --no-ff instructs git to always record a merge commit, even if
# the branch being merged into can be fast-forwarded. This is often the
# case when you create a short-lived topic branch which tracks master, do
# some changes on the topic branch and then merge the changes into the
# master which remained unchanged while you were doing your work on the
# topic branch. In this case the master branch can be fast-forwarded (that
# is the tip of the master branch can be updated to point to the tip of
# the topic branch) and this is what git does by default. With --no-ff
# option set, git creates a real merge commit which records the fact that
# another branch was merged. I find this easier to understand and read in
# the log.
mergeoptions = --no-commit --no-ff
L'OP ajoute dans les commentaires:
Je vois un certain sens, en avance rapide [de courte durée] les branches, mais ce qui en fait l'action par défaut signifie que git suppose que vous... ont souvent [de courte durée] les branches. Est-elle raisonnable?
Jefromi réponses:
Je pense que la durée de vie de branches varie fortement d'un utilisateur à l'autre. Parmi les utilisateurs expérimentés, cependant, il y a probablement une tendance à avoir beaucoup plus de courte durée branches.
Pour moi, une courte durée de vie de la branche est celui que j'ai créer dans le but de rendre une opération plus facile (rebasage, probablement, ou rapide, l'application de correctifs et d'essais), puis supprimez-le immédiatement une fois que je suis fait.
Cela signifie qu'il est probable doit être absorbé par le sujet branche fourchue de, et le thème de la branche seront fusionnés en une seule branche. Personne n'a besoin de savoir ce que j'ai fait à l'interne dans le but de créer la série de commits mise en œuvre de cette fonctionnalité donnée.
Plus généralement, j'ajoute:
cela dépend vraiment de votre processus de développement:
- si elle est linéaire, une branche de sens.
- Si vous avez besoin d'isoler des caractéristiques et de travailler sur eux pour une longue période de temps et à plusieurs reprises les fusionner, plusieurs branches du sens.
Voir "Quand devez-vous branche?"
En fait, lorsque vous pensez à l'Mercurial direction de modèle, il est, à sa base, une branche par dépôt (même si vous pouvez créer des têtes anonymes, des signets et même les branches nommées)
Voir "Git et Mercurial - Comparer et de Contraste".
Mercurial, par défaut, utilise anonyme léger codelines, qui, dans sa terminologie sont appelés "têtes".
Git utilise léger nommé branches, avec injective mappage pour mapper les noms de branches dans le dépôt distant à des noms de distance de suivi des branches.
Git "forces" vous nom branches (bien, à l'exception d'un seul sans nom de la branche, qui est un situation appelé un "détaché de la TÊTE"), mais je pense que cela fonctionne mieux avec de la branche lourde les processus tels que le sujet de la branche de flux de travail, sens de plusieurs branches dans un référentiel unique de paradigme.