使用Control Freak: Commit rejected. Foxtrot merges not allowed的确切原因是什么
我们经常收到这个错误,这是不是因为用户在提交时组合了pull、rebase和amend而导致的?
需要澄清才能永久摆脱这一点。我知道并理解分支已经分叉,它丢失了踪迹,但在简单的语言中究竟是什么导致了这种情况的发生,这是非常值得注意的
当我们每次看到这个错误的时候,这是一个消磨时间的事情。我们正在手动挑选更改,以摆脱这一点。
如何识别提交的类型,如rebase、pull或committed之后的权限提交,以及提交的确切内容是什么以及由谁提交?
我们希望教育开发人员从类似的提交错误中走出来。都很想听听最佳实践。
另外,想要理解git-bash/source-tree这样的组合工具有什么原因吗?
我们能碰巧关闭这个原因吗?

发布于 2019-03-14 13:40:48
这与BitBucket上特别禁止的Foxtrot merges相关:
狐步舞合并是一个特定的git提交序列。一个特别邪恶的序列。在开阔的开阔草地上,序列看起来是这样的:

,但是狐步舞很少在野外看到。它们藏在树冠里,在树枝之间。我称它们为狐步舞,因为当它们在突袭过程中被捕捉到时,它们看起来就像同名交际舞的脚步序列:

Foxtrot合并是不好的,因为它们改变了原始/母公司的第一个父母的历史。
合并提交的父级是有序的。第一个父对象是HEAD。第二个父对象是使用git merge命令引用的提交。
你可以这样想:
git checkout 1st-parent
git merge 2nd-parent如果推送:

正如在"GIT: How can I prevent foxtrot merges in my 'master' branch?“中所解释的,提交'D‘是一个狐步舞合并,因为'origin/master’是它的第二个父级。
这是拉取(fetch + merge)的结果
一旦狐步舞合并D被推进..。“origin/master”的第一个父历史记录不再包含提交“B”!
正如torek在"how to avoid foxtrot merge in git“中解释的那样,这是直接在master (新的提交C)上工作,并执行git拉取(而不是pull --rebase,as I always advice)的结果。
这将把B和C合并成D (狐步舞合并),这意味着origin/master不再有B作为直接祖先,而是C。
您的工作'C‘现在成为主要发布的分支历史记录(origin/master),而不是B,被归入合并后的内容。
发布于 2019-03-30 13:29:41
避免这个问题的最简单的方法是总是运行"git pull --rebase“,而不是运行默认的"git pull”。这里有一篇关于这方面的深度博客文章:Too much fun with "git pull --rebase"
你遇到这个问题的原因是因为你的公司已经为Bitbucket安装了免费的Control Freak插件,并且他们对所有分支都保留了默认的Foxtrot Prevention控件。
如果你使用的是Bitbucket Server5.5或更新版本,你可以直接从pull - request屏幕重新设置pull-requests的基础。单击"...“pull-request屏幕最右侧的按钮和"Rebase“菜单项应可用。
或者,您可以要求管理员禁用狐步舞预防功能。即使是repo管理员也可以这样做(不需要全局管理员)。但我不建议禁用此控件,因为它可以防止混乱的提交历史记录。
完全公开:我为Bitbucket Server编写并维护了免费的"Control Freak“插件。
注意:重置和修正永远不会引起狐步舞。通常只有默认的"git pull“会导致foxtrot合并,而"git pull -r”是一个很好的补救方法。"git merge“命令也可能导致这种情况,但在调用"git merge”的典型场景中使用"git merge“时,很少有人会意外创建foxtrot merge。我怀疑99%的时间是"git拉“导致的问题。
https://stackoverflow.com/questions/55155550
复制相似问题