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

[PATCH] git-commit --amend: respect grafted parents.

From
Johannes Sixt <johannes.sixt@telecom.at>
Date
Sep 26, 2007, 12:11 UTC
Message-ID
<11908086961933-git-send-email-johannes.sixt@telecom.at>
This allows a poor-mans-filter-branch of the top-most commit.
Specifically, I had this history:
   --o--o--A'    <-- amended version of A
         \
          A
           \
    --o--B--M

I now wanted to "amend" M to pull in A' instead of A as its second parent. For various reasons I didn't want to redo the merge M again, in particular, it already contained the changes that were amended into A'. So I figured I would just install a graft that lists B and A' as parents of M and then do a simple git commit --amend. Alas, git commit looks at the real parents instead of the grafted ones, so the amended M' would still have A as its second parent. Here is the fix that picks the grafted parents instead.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
---
  I know that git-commit is becoming a builtin. At the least, here is
  a test that makes sure that the behavior is remains.
  -- Hannes
 git-commit.sh     |    4 ++--
 t/t7501-commit.sh |    9 +++++++++
 2 files changed, 11 insertions(+), 2 deletions(-)
 mode change 100644 => 100755 t/t7501-commit.sh
diff --git a/git-commit.sh b/git-commit.sh
index 7a7a2cb..33e7503 100755
--- a/git-commit.sh
+++ b/git-commit.sh
@@ -529,8 +529,8 @@ then
 		PARENTS="-p HEAD "`sed -e 's/^/-p /' "$GIT_DIR/MERGE_HEAD"`
 	elif test -n "$amend"; then
 		rloga='commit (amend)'
-		PARENTS=$(git cat-file commit HEAD |
-			sed -n -e '/^$/q' -e 's/^parent /-p /p')
+		PARENTS=$(git rev-list --parents -1 HEAD |
+			sed -e 's/^[^ ]*//' -e 's/ / -p /g')
 	fi
 	current="$(git rev-parse --verify HEAD)"
 else
diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh
old mode 100644
new mode 100755
index b151b51..09c0d98
--- a/t/t7501-commit.sh
+++ b/t/t7501-commit.sh
@@ -163,4 +163,13 @@ test_expect_success 'partial commit that involves removal (3)' '
 
 '
 
+test_expect_success '--amend respects grafts' '
+
+	grandparent=$(git rev-parse HEAD~2) &&
+	echo $(git rev-parse HEAD) $grandparent > .git/info/grafts &&
+	git commit --amend -C HEAD &&
+	test "parent $grandparent" = "$(git cat-file commit HEAD | grep "^parent")"
+
+'
+
 test_done
-- 
1.5.3.3.gcc9e
Next: Johannes Schindelin
Message 1 of 8 in “git-commit --amend: respect grafted parents.”
  1. git-commit --amend: respect grafted parents.Johannes Sixt, Sep 26, 2007
  2. Johannes SchindelinSep 26, 2007
  3. Johannes SixtSep 26, 2007
  4. Johannes SchindelinSep 26, 2007
  5. Johannes SixtSep 26, 2007
  6. Junio C HamanoSep 26, 2007
  7. Johannes SchindelinSep 26, 2007
  8. David KastrupSep 27, 2007

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.