rebase --preserve-merges: keep all merge commits including empty ones

Since 90e1818f9a (git-rebase: add keep_empty flag, 2012-04-20) 'git rebase --preserve-merges' fails to preserve empty merge commits unless --keep-empty is also specified. Merge commits should be preserved in order to preserve the structure of the rebased graph, even if the merge commit does not introduce changes to the parent. Teach rebase not to drop merge commits only because they are empty. A special case which is not handled by this change is for a merge commit whose parents are now the same commit because all the previous different parents have been dropped as a result of this rebase or some previous operation. Signed-off-by: Phil Hord <hordp@cisco.com> Acked-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Phil Hord committed Jan 12, 2013 at 15:46 UTC 986977847e6fb46448fc9c567292ccd2a93d40b3
1 file changed +6 -1
git-rebase--interactive.sh
+6 -1
@@ -175,6 +175,11 @@ is_empty_commit() {
175 test "$tree" = "$ptree"
176 }
177
178 +is_merge_commit()
179 +{
180 + git rev-parse --verify --quiet "$1"^2 >/dev/null 2>&1
181 +}
182 +
183 # Run command with GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
184 # GIT_AUTHOR_DATE exported from the current environment.
185 do_with_author () {
@@ -796,7 +801,7 @@ git rev-list $merges_option --pretty=oneline --abbrev-commit \
801 while read -r shortsha1 rest
802 do
803
799 - if test -z "$keep_empty" && is_empty_commit $shortsha1
804 + if test -z "$keep_empty" && is_empty_commit $shortsha1 && ! is_merge_commit $shortsha1
805 then
806 comment_out="# "
807 else