From: Johan Herland Date: Fri, 11 Feb 2011 11:40:29 GMT Subject: Re: Using Origin hashes to improve rebase behavior Message-ID: <201102111240.29746.johan@herland.net> In-Reply-To: On Friday 11 February 2011, skillzero@gmail.com wrote: > On Thu, Feb 10, 2011 at 1:13 PM, John Wiegley wrote: > > a b c 3' d e* f > > o---o---o---o---o---o---o > > \ > > o---o---o---o > > 1 2 3 4 > > > > At a later date, I want to rebase the private branch onto master. What > > will happen is that the changes in 3 will conflict with the rewritten > > changes in e*. However, I'd like Git to know that 3 was already > > incorporated at some earlier time, and *not consider it during the > > rebase*, since it doesn't need to. > > I don't know very much about how git really works so what I'm saying > may be dumb, but rather than record where a commit came from, would it > be reasonable for rebase to look at the patch-id for each change on > the topic branch after the merge base and automatically remove topic > branch commits that match that patch-id? So in your example, rebase > would check each topic branch commit against 3', d, e*, and f and see > that the 3' patch-id is the same as the topic branch 3 and remove > topic branch 3 before it gets to e*? I believe "git rebase" already does exactly what you describe [1]. However, comparing patch-ids stops working when the cherry-pick (3 -> 3') has conflicts. IINM, it is the conflicting cases that John is interested in solving... ...Johan [1]: I tested the above scenario, and got no conflicts: $ git init $ FOO=a && echo $FOO > $FOO && git add $FOO && git commit -m $FOO $ FOO=b && echo $FOO > $FOO && git add $FOO && git commit -m $FOO $ FOO=c && echo $FOO > $FOO && git add $FOO && git commit -m $FOO $ git checkout -b topic $ FOO=1 && echo $FOO > $FOO && git add $FOO && git commit -m $FOO $ FOO=2 && echo $FOO > $FOO && git add $FOO && git commit -m $FOO $ FOO=3 && echo $FOO > $FOO && git add $FOO && git commit -m $FOO $ FOO=4 && echo $FOO > $FOO && git add $FOO && git commit -m $FOO $ git checkout master $ git cherry-pick topic^ $ FOO=d && echo $FOO > $FOO && git add $FOO && git commit -m $FOO $ echo e >> 3 && git add 3 $ FOO=e && echo $FOO > $FOO && git add $FOO && git commit -m $FOO $ FOO=f && echo $FOO > $FOO && git add $FOO && git commit -m $FOO $ git checkout topic $ git rebase master First, rewinding head to replay your work on top of it... Applying: 1 Applying: 2 Applying: 4 $ # Look, no conflicts. -- Johan Herland, www.herland.net