Jeff King <peff@xxxxxxxx> writes: > I was trying to reproduce somebody's issue with a minimal test case, and > I ran across this setup wherein "rebase -p" silently drops some commits: > > commit() { > echo $1 >file && git add file && git commit -m $1 > } > > # repo with two branches, each with conflicting content > git init repo && cd repo && > commit base && > commit master && > git checkout -b feature HEAD^ && > commit feature && > > # now merge them, with some fake resolution > ! git merge master && > commit resolved && > > # now try to "rebase -p" on top of master. > git rebase -p master Hmm, I am confused. You have this: F---* feature / / B---M master and you are at "*". If it were to rebase to linearize, B---M---F' with F' that has the same the contents as '*', possibly autoresolved by "am -3" and/or "rerere", should be what you would get. But what does it mean to rebase that on top of master, preserving merges in the first place? You are already on top of 'master' and '*' itself should be what you should get, no? IOW, shouldn't you already be up-to-date? > I'm totally unfamiliar with the preserve-merges code, and I won't have > time to dig further until later today or tomorrow, so I thought I'd > throw it out here and see if anybody has any clues. I don't use preserve-merge rebase either, but at least when you are strictly ahead of the target, nothing should happen, I think. Perhaps this should be a good start? git-rebase.sh | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) diff --git a/git-rebase.sh b/git-rebase.sh index 7a54bfc..2be10d6 100755 --- a/git-rebase.sh +++ b/git-rebase.sh @@ -466,10 +466,13 @@ require_clean_work_tree "rebase" "Please commit or stash them." # but this should be done only when upstream and onto are the same # and if this is not an interactive rebase. mb=$(git merge-base "$onto" "$orig_head") -if test "$type" != interactive && test "$upstream" = "$onto" && - test "$mb" = "$onto" && - # linear history? - ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null +if test "$upstream" = "$onto" && test "$mb" = "$onto" && { + { + test "$type" != interactive && + # linear history? + ! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null + } || test t,implied = "$preserve_merges,$interactive_rebase" + } then if test -z "$force_rebase" then -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html