[PATCH] Bugfixes for git-rebase
From: Lukas Sandström <hidden>
Date: 2016-06-15 22:42:14
Subsystem:
the rest · Maintainer:
Linus Torvalds
Fix bugs in git-rebase wrt rebasing another branch than the current HEAD, rebasing with a dirty working dir, and rebasing a proper decendant of the target branch. Signed-off-by: Lukas Sandström <redacted> --- Without this patch git rebase complains about "fatal: cannot read mbox" when doing a fast-forward. git-rebase.sh | 29 +++++++++++++++++++---------- 1 files changed, 19 insertions(+), 10 deletions(-) 2c0e6289d37461abbadb878b9ca8d2bfe2ca1a1b
diff --git a/git-rebase.sh b/git-rebase.sh
index 638ff0d..1e9ddde 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh@@ -18,31 +18,30 @@ you still have something valuable there. exit 1 fi -# The other head is given. Make sure it is valid. -other=$(git-rev-parse --verify "$1^0") || exit - -# Make sure we have HEAD that is valid. -head=$(git-rev-parse --verify "HEAD^0") || exit - # The tree must be really really clean. git-update-index --refresh || exit diff=$(git-diff-index --cached --name-status -r HEAD) -case "$different" in +case "$diff" in ?*) echo "$diff" exit 1 ;; esac +# The other head is given. Make sure it is valid. +other=$(git-rev-parse --verify "$1^0") || exit + +# Make sure the branch to rebase is valid. +head=$(git-rev-parse --verify "${2:-HEAD^0}") || exit + # If the branch to rebase is given, first switch to it. case "$#" in 2) git-checkout "$2" || exit esac -# If the HEAD is a proper descendant of $other, we do not even need -# to rebase. Make sure we do not do needless rebase. In such a -# case, merge-base should be the same as "$other". mb=$(git-merge-base "$other" "$head") + +#Check if we're already rebased. if test "$mb" = "$other" then echo >&2 "Current branch `git-symbolic-ref HEAD` is up to date."
@@ -51,5 +50,15 @@ fi # Rewind the head to "$other" git-reset --hard "$other" + +# If the previous HEAD was a proper descendant of $other, we do not even +# need to rebase. Make sure we do not do needless rebase. In such a +# case, merge-base should be the same as "$head". +if test "$mb" = "$head" +then + echo >&2 "Fast-forwarded $head to $other." + exit 0 +fi + git-format-patch -k --stdout --full-index "$other" ORIG_HEAD | git am --binary -3 -k
--
0.99.9.GIT