Skip to content

Commit 6a887bd

Browse files
committed
Merge branch 'ml/log-merge-with-cherry-pick-and-other-pseudo-heads'
"git log --merge" learned to pay attention to CHERRY_PICK_HEAD and other kinds of *_HEAD pseudorefs. * ml/log-merge-with-cherry-pick-and-other-pseudo-heads: revision: implement `git log --merge` also for rebase/cherry-pick/revert revision: ensure MERGE_HEAD is a ref in prepare_show_merge
2 parents f46a3f1 + f3fc5d9 commit 6a887bd

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

Documentation/rev-list-options.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,8 +341,11 @@ See also linkgit:git-reflog[1].
341341
Under `--pretty=reference`, this information will not be shown at all.
342342

343343
--merge::
344-
After a failed merge, show refs that touch files having a
345-
conflict and don't exist on all heads to merge.
344+
Show commits touching conflicted paths in the range `HEAD...<other>`,
345+
where `<other>` is the first existing pseudoref in `MERGE_HEAD`,
346+
`CHERRY_PICK_HEAD`, `REVERT_HEAD` or `REBASE_HEAD`. Only works
347+
when the index has unmerged entries. This option can be used to show
348+
relevant commits when resolving conflicts from a 3-way merge.
346349

347350
--boundary::
348351
Output excluded boundary commits. Boundary commits are

revision.c

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1970,23 +1970,42 @@ static void add_pending_commit_list(struct rev_info *revs,
19701970
}
19711971
}
19721972

1973+
static const char *lookup_other_head(struct object_id *oid)
1974+
{
1975+
int i;
1976+
static const char *const other_head[] = {
1977+
"MERGE_HEAD", "CHERRY_PICK_HEAD", "REVERT_HEAD", "REBASE_HEAD"
1978+
};
1979+
1980+
for (i = 0; i < ARRAY_SIZE(other_head); i++)
1981+
if (!read_ref_full(other_head[i],
1982+
RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
1983+
oid, NULL)) {
1984+
if (is_null_oid(oid))
1985+
die(_("%s exists but is a symbolic ref"), other_head[i]);
1986+
return other_head[i];
1987+
}
1988+
1989+
die(_("--merge requires one of the pseudorefs MERGE_HEAD, CHERRY_PICK_HEAD, REVERT_HEAD or REBASE_HEAD"));
1990+
}
1991+
19731992
static void prepare_show_merge(struct rev_info *revs)
19741993
{
19751994
struct commit_list *bases;
19761995
struct commit *head, *other;
19771996
struct object_id oid;
1997+
const char *other_name;
19781998
const char **prune = NULL;
19791999
int i, prune_num = 1; /* counting terminating NULL */
19802000
struct index_state *istate = revs->repo->index;
19812001

19822002
if (repo_get_oid(the_repository, "HEAD", &oid))
19832003
die("--merge without HEAD?");
19842004
head = lookup_commit_or_die(&oid, "HEAD");
1985-
if (repo_get_oid(the_repository, "MERGE_HEAD", &oid))
1986-
die("--merge without MERGE_HEAD?");
1987-
other = lookup_commit_or_die(&oid, "MERGE_HEAD");
2005+
other_name = lookup_other_head(&oid);
2006+
other = lookup_commit_or_die(&oid, other_name);
19882007
add_pending_object(revs, &head->object, "HEAD");
1989-
add_pending_object(revs, &other->object, "MERGE_HEAD");
2008+
add_pending_object(revs, &other->object, other_name);
19902009
bases = repo_get_merge_bases(the_repository, head, other);
19912010
add_rev_cmdline_list(revs, bases, REV_CMD_MERGE_BASE, UNINTERESTING | BOTTOM);
19922011
add_pending_commit_list(revs, bases, UNINTERESTING | BOTTOM);

0 commit comments

Comments
 (0)