rebasing-merge: require --force to rebase without new upstream commits
[msysgit.git] / share / msysGit / rebasing-merge.sh
blob46dbc7b6bdc82127650682f527203147e61fa1c3
1 #!/bin/sh
3 force=
4 case "$1" in -f|--force) shift; force=t;; esac
6 TO=${1:-junio/next}
8 if test -z "$force" && test -z "$(git rev-list .."$TO")"
9 then
10 echo "Nothing new in $TO; To force a rebase, use the --force, Luke!" >&2
11 exit 1
14 TODO_EXTRA="$(git rev-parse --git-dir)/todo-extra"
16 # Rebase 'devel' on top of 'junio/next', the merging the old state of
17 # 'devel' with the merge strategy 'ours' to enable a fast-forward.
19 case "$(git rev-parse --symbolic-full-name HEAD)" in
20 refs/heads/devel)
21 UPSTREAM=$(git rev-parse --symbolic-full-name HEAD@{u}) || {
22 echo "Not tracking any remote branch!" >&2
23 exit 1
25 test "$(git rev-parse HEAD)" = "$(git rev-parse $UPSTREAM)" ||
26 test "$(git rev-parse devel@{1})" = "$(git rev-parse $UPSTREAM)" || {
27 echo "Your 'devel' is not up-to-date!" >&2
28 exit 1
30 ;; # okay
31 HEAD) ;; # okay
33 echo "Not on 'devel'!" >&2
34 exit 1
36 esac
38 # Find old rebasing merge, if any
40 rm -f "$TODO_EXTRA"
42 MERGE=$(git rev-list --parents $TO.. | sed -n 's/ .* .*//p' | head -n 1)
43 if test "$(git rev-parse $MERGE:)" = "$(git rev-parse "$MERGE^:")"
44 then
45 ORIG_HEAD=$(git rev-parse HEAD) &&
46 # Find prior merges to $TO
47 EXCLUDE=$(git rev-list --parents $TO..$MERGE^ |
48 sed -n 's/^\([^ ]*\) .* .*/^\1/p') &&
49 # Get commits from previous rebasing merge
50 git rev-list --pretty=oneline --abbrev-commit --abbrev=7 --reverse \
51 --no-merges $TO..$MERGE^ $EXCLUDE |
52 sed 's/^/pick /' > "$TODO_EXTRA" &&
53 TMP_EDITOR="$(git rev-parse --git-dir)/rebasing-editor.sh" &&
54 cat > "$TMP_EDITOR" << EOF &&
55 #!/bin/sh
56 case "\$1" in
57 */git-rebase-todo)
58 cat "\$1" >> "$TODO_EXTRA" &&
59 mv "$TODO_EXTRA" "\$1"
60 esac &&
61 exec "$(git var GIT_EDITOR)" "\$@"
62 EOF
63 TO_SHA1=$(git rev-parse --short $TO) &&
64 chmod a+x "$TMP_EDITOR" &&
65 if GIT_EDITOR="$TMP_EDITOR" git rebase -i $MERGE --onto $TO
66 then
67 git merge -s ours -m "Rebasing merge to $TO ($TO_SHA1)" \
68 $ORIG_HEAD
69 else
70 FINISH="$(git rev-parse --git-dir)/finish-rebasing-merge.sh"
71 cat > "$FINISH" << EOF
72 git merge -s ours -m "Rebasing merge to $TO ($TO_SHA1)" $ORIG_HEAD
73 EOF
74 chmod a+x "$FINISH"
75 cat << EOF
77 After the rebase, call '$FINISH' manually
78 EOF
81 else
82 git rebase -i $TO