Merge branch 'jc/rebase-orig-head'
authorJunio C Hamano <gitster@pobox.com>
Tue, 15 Jul 2008 06:45:49 +0000 (23:45 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 15 Jul 2008 06:45:49 +0000 (23:45 -0700)
* jc/rebase-orig-head:
Documentation: mention ORIG_HEAD in am, merge, and rebase
Teach "am" and "rebase" to mark the original position with ORIG_HEAD

1  2 
Documentation/git-am.txt
git-am.sh
git-rebase--interactive.sh
diff --combined Documentation/git-am.txt
index eeb23b25b0d70c4ccc3eb9d091971b1f20ad4b4b,88ca5f118340f37012c64c8c0395906ef1414894..1395c7d986c82eb1e7e91140c8f97b80e7a8a41d
@@@ -12,8 -12,8 +12,8 @@@ SYNOPSI
  'git am' [--signoff] [--keep] [--utf8 | --no-utf8]
           [--3way] [--interactive] [--binary]
           [--whitespace=<option>] [-C<n>] [-p<n>]
 -         <mbox>|<Maildir>...
 -'git am' [--skip | --resolved]
 +       [<mbox> | <Maildir>...]
 +'git am' (--skip | --resolved)
  
  DESCRIPTION
  -----------
@@@ -145,6 -145,12 +145,12 @@@ directory exists, so if you decide to s
  run `rm -f -r .dotest` before running the command with mailbox
  names.
  
+ Before any patches are applied, ORIG_HEAD is set to the tip of the
+ current branch.  This is useful if you have problems with multiple
+ commits, like running 'git am' on the wrong branch or an error in the
+ commits that is more easily fixed by changing the mailbox (e.g.
+ errors in the "From:" lines).
  
  SEE ALSO
  --------
diff --combined git-am.sh
index 4e73f93a1f1906db8212a1aa9236bdfa03ae1a00,fe53608c94a7eda70aebfdf3364802b1a665647f..52b5669b431140cb44cc65a25ae980f45d70fbe0
+++ b/git-am.sh
@@@ -5,7 -5,7 +5,7 @@@
  SUBDIRECTORY_OK=Yes
  OPTIONS_KEEPDASHDASH=
  OPTIONS_SPEC="\
 -git-am [options] <mbox>|<Maildir>...
 +git-am [options] [<mbox>|<Maildir>...]
  git-am [options] --resolved
  git-am [options] --skip
  --
@@@ -30,8 -30,7 +30,8 @@@ set_reflog_action a
  require_work_tree
  cd_to_toplevel
  
 -git var GIT_COMMITTER_IDENT >/dev/null || exit
 +git var GIT_COMMITTER_IDENT >/dev/null ||
 +      die "You need to set your committer info first"
  
  stop_here () {
      echo "$1" >"$dotest/next"
@@@ -242,6 -241,7 +242,7 @@@ els
                : >"$dotest/rebasing"
        else
                : >"$dotest/applying"
+               git update-ref ORIG_HEAD HEAD
        fi
  fi
  
index 3d85486c88069b98cff72f84001bc1897ef85941,02d7e3c7b030a662f283624b898aaa7c49544fdc..a35212d9de23e97055936b23dd8657a584116d76
  # The original idea comes from Eric W. Biederman, in
  # http://article.gmane.org/gmane.comp.version-control.git/22407
  
 -USAGE='(--continue | --abort | --skip | [--preserve-merges] [--verbose]
 -      [--onto <branch>] <upstream> [<branch>])'
 +OPTIONS_KEEPDASHDASH=
 +OPTIONS_SPEC="\
 +git-rebase [-i] [options] [--] <upstream> [<branch>]
 +git-rebase [-i] (--continue | --abort | --skip)
 +--
 + Available options are
 +v,verbose          display a diffstat of what changed upstream
 +onto=              rebase onto given branch instead of upstream
 +p,preserve-merges  try to recreate merges instead of ignoring them
 +s,strategy=        use the given merge strategy
 +m,merge            always used (no-op)
 +i,interactive      always used (no-op)
 + Actions:
 +continue           continue rebasing process
 +abort              abort rebasing process and restore original branch
 +skip               skip current patch and continue rebasing process
 +"
  
 -OPTIONS_SPEC=
  . git-sh-setup
  require_work_tree
  
@@@ -39,8 -25,10 +39,8 @@@ SQUASH_MSG="$DOTEST"/message-squas
  REWRITTEN="$DOTEST"/rewritten
  PRESERVE_MERGES=
  STRATEGY=
 +ONTO=
  VERBOSE=
 -test -d "$REWRITTEN" && PRESERVE_MERGES=t
 -test -f "$DOTEST"/strategy && STRATEGY="$(cat "$DOTEST"/strategy)"
 -test -f "$DOTEST"/verbose && VERBOSE=t
  
  GIT_CHERRY_PICK_HELP="  After resolving the conflicts,
  mark the corrected paths with 'git add <paths>', and
@@@ -378,27 -366,10 +378,27 @@@ do_rest () 
        done
  }
  
 +# check if no other options are set
 +is_standalone () {
 +      test $# -eq 2 -a "$2" = '--' &&
 +      test -z "$ONTO" &&
 +      test -z "$PRESERVE_MERGES" &&
 +      test -z "$STRATEGY" &&
 +      test -z "$VERBOSE"
 +}
 +
 +get_saved_options () {
 +      test -d "$REWRITTEN" && PRESERVE_MERGES=t
 +      test -f "$DOTEST"/strategy && STRATEGY="$(cat "$DOTEST"/strategy)"
 +      test -f "$DOTEST"/verbose && VERBOSE=t
 +}
 +
  while test $# != 0
  do
        case "$1" in
        --continue)
 +              is_standalone "$@" || usage
 +              get_saved_options
                comment_for_reflog continue
  
                test -d "$DOTEST" || die "No interactive rebase running"
                do_rest
                ;;
        --abort)
 +              is_standalone "$@" || usage
 +              get_saved_options
                comment_for_reflog abort
  
                git rerere clear
                exit
                ;;
        --skip)
 +              is_standalone "$@" || usage
 +              get_saved_options
                comment_for_reflog skip
  
                git rerere clear
  
                output git reset --hard && do_rest
                ;;
 -      -s|--strategy)
 +      -s)
                case "$#,$1" in
                *,*=*)
                        STRATEGY="-s "$(expr "z$1" : 'z-[^=]*=\(.*\)') ;;
                        shift ;;
                esac
                ;;
 -      -m|--merge)
 +      -m)
                # we use merge anyway
                ;;
 -      -C*)
 -              die "Interactive rebase uses merge, so $1 does not make sense"
 -              ;;
 -      -v|--verbose)
 +      -v)
                VERBOSE=t
                ;;
 -      -p|--preserve-merges)
 +      -p)
                PRESERVE_MERGES=t
                ;;
 -      -i|--interactive)
 +      -i)
                # yeah, we know
                ;;
 -      ''|-h)
 -              usage
 +      --onto)
 +              shift
 +              ONTO=$(git rev-parse --verify "$1") ||
 +                      die "Does not point to a valid commit: $1"
                ;;
 -      *)
 +      --)
 +              shift
 +              test $# -eq 1 -o $# -eq 2 || usage
                test -d "$DOTEST" &&
                        die "Interactive rebase already started"
  
  
                comment_for_reflog start
  
 -              ONTO=
 -              case "$1" in
 -              --onto)
 -                      ONTO=$(git rev-parse --verify "$2") ||
 -                              die "Does not point to a valid commit: $2"
 -                      shift; shift
 -                      ;;
 -              esac
 -
                require_clean_work_tree
  
                UPSTREAM=$(git rev-parse --verify "$1") || die "Invalid base"
@@@ -574,6 -549,7 +574,7 @@@ EO
                has_action "$TODO" ||
                        die_abort "Nothing to do"
  
+               git update-ref ORIG_HEAD $HEAD
                output git checkout $ONTO && do_rest
                ;;
        esac