learn to pick/revert into unborn branch
cherry-picking into an unborn branch should work, so make it work, with or without --ff. Cherry-picking anything other than a commit that only adds files, will naturally result in conflicts. Similarly, revert also works, but will result in conflicts unless the specified revision only deletes files. Signed-off-by: Martin von Zweigbergk <martinvonz@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
5d77298d08
commit
334ae39745
20
sequencer.c
20
sequencer.c
@ -186,14 +186,15 @@ static int error_dirty_index(struct replay_opts *opts)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fast_forward_to(const unsigned char *to, const unsigned char *from)
|
static int fast_forward_to(const unsigned char *to, const unsigned char *from,
|
||||||
|
int unborn)
|
||||||
{
|
{
|
||||||
struct ref_lock *ref_lock;
|
struct ref_lock *ref_lock;
|
||||||
|
|
||||||
read_cache();
|
read_cache();
|
||||||
if (checkout_fast_forward(from, to, 1))
|
if (checkout_fast_forward(from, to, 1))
|
||||||
exit(1); /* the callee should have complained already */
|
exit(1); /* the callee should have complained already */
|
||||||
ref_lock = lock_any_ref_for_update("HEAD", from, 0);
|
ref_lock = lock_any_ref_for_update("HEAD", unborn ? null_sha1 : from, 0);
|
||||||
return write_ref_sha1(ref_lock, to, "cherry-pick");
|
return write_ref_sha1(ref_lock, to, "cherry-pick");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -390,7 +391,7 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
|
|||||||
struct commit_message msg = { NULL, NULL, NULL, NULL, NULL };
|
struct commit_message msg = { NULL, NULL, NULL, NULL, NULL };
|
||||||
char *defmsg = NULL;
|
char *defmsg = NULL;
|
||||||
struct strbuf msgbuf = STRBUF_INIT;
|
struct strbuf msgbuf = STRBUF_INIT;
|
||||||
int res;
|
int res, unborn = 0;
|
||||||
|
|
||||||
if (opts->no_commit) {
|
if (opts->no_commit) {
|
||||||
/*
|
/*
|
||||||
@ -402,9 +403,10 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
|
|||||||
if (write_cache_as_tree(head, 0, NULL))
|
if (write_cache_as_tree(head, 0, NULL))
|
||||||
die (_("Your index file is unmerged."));
|
die (_("Your index file is unmerged."));
|
||||||
} else {
|
} else {
|
||||||
if (get_sha1("HEAD", head))
|
unborn = get_sha1("HEAD", head);
|
||||||
return error(_("You do not have a valid HEAD"));
|
if (unborn)
|
||||||
if (index_differs_from("HEAD", 0))
|
hashcpy(head, EMPTY_TREE_SHA1_BIN);
|
||||||
|
if (index_differs_from(unborn ? EMPTY_TREE_SHA1_HEX : "HEAD", 0))
|
||||||
return error_dirty_index(opts);
|
return error_dirty_index(opts);
|
||||||
}
|
}
|
||||||
discard_cache();
|
discard_cache();
|
||||||
@ -435,8 +437,10 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
|
|||||||
else
|
else
|
||||||
parent = commit->parents->item;
|
parent = commit->parents->item;
|
||||||
|
|
||||||
if (opts->allow_ff && parent && !hashcmp(parent->object.sha1, head))
|
if (opts->allow_ff &&
|
||||||
return fast_forward_to(commit->object.sha1, head);
|
((parent && !hashcmp(parent->object.sha1, head)) ||
|
||||||
|
(!parent && unborn)))
|
||||||
|
return fast_forward_to(commit->object.sha1, head, unborn);
|
||||||
|
|
||||||
if (parent && parse_commit(parent) < 0)
|
if (parent && parse_commit(parent) < 0)
|
||||||
/* TRANSLATORS: The first %s will be "revert" or
|
/* TRANSLATORS: The first %s will be "revert" or
|
||||||
|
@ -100,4 +100,13 @@ test_expect_success 'revert forbidden on dirty working tree' '
|
|||||||
|
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'chery-pick on unborn branch' '
|
||||||
|
git checkout --orphan unborn &&
|
||||||
|
git rm --cached -r . &&
|
||||||
|
rm -rf * &&
|
||||||
|
git cherry-pick initial &&
|
||||||
|
git diff --quiet initial &&
|
||||||
|
! test_cmp_rev initial HEAD
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -105,4 +105,12 @@ test_expect_success 'cherry pick a root commit with --ff' '
|
|||||||
test "$(git rev-parse --verify HEAD)" = "1df192cd8bc58a2b275d842cede4d221ad9000d1"
|
test "$(git rev-parse --verify HEAD)" = "1df192cd8bc58a2b275d842cede4d221ad9000d1"
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'chery-pick --ff on unborn branch' '
|
||||||
|
git checkout --orphan unborn &&
|
||||||
|
git rm --cached -r . &&
|
||||||
|
rm -rf * &&
|
||||||
|
git cherry-pick --ff first &&
|
||||||
|
test_cmp_rev first HEAD
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user