Re: [BUG] rebase -p loses commits

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]