Teach @{-1} to git merge
1.6.2 will have @{-1} syntax advertised as "usable anywhere you can use a branch name". However, "git merge @{-1}" did not work. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
8415d5c7ef
commit
c9717ee970
@ -356,9 +356,14 @@ static void merge_name(const char *remote, struct strbuf *msg)
|
|||||||
struct object *remote_head;
|
struct object *remote_head;
|
||||||
unsigned char branch_head[20], buf_sha[20];
|
unsigned char branch_head[20], buf_sha[20];
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
|
struct strbuf bname = STRBUF_INIT;
|
||||||
const char *ptr;
|
const char *ptr;
|
||||||
int len, early;
|
int len, early;
|
||||||
|
|
||||||
|
len = strlen(remote);
|
||||||
|
if (interpret_nth_last_branch(remote, &bname) == len)
|
||||||
|
remote = bname.buf;
|
||||||
|
|
||||||
memset(branch_head, 0, sizeof(branch_head));
|
memset(branch_head, 0, sizeof(branch_head));
|
||||||
remote_head = peel_to_type(remote, 0, NULL, OBJ_COMMIT);
|
remote_head = peel_to_type(remote, 0, NULL, OBJ_COMMIT);
|
||||||
if (!remote_head)
|
if (!remote_head)
|
||||||
@ -371,7 +376,7 @@ static void merge_name(const char *remote, struct strbuf *msg)
|
|||||||
if (!hashcmp(remote_head->sha1, branch_head)) {
|
if (!hashcmp(remote_head->sha1, branch_head)) {
|
||||||
strbuf_addf(msg, "%s\t\tbranch '%s' of .\n",
|
strbuf_addf(msg, "%s\t\tbranch '%s' of .\n",
|
||||||
sha1_to_hex(branch_head), remote);
|
sha1_to_hex(branch_head), remote);
|
||||||
return;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See if remote matches <name>^^^.. or <name>~<number> */
|
/* See if remote matches <name>^^^.. or <name>~<number> */
|
||||||
@ -411,7 +416,8 @@ static void merge_name(const char *remote, struct strbuf *msg)
|
|||||||
sha1_to_hex(remote_head->sha1),
|
sha1_to_hex(remote_head->sha1),
|
||||||
truname.buf + 11,
|
truname.buf + 11,
|
||||||
(early ? " (early part)" : ""));
|
(early ? " (early part)" : ""));
|
||||||
return;
|
strbuf_release(&truname);
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -432,10 +438,13 @@ static void merge_name(const char *remote, struct strbuf *msg)
|
|||||||
strbuf_remove(&line, ptr-line.buf+1, 13);
|
strbuf_remove(&line, ptr-line.buf+1, 13);
|
||||||
strbuf_addbuf(msg, &line);
|
strbuf_addbuf(msg, &line);
|
||||||
strbuf_release(&line);
|
strbuf_release(&line);
|
||||||
return;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
strbuf_addf(msg, "%s\t\tcommit '%s'\n",
|
strbuf_addf(msg, "%s\t\tcommit '%s'\n",
|
||||||
sha1_to_hex(remote_head->sha1), remote);
|
sha1_to_hex(remote_head->sha1), remote);
|
||||||
|
cleanup:
|
||||||
|
strbuf_release(&buf);
|
||||||
|
strbuf_release(&bname);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int git_merge_config(const char *k, const char *v, void *cb)
|
static int git_merge_config(const char *k, const char *v, void *cb)
|
||||||
|
@ -22,5 +22,28 @@ test_expect_success 'branch -d @{-12} when there is not enough switches yet' '
|
|||||||
git rev-parse --verify refs/heads/master
|
git rev-parse --verify refs/heads/master
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'merge @{-1}' '
|
||||||
|
git checkout A &&
|
||||||
|
test_commit B &&
|
||||||
|
git checkout A &&
|
||||||
|
test_commit C &&
|
||||||
|
git branch -f master B &&
|
||||||
|
git branch -f other &&
|
||||||
|
git checkout other &&
|
||||||
|
git checkout master &&
|
||||||
|
git merge @{-1} &&
|
||||||
|
git cat-file commit HEAD | grep "Merge branch '\''other'\''"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'merge @{-1} when there is not enough switches yet' '
|
||||||
|
git reflog expire --expire=now &&
|
||||||
|
git checkout -f master &&
|
||||||
|
git reset --hard B &&
|
||||||
|
git branch -f other C &&
|
||||||
|
git checkout other &&
|
||||||
|
git checkout master &&
|
||||||
|
test_must_fail git merge @{-12}
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user