我正在使用两个分支,master
和newFeature
。在构建“新功能”时,我向newFeature
分支添加了多个提交。我对git merge
的理解是,一旦合并分支,它将在master
上创建单个提交,但是当合并时,master
现在具有完整的提交历史记录在newFeature
上。例如 -
master (pre-merge):
1=>2=>3
newVersion:
1=>2=>3=>4=>5=>6
master (actual results of merge):
1=>2=>3=>4=>5=>6
master (expected results of merge):
1=>2=>3=>6
有没有办法在合并期间从newVersion
删除中间提交,为什么合并不按预期工作?
答案 0 :(得分:5)
此处需要注意的一点是,在master
的整个工作过程中,未对newVersion
进行任何更改。在这些情况下,Git默认为“快进”合并,基本上可以将其视为从newVersion
获取所有新提交并将其附加到master
上的最新提交(其中不会分隔在newVersion
上完成的提交历史记录。这可以使用--no-ff
标记覆盖,例如:
git merge newVersion --no-ff
结果:
master (pre-merge):
1=>2=>3
newVersion:
1=>2=>3=>4=>5=>6
master (actual results of merge):
1=>2=>3=========>7
4=>5=>6
请注意,commit 7 表示合并,并且不替换提交历史记录。
参考:https://sandofsky.com/images/fast_forward.pdf
或者,如果您希望将newVersion
的整个提交历史记录合并到master
上的单个提交中(如果它们在“新版本”的整个过程中只是次要提交,则可能很有用) )您可以使用--squash
标志运行合并。例如:
git merge --squash newVersion
结果:
master (pre-merge):
1=>2=>3
newVersion:
1=>2=>3=>4=>5=>6
master (actual results of merge):
1=>2=>3=>7
请注意,7合并了在提交4 - 6
中完成的提交历史记录答案 1 :(得分:0)
不可能有一个看起来像你想要的最终历史。 git中的每个提交都与其父级绑定。每个提交都包含对其父级的引用,因此6显式引用5。
如果您确实只想 ,则可以在1=>2=>3
之上添加5到6之间的更改,然后您可以使用git cherry-pick newFeature
。这将创建一个 new 提交,其中只有5到6之间的更改,但应用于3之上。
如果您想要从4,5和6进行所有更改,但只需要一次提交,则可以使用--squash
标记git merge
。这将创建一个 new 提交,其中包含4,5和6中的所有更改。但是,您的历史记录不会是1=>2=>3=>6
,而是1=>2=>3=>7
其中7是此新提交。
请注意,如果您选择--squash
选项,则每个分支只能执行一次,因为通过压缩,您将丢失有关内容的信息两个分支之间有所不同。