Skip to content

Commit

Permalink
checkout (detached): truncate list of orphaned commits at the new HEAD
Browse files Browse the repository at this point in the history
When git checkout switches from a detached HEAD to any other commit, then
all orphaned commits were listed in a warning:

  Warning: you are leaving 2 commits behind...:

    a5e5396 another fixup
    6aa1af6 fixup foo

But if the new commit is actually one from this list (6aa1af6 in this
example), then the list in the warning can be truncated at the new HEAD,
because history beginning at HEAD is not "left behind". This makes it so.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Johannes Sixt authored and Junio C Hamano committed May 4, 2012
1 parent f949209 commit 5d88639
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 7 deletions.
13 changes: 7 additions & 6 deletions builtin/checkout.c
Original file line number Diff line number Diff line change
Expand Up @@ -671,10 +671,10 @@ static void suggest_reattach(struct commit *commit, struct rev_info *revs)
* HEAD. If it is not reachable from any ref, this is the last chance
* for the user to do so without resorting to reflog.
*/
static void orphaned_commit_warning(struct commit *commit)
static void orphaned_commit_warning(struct commit *old, struct commit *new)
{
struct rev_info revs;
struct object *object = &commit->object;
struct object *object = &old->object;
struct object_array refs;

init_revisions(&revs, NULL);
Expand All @@ -684,16 +684,17 @@ static void orphaned_commit_warning(struct commit *commit)
add_pending_object(&revs, object, sha1_to_hex(object->sha1));

for_each_ref(add_pending_uninteresting_ref, &revs);
add_pending_sha1(&revs, "HEAD", new->object.sha1, UNINTERESTING);

refs = revs.pending;
revs.leak_pending = 1;

if (prepare_revision_walk(&revs))
die(_("internal error in revision walk"));
if (!(commit->object.flags & UNINTERESTING))
suggest_reattach(commit, &revs);
if (!(old->object.flags & UNINTERESTING))
suggest_reattach(old, &revs);
else
describe_detached_head(_("Previous HEAD position was"), commit);
describe_detached_head(_("Previous HEAD position was"), old);

clear_commit_marks_for_object_array(&refs, ALL_REV_FLAGS);
free(refs.objects);
Expand Down Expand Up @@ -730,7 +731,7 @@ static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
}

if (!opts->quiet && !old.path && old.commit && new->commit != old.commit)
orphaned_commit_warning(old.commit);
orphaned_commit_warning(old.commit, new->commit);

update_refs_for_switch(opts, &old, new);

Expand Down
2 changes: 1 addition & 1 deletion t/t2020-checkout-detach.sh
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ test_expect_success 'checkout warns orphaning 1 of 2 commits' '
'

test_expect_success 'checkout warns orphaning 1 of 2 commits: output' '
check_orphan_warning stderr "2 commits"
check_orphan_warning stderr "1 commit"
'

test_expect_success 'checkout does not warn leaving ref tip' '
Expand Down

0 comments on commit 5d88639

Please sign in to comment.