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

ili*_*ode 1 git version-control merge git-commit

我正在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
Run Code Online (Sandbox Code Playgroud)

有没有办法newVersion在合并期间删除中间提交,为什么合并不按预期工作?

ili*_*ode 5

这里要注意的关键是,master整个工作过程中没有任何变化newVersion.在这些情况下,Git默认为"快进"合并,基本上可以将其视为从所有新提交中获取newVersion并将它们附加到最近的提交master(这不会分离在上面执行的提交历史记录)newVersion).这可以用--no-ff标志覆盖,例如:

git merge newVersion --no-ff
Run Code Online (Sandbox Code Playgroud)

结果是:

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
Run Code Online (Sandbox Code Playgroud)

请注意,commit 7 表示合并,并不替换提交历史记录.

参考:https://sandofsky.com/images/fast_forward.pdf

或者,如果您希望将整个提交历史合并newVersion到单个提交中master(如果它们只是在"新版本"的整个过程中只是次要提交,则可能很有用),您可以使用--squash标志运行合并.例如:

git merge --squash newVersion
Run Code Online (Sandbox Code Playgroud)

结果是:

master (pre-merge):

    1=>2=>3

newVersion:

    1=>2=>3=>4=>5=>6

master (actual results of merge):

    1=>2=>3=>7
Run Code Online (Sandbox Code Playgroud)

请注意,7合并了在提交4 - 6中完成的提交历史记录

  • 这不是`--no-ff`的作用.使用`--no-ff`的历史记录看起来像`1 => 2 => 3 => 4 => 5 => 6 => 7`其中`7`是合并提交.所有快进合并都会避免创建合并提交. (2认同)