自创建以来,我有一个包含许多提交的分支,并且希望使用单个提交进行单个合并提交以将其移回主控。所以我知道的唯一解决方案是使用git merge --squash branchname
. 这很好用,但是如果有人添加了更多提交branchname
并且我再次将其合并到 master 中,我会从branchname
. 如何防止合并冲突,同时仍然只master
为每次合并保留一个提交?我已经研究过使用git merge --no-ff
,但这仍然会将所有提交branchname
从master
.
1 回答
echo $(git rev-parse $result $result^ $merged) > .git/info/grafts
git merge topic
$result
壁球合并产生的提交在哪里,并且$merged
是您合并的提交(即给定git checkout master; git merge topic
,$result
在master
合并之后,并且$merged
在topic
合并之后)。
该info/grafts
文件包含临时的、repo-local 祖先覆盖。上面的 echo 仅在此 repo 中记录了 squash 合并的结果也将 squash-merged 提交作为其父项 - 即它记录了准确的合并历史记录。未记录的合并仅在两个分支的后续合并仍然以相同方式看到合并的更改时才起作用。
不要忘记 rebase 和 filter-branch 也会看到嫁接的祖先,如果他们重写$result
提交,他们将在新提交中记录该祖先。
合并功能分支当然很常见,但不记录它并不常见,因为这使得 git(或任何 vcs)不可能总是找到正确的合并基础。许多未记录的合并在历史上根本没有正确的合并基础,您必须制作一个以便以后获得良好的合并。Cherry-picks 和 squash 合并是很棒的,只要在进一步的修改掩盖匹配的变化之前,技术债务是由记录的合并支付的。
如果你合并的历史很丑陋,你会喜欢交互式变基。如果您一开始就有远见,它可以让您创建您会创建的提交历史记录。在许多项目中清理更改以进行发布是工作流程的基本部分。