On Thu, Apr 7, 2011 at 9:53 PM, Nicolas Pitre <nicolas.pi...@linaro.org> wrote:
> On Thu, 7 Apr 2011, Dave Martin wrote:
>
>> The problem seems to be that when a merge is committed, git references
>> the merged commits in their original context: no information is
>> recorded about how the merge was resolved.  The result just appears by
>> magic as the new tree recorded for the merge commit.
>
> you may have a look at the output from "git show <merge_commit_ID>"
> which would show you a combined diff (Git invention) where you can see
> the actual merge resolution if there was a conflict.

Hmmm, sounds interesting ... I haven't tried that.

>
>> This seems to mean that git format-patch x..y (where x is an ancestor
>> of y) does _not_ necessarily give you a patch series which actually
>> applies on x (indeed, the generated patch series may not be appliable
>> on any commit, in any order).  This is certainly my experience.
>
> Indeed. That works well only for a linear set of commits.
>
>> As a result, it seems very difficult to pick apart the history of a
>> branch beyond the last merge commit, because the git repo only records
>> the logical ancestry (i.e., which upstream patches got merged) rather
>> than any "physical" history (i.e., what sequence of actual changes
>> would be needed to reconstruct the branch).  In fact, it seems to be
>> nonsense to think in terms of a sequence of patches beyond a merge
>> commit.
>
> Well, because a Git history is two-dimentional, you cannot always
> recreate it only with a linear sequence of changes

I was coming around to that point of view -- it's nice to have my
understanding confirmed :)

>
>> What I'm actually trying to do is cherry-pick a few omap- and Thumb-
>> specific commits out of the linaro tree to apply on v2.6.39-rc2 --
>> just the minimum subset so that I can develop Thumb stuff on a tree
>> which is as clean and close to upstream as possible.  But I repeatedly
>> run into problems where patch p from branch b depends on
>> cherry-picking some other patch q merged branch b, but the cherry pick
>> fails since the actual delta recorded for q is in the context of
>> someone else's branch (the branch that was merged from).
>>
>> If anyone knows a straightforward way to achieve this, I'd be interested ...
>
> What I'd do is (assuming there is already a separate branch with
> v2.6.39-rc2 available):
>
> 1) Find the latest commit ID you are interested in, and create a
>   temporary branch with it:
>
>        git branch tmp_branch <commit_ID>
>        git checkout tmp_branch
>
>   or if you prefer a shortcut:
>
>        git checkout -b tmp_branch <commit_ID>
>
> 2) Find the oldest commit you are interested in, and use it with
>   interactive rebase:
>
>        git rebase -i --onto v2.6.39-rc2 <old_commit_ID>^
>
>   Note the ^ here meaning the parent of the commit.  Here you should
>   specify the starting point which is always exclusive, hence with ^
>   you make it inclusive.

I'll try that -- I've not used interactive rebase much, though I guess
it can be smarter than just applying patches since git knows about the
ancestry.

>
> 3) In the editor that pops up, discard all the lines corresponding to
>   those commits you are not interested in bringing forward.  If you
>   don't know if a wanted commit is already present in v2.6.39-rc2 then
>   just keep it in the list -- in most cases Git is able to figure it
>   out automatically.  Then save the file and watch Git go.
>
> 4) If patch application problems occur, you then have the option of
>   manually fixing it, or using 'git mergetool' to help you out.  When
>   done just go on with 'git rebase --continue'.  Or you may skip a
>   problematic patch with 'git rebase --skip'.
>
> 5) Rename your tmp_branch into something more meaningful, or simply
>   discard it if you're not satisfied with the result.
>
> That's it.  Of course, if you're looking for only a few commits then it
> is probably quicker to go with 'git cherry-pick' on each of them
> instead.

Indeed -- that's worked for me for simpler cases in the past; that's
one reason why my understanding of the actual problem here was a bit
patchy.

Thanks for the advice
---Dave

_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to