Skip to content

Commit

Permalink
Fix pulling into the same branch.
Browse files Browse the repository at this point in the history
When the "git pull" command updates the branch head you are
currently on, before doing anything else, first update your
index file and the working tree contents to that of the new
branch head.  Otherwise, the later resolving steps would think
your index file is attempting to revert the change between the
original head commit and the updated head commit.

It uses two-tree fast-forward form of "read-tree -m -u" to
prevent losing whatever local changes you may have in the
working tree to do this update.  I think this would at least
make things safer (a lot safer), and prevent mistakes.

Also "git fetch" command is forbidden from fetching and fast
forwarding the current branch head unless --update-head-ok flag
is given.  "git pull" passes the flag when it internally calls
"git fetch".

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Aug 27, 2005
1 parent 90bc118 commit b10ac50
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 5 deletions.
34 changes: 30 additions & 4 deletions git-fetch-script
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,33 @@ _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"

append=
force=
update_head_ok=
while case "$#" in 0) break ;; esac
do
case "$1" in
-a|--a|--ap|--app|--appe|--appen|--append)
append=t
shift
;;
-f|--f|--fo|--for|--forc|--force)
force=t
shift
;;
-u|--u|--up|--upd|--upda|--updat|--update|--update-|--update-h|\
--update-he|--update-hea|--update-head|--update-head-|\
--update-head-o|--update-head-ok)
update_head_ok=t
;;
*)
break
;;
esac
shift
done

case "$#" in
0)
test -f "$GIT_DIR/branches/origin" ||
test -f "$GIT_DIR/remotes/origin" ||
die "Where do you want to fetch from?"
die "Where do you want to fetch from today?"
set origin ;;
esac

Expand Down Expand Up @@ -124,6 +129,12 @@ fast_forward_local () {
esac
}

case "$update_head_ok" in
'')
orig_head=$(cat "$GIT_DIR/HEAD" 2>/dev/null)
;;
esac

for ref in $(get_remote_refs_for_fetch "$@")
do
refs="$refs $ref"
Expand All @@ -150,7 +161,7 @@ do
fi
head=$(curl -nsf $curl_extra_args "$remote/$remote_name") &&
expr "$head" : "$_x40\$" >/dev/null ||
die "Failed to fetch $remote_name from $remote"
die "Failed to fetch $remote_name from $remote"
echo Fetching "$remote_name from $remote" using http
git-http-pull -v -a "$head" "$remote/" || exit
;;
Expand Down Expand Up @@ -201,3 +212,18 @@ http://* | https://* | rsync://* )
done
;;
esac

# If the original head was empty (i.e. no "master" yet), or
# if we were told not to worry, we do not have to check.
case ",$update_head_ok,$orig_head," in
*,, | t,* )
;;
*)
curr_head=$(cat "$GIT_DIR/HEAD" 2>/dev/null)
if test "$curr_head" != "$orig_head"
then
echo "$orig_head" >$GIT_DIR/HEAD
die "Cannot fetch into the current branch."
fi
;;
esac
20 changes: 19 additions & 1 deletion git-pull-script
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,25 @@
# Fetch one or more remote refs and merge it/them into the current HEAD.

. git-sh-setup-script || die "Not a git archive"
git-fetch-script "$@" || exit 1

orig_head=$(cat "$GIT_DIR/HEAD") || die "Pulling into a black hole?"
git-fetch-script --update-head-ok "$@" || exit 1

curr_head=$(cat "$GIT_DIR/HEAD")
if test "$curr_head" != "$orig_head"
then
# The fetch involved updating the current branch.

# The working tree and the index file is still based on the
# $orig_head commit, but we are merging into $curr_head.
# First update the working tree to match $curr_head.

echo >&2 "Warning: fetch updated the current branch head."
echo >&2 "Warning: fast forwarding your working tree."
git-read-tree -u -m "$orig_head" "$curr_head" ||
die "You need to first update your working tree."
fi

merge_head=$(sed -e 's/ .*//' "$GIT_DIR"/FETCH_HEAD | tr '\012' ' ')
merge_name=$(sed -e 's/^[0-9a-f]* //' "$GIT_DIR"/FETCH_HEAD |
tr '\012' ' ')
Expand Down

0 comments on commit b10ac50

Please sign in to comment.