为什么Git合并在master分支上创建多个提交?

时间:2017-07-18 21:47:00

标签: git version-control merge git-commit

我正在使用两个分支,masternewFeature。在构建“新功能”时,我向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删除中间提交,为什么合并不按预期工作?

2 个答案:

答案 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选项,则每个分支只能执行一次,因为通过压缩,您将丢失有关内容的信息两个分支之间有所不同。