Thomas Rast <tr...@inf.ethz.ch> writes:
> The reflog walking logic (git log -g) replaces the true parent list
> with the preceding commit in the reflog. This results in bogus commit
> diffs when combined with options such as -p; the diff is against the
> reflog predecessor, not the parent of the commit.
> Save the true parents on the side, extending the functions from the
> previous commit. The diff logic picks them up and uses them to show
> the correct diffs.
> We do have to be somewhat careful about repeated calling of
> save_parents(), since the reflog may list a commit more than once. We
> now store (commit_list*)-1 to distinguish the "not saved yet" and
> "root commit" cases. This lets us preserve an empty parent list even
> if save_parents() is repeatedly called.
> Suggested-by: Jeff King <p...@peff.net>
> Signed-off-by: Thomas Rast <tr...@inf.ethz.ch>
> Jeff King <p...@peff.net> wrote:
>> Your description (and solution) make a lot of sense to me. Another code
>> path that has a similar problem is the "-g" reflog walker. It rewrites
>> the parents based on the reflog, and the diffs it produces are mostly
>> useless (e.g., try "git stash list -p").
>> Should we be applying the same technique there?
> Good point. This is how. It applies on top of the other patch.
> It doesn't really help for 'git stash list -p', though, because
> stashes are merge commits. Now they just don't show anything.
> could try 'git stash list -p -m', though.
Using --first-parent may be more convenient and useful.
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html