git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 2/2] Teach @{-1} to git merge

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 14, 2009, 09:39 UTC
Message-ID
<7vskmhuzla.fsf_-_@gitster.siamese.dyndns.org>
In-Reply-To
<7vzlgpxz4g.fsf@gitster.siamese.dyndns.org>

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>
---
 * I know "show-branch @{-1} HEAD" does not dereference @{-1}, but I
   suspect there may be many others.
 builtin-merge.c     |   15 ++++++++++++---
 t/t0100-previous.sh |   23 +++++++++++++++++++++++
 2 files changed, 35 insertions(+), 3 deletions(-)
diff --git a/builtin-merge.c b/builtin-merge.c
index 885fad9..6d2160d 100644
--- a/builtin-merge.c
+++ b/builtin-merge.c
@@ -356,9 +356,14 @@ static void merge_name(const char *remote, struct strbuf *msg)
 	struct object *remote_head;
 	unsigned char branch_head[20], buf_sha[20];
 	struct strbuf buf = STRBUF_INIT;
+	struct strbuf bname = STRBUF_INIT;
 	const char *ptr;
 	int len, early;
 
+	len = strlen(remote);
+	if (interpret_nth_last_branch(remote, &bname) == len)
+		remote = bname.buf;
+
 	memset(branch_head, 0, sizeof(branch_head));
 	remote_head = peel_to_type(remote, 0, NULL, OBJ_COMMIT);
 	if (!remote_head)
@@ -371,7 +376,7 @@ static void merge_name(const char *remote, struct strbuf *msg)
 	if (!hashcmp(remote_head->sha1, branch_head)) {
 		strbuf_addf(msg, "%s\t\tbranch '%s' of .\n",
 			sha1_to_hex(branch_head), remote);
-		return;
+		goto cleanup;
 	}
 
 	/* 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),
 				    truname.buf + 11,
 				    (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_addbuf(msg, &line);
 		strbuf_release(&line);
-		return;
+		goto cleanup;
 	}
 	strbuf_addf(msg, "%s\t\tcommit '%s'\n",
 		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)
diff --git a/t/t0100-previous.sh b/t/t0100-previous.sh
index db51b42..315b9b3 100755
--- a/t/t0100-previous.sh
+++ b/t/t0100-previous.sh
@@ -22,5 +22,28 @@ test_expect_success 'branch -d @{-12} when there is not enough switches yet' '
 	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
 
-- 
1.6.2.rc0.80.ge11dd
Previous: Junio C HamanoNext: Johannes Schindelin
Message 5 of 21 in “teach the new "@{-1} syntax to "git branch"”
  1. teach the new "@{-1} syntax to "git branch"Junio C Hamano, Feb 14, 2009
  2. Jay SoffianFeb 14, 2009
  3. Junio C HamanoFeb 14, 2009
  4. 1/2 Teach the "@{-1} syntax to "git branch"Junio C Hamano, Feb 14, 2009
  5. 2/2 Teach @{-1} to git mergeJunio C Hamano, Feb 14, 2009
  6. Johannes SchindelinFeb 14, 2009
  7. Junio C HamanoFeb 15, 2009
  8. Junio C HamanoFeb 15, 2009
  9. Nanako ShiraishiFeb 15, 2009
  10. Junio C HamanoFeb 15, 2009
  11. Johannes SchindelinFeb 15, 2009
  12. Junio C HamanoFeb 16, 2009
  13. Johannes SchindelinFeb 16, 2009
  14. Jay SoffianFeb 16, 2009
  15. Junio C HamanoFeb 26, 2009
  16. Johannes SchindelinFeb 26, 2009
  17. Deskin MillerFeb 27, 2009
  18. Junio C HamanoFeb 27, 2009
  19. git-branch: a detached HEAD and branch called HEAD are differentJunio C Hamano, Feb 27, 2009
  20. "git branch -M @{-1}"Junio C Hamano, Feb 27, 2009
  21. Junio C HamanoFeb 27, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.