1

I've written a script that does rebasing.

When I run $ my-rebase, I get an error:

You asked me to pull without telling me which branch you want to rebase against, and 'branch.rohan_branch1.merge' in your configuration file does not tell me, either. Please specify which branch you want to use on the command line and try again (e.g. 'git pull '). See git-pull(1) for details.

If you often rebase against the same branch, you may want to use something like the following in your configuration file:

[branch "rohan_branch1"]
remote = <nickname>
merge = <remote-ref>
rebase = true

[remote "<nickname>"]
url = <url>
fetch = <refspec>

I have master branch (working copy) and then I created rohan_branch1; it seems like at some point in time I did rebase in master.

Now I want to keep rohan_branch1 up-to-date. How can I get rid of this error ?

CharlesB
  • 86,532
  • 28
  • 194
  • 218
Rohan Nemaro
  • 99
  • 1
  • 3
  • 6

1 Answers1

3

If you want to rebase when pulling (git pull --rebase), you need to have an upstream branch associated with the local branch on which you are pulling to:

git branch --set-upstream rohan_branch1 nickname/anotherBranch

(as CharlesB describes in "git rebase origin” vs.“git rebase origin/master")

From there, you could consider the gup script (from "gup: A friendlier git pull --rebase") from Jason Weathered:

function gup
{
  # subshell for `set -e` and `trap`
  (
    set -e # fail immediately if there's a problem


    # use `git-up` if installed
    if type git-up > /dev/null 2>&1
    then
      exec git-up
    fi


    # fetch upstream changes
    git fetch


    BRANCH=$(git symbolic-ref -q HEAD)
    BRANCH=${BRANCH##refs/heads/}
    BRANCH=${BRANCH:-HEAD}


    if [ -z "$(git config branch.$BRANCH.remote)" -o -z "$(git config branch.$BRANCH.merge)" ]
    then
      echo "\"$BRANCH\" is not a tracking branch." >&2
      exit 1
    fi


    # create a temp file for capturing command output
    TEMPFILE="`mktemp -t gup.XXXXXX`"
    trap '{ rm -f "$TEMPFILE"; }' EXIT


    # if we're behind upstream, we need to update
    if git status | grep "# Your branch" > "$TEMPFILE"
    then


      # extract tracking branch from message
      UPSTREAM=$(cat "$TEMPFILE" | cut -d "'" -f 2)
      if [ -z "$UPSTREAM" ]
      then
        echo Could not detect upstream branch >&2
        exit 1
      fi


      # can we fast-forward?
      CAN_FF=1
      grep -q "can be fast-forwarded" "$TEMPFILE" || CAN_FF=0


      # stash any uncommitted changes
      git stash | tee "$TEMPFILE"
      [ "${PIPESTATUS[0]}" -eq 0 ] || exit 1


      # take note if anything was stashed
      HAVE_STASH=0
      grep -q "No local changes" "$TEMPFILE" || HAVE_STASH=1


      if [ "$CAN_FF" -ne 0 ]
      then
        # if nothing has changed locally, just fast foward.
        git merge --ff "$UPSTREAM"
      else
        # rebase our changes on top of upstream, but keep any merges
        git rebase -p "$UPSTREAM"
      fi


      # restore any stashed changes
      if [ "$HAVE_STASH" -ne 0 ]
      then
        git stash pop
      fi


    fi


  )
}

Instead of calling git pull --rebase directly, it will manage untracked files (stash) and will preserve merge commits (git rebase -p) when rebasing.
(See "Rebasing Merge Commits in Git" from the "Envato Notes blog")

Community
  • 1
  • 1
VonC
  • 1,262,500
  • 529
  • 4,410
  • 5,250