使用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,被归入合并后的内容。
https://stackoverflow.com/questions/55155550
复制相似问题