快进合并对于短暂的分支是有意义的,但是在更复杂的历史中,非快进合并可能使历史更易于理解,并且更易于还原一组提交。
警告:非快进也有潜在的副作用。请查看https://sandofsky.com/blog/git-workflow.html,避免带有“检查点提交”的“ no-ff”打破对等或怪罪,并仔细考虑它是否是您的默认方法master
。
(来自nvie.com,文森特· 德里森(Vincent Driessen)发布了“ 成功的Git分支模型 ”)
在开发中加入完成的功能
可以将完成的功能合并到developer分支中,以将其添加到即将发布的版本中:
$ 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
该--no-ff
标志使合并始终创建一个新的提交对象,即使合并可以通过快进来执行。这样可以避免丢失有关要素分支历史存在的信息,并将所有添加了要素的提交分组在一起。
JakubNarębski也提到了配置merge.ff
:
默认情况下,当合并作为当前提交的后代的提交时,Git不会创建额外的合并提交。相反,当前分支的尖端是快进的。
设置false
为时,此变量告诉Git在这种情况下创建一个额外的合并提交(相当于--no-ff
从命令行提供选项)。
设置为' only
'时,仅允许这种快速合并(等同于--ff-only
从命令行提供选项)。
快进是默认设置,因为:
- 短期分支很容易在Git中创建和使用
- 寿命短的分支通常会隔离许多可在该分支内自由重组的提交
- 这些提交实际上是main分支的一部分:重新组织后,main分支将快速转发以包括它们。
但是,如果您期望在一个主题/功能分支上进行迭代的工作流(即,我合并,然后回到该功能分支并添加更多提交),那么仅将合并包含在主分支中将很有用,而不是功能分支的所有中间提交。
在这种情况下,您最终可以设置这种配置文件:
[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
OP在注释中添加:
我认为[short-lived]分支在某种意义上是快进的,但是将其设置为默认操作意味着git假设您...经常拥有[short-lived]分支。合理?
Jefromi的答案:
我认为分支的生命周期因用户而异。不过,在经验丰富的用户中,可能存在寿命更长的分支机构。
对我来说,短暂创建的分支是我创建的分支,目的是使某些操作更容易(重新定级,可能的执行或快速修补和测试),然后在完成后立即删除。
这意味着它可能应该被吸收到从其分支的主题分支中,并且该主题分支将合并为一个分支。没有人需要知道我在内部所做的事情,以创建实现该给定功能的一系列提交。
更一般而言,我添加:
这实际上取决于您的开发工作流程:
- 如果是线性的,则一个分支有意义。
- 如果您需要隔离功能并长时间使用它们并重复合并它们,则可以使用多个分支。
请参阅“ 您应该何时分支? ”
其实,当你考虑到水银分支模式,它是在其核心的一个每库分支(即使你可以创建匿名头,书签,甚至命名分支)
见“的Git和Mercurial -比较和对比”。
默认情况下,Mercurial使用匿名的轻量级代码行,在其术语中称为“ heads”。
Git使用轻量级的命名分支,并使用注入式映射将远程存储库中的分支名称映射到远程跟踪分支的名称。
Git会“强迫”您命名分支(好吧,除了一个未命名的分支,这种情况称为“ 分离头 ”),但是我认为这对于需要大量分支的工作流(例如主题分支工作流)更有效。单个存储库范式中的多个分支。
no-ff
带有“检查点提交”的“”,以免造成二等分或怪罪。