builtin-commit: use reduce_heads() only when appropriate
authorMiklos Vajna <vmiklos@frugalware.org>
Fri, 3 Oct 2008 12:04:47 +0000 (14:04 +0200)
committerShawn O. Pearce <spearce@spearce.org>
Fri, 3 Oct 2008 15:18:45 +0000 (08:18 -0700)
commitcf10f9fdd5e673a163847f0e931ce9731507e03b
tree16f66fce8188e900ae2c995ea62412e8671a3dd7
parent52e8370bc7a71366b664ece0a9ec0b79d673a356
builtin-commit: use reduce_heads() only when appropriate

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: Miklos Vajna <vmiklos@frugalware.org>
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
branch.c
builtin-commit.c
builtin-merge.c
t/t7600-merge.sh