From f5b49ea6191c2d631d1d70305b25d5db3bf05c92 Mon Sep 17 00:00:00 2001 From: Johannes Sixt Date: Mon, 15 Dec 2008 11:05:31 +0100 Subject: rebase -i -p: Fix --continue after a merge could not be redone When a merge that has a conflict was rebased, then rebase stopped to let the user resolve the conflicts. However, thereafter --continue failed because the author-script was not saved. (This is rebase -i's way to preserve a commit's authorship.) This fixes it by doing taking the same failure route after a merge that is also taken after a normal cherry-pick. Signed-off-by: Johannes Sixt Signed-off-by: Junio C Hamano --- git-rebase--interactive.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'git-rebase--interactive.sh') diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 1172e47571..89c39ebc9d 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -256,9 +256,8 @@ pick_one_preserving_merges () { output git merge $STRATEGY -m "$msg" \ $new_parents then - git rerere printf "%s\n" "$msg" > "$GIT_DIR"/MERGE_MSG - die Error redoing merge $sha1 + die_with_patch $sha1 "Error redoing merge $sha1" fi ;; *) -- cgit v1.3-5-g9baa From 4fb1a19d502f4a2ca47bfb75cce605f3447819e6 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Mon, 22 Dec 2008 22:16:51 +0100 Subject: rebase -i -p: leave a --cc patch when a merge could not be redone The result is easier to review this way, and the merge resolution has to be done inside the work tree, not by adjusting "the patch" anyway. --- git-rebase--interactive.sh | 15 ++++++++++++--- t/t3409-rebase-preserve-merges.sh | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) (limited to 'git-rebase--interactive.sh') diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 89c39ebc9d..c8b0861c08 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -115,9 +115,18 @@ mark_action_done () { } make_patch () { - parent_sha1=$(git rev-parse --verify "$1"^) || - die "Cannot get patch for $1^" - git diff-tree -p "$parent_sha1".."$1" > "$DOTEST"/patch + sha1_and_parents="$(git rev-list --parents -1 "$1")" + case "$sha1_and_parents" in + ?*' '?*' '?*) + git diff --cc $sha1_and_parents + ;; + ?*' '?*) + git diff-tree -p "$1^!" + ;; + *) + echo "Root commit" + ;; + esac > "$DOTEST"/patch test -f "$DOTEST"/message || git cat-file commit "$1" | sed "1,/^$/d" > "$DOTEST"/message test -f "$DOTEST"/author-script || diff --git a/t/t3409-rebase-preserve-merges.sh b/t/t3409-rebase-preserve-merges.sh index 820e0105d2..e6c832780f 100755 --- a/t/t3409-rebase-preserve-merges.sh +++ b/t/t3409-rebase-preserve-merges.sh @@ -83,6 +83,7 @@ test_expect_success '--continue works after a conflict' ' test 2 = $(git ls-files B | wc -l) && echo Resolved again > B && test_must_fail git rebase --continue && + grep "^@@@ " .git/rebase-merge/patch && git add B && git rebase --continue && test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) && -- cgit v1.3-5-g9baa