Skip to content
  • Miklos Vajna's avatar
    builtin-commit: use reduce_heads() only when appropriate · cf10f9fd
    Miklos Vajna authored
    Since commit 6bb6b034
    
     (builtin-commit: use commit_tree(), 2008-09-10),
    builtin-commit performs a reduce_heads() unconditionally.  However,
    it's not always needed, and in some cases even harmful.
    
    reduce_heads() is not needed for the initial commit or for an
    "ordinary" commit, because they don't have any or have only one
    parent, respectively.
    
    reduce_heads() must be avoided when 'git commit' is run after a 'git
    merge --no-ff --no-commit', otherwise it will turn the
    non-fast-forward merge into fast-forward.  For the same reason,
    reduce_heads() must be avoided when amending such a merge commit.
    
    To resolve this issue, 'git merge' will write info about whether
    fast-forward is allowed or not to $GIT_DIR/MERGE_MODE.  Based on this
    info, 'git commit' will only perform reduce_heads() when it's
    committing a merge and fast-forward is enabled.
    
    Also add test cases to ensure that non-fast-forward merges are
    committed and amended properly.
    
    Signed-off-by: default avatarMiklos Vajna <vmiklos@frugalware.org>
    Signed-off-by: default avatarSZEDER Gábor <szeder@ira.uka.de>
    Signed-off-by: default avatarShawn O. Pearce <spearce@spearce.org>
    cf10f9fd