Mike McCormack wrote:
Hi GIT users,
The GIT guys have made rebase and pull incompatible, and to use rebase
(which is likely what we want to do for Wine), you must use "fetch"
then "rebase", not "pull" (which does a merge).
And on a slightly related note, I wrote a script which works kinda like
rebase (and is based on the old version of rebase) that allows you to
coalesce two patches in your tree. This is useful in two situations:
1. You commit a new feature and then realise after some extensive
testing that there is a bug, so you commit a fix, don't want to send the
two separate patches to wine-patches (maybe to save face :-), or maybe
to reduce noise).
2. You revert a patch in your tree but don't want both the revert and
the old patch in your patch queue as shown by git-format-patch or by
Mike's mm-send-patch.
Note that the first commit chronologically must be the first commit on
the command line.
--
Rob Shearman
#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano.
# Copyright (c) 2005 Robert Shearman.
#
. git-sh-setup || die "Not a git archive."
usage="usage: $0 "'<commit1> <commit2>
Combines two commits into one commit (commit1 MUST occur before commit2)'
git-update-index --refresh || exit
case "$#" in
2) ;;
*)
die "$usage" ;;
esac
commit1=`git-rev-parse --verify "$1"` &&
commit1parent=`git-rev-list --max-count=2 $commit1 | tail -n1` &&
commit2=`git-rev-parse --verify "$2"` &&
ours=`git-rev-parse --verify HEAD` || exit
# FIXME: verify commit1 occurs before commit2
different1=$(git-diff-index --name-only --cached "$ours") &&
different2=$(git-diff-index --name-only "$ours") &&
test "$different1$different2" = "" ||
die "Your working tree does not match HEAD."
git-read-tree -m -u $ours $commit1parent &&
new_head=$(git-rev-parse --verify "$commit1parent^0") &&
git-update-ref HEAD "$new_head" || exit
tmp=.rebase-tmp$$
fail=$tmp-fail
trap "rm -rf $tmp-*" 1 2 3 15
>$fail
coalesce_succeeded=t
S=$(git-rev-parse --verify HEAD) &&
git-cherry-pick --no-commit --replay $commit1 || {
# shouldn't happen
echo >&2 "* Not applying the patch and continuing."
echo $commit1 >>$fail
git-reset --hard $S
coalesce_succeeded=f
}
echo "Coalescing $commit1 and $commit2" > .coalescemsg
echo "First commit:" >> .coalescemsg
echo >> .coalescemsg
cat .msg >> .coalescemsg
S=$(git-rev-parse --verify HEAD) &&
git-cherry-pick --no-commit --replay $commit2 || {
echo >&2 "* Not applying the patch and continuing."
echo $commit2 >>$fail
git-reset --hard $S
coalesce_succeeded=f
}
echo >> .coalescemsg
echo "Second commit:" >> .coalescemsg
echo >> .coalescemsg
cat .msg >> .coalescemsg
case "$coalesce_succeeded" in
t)
git-commit --no-verify -F .coalescemsg --edit
;;
esac
rm -f .coalescemsg
git-cherry -v $commit1parent $ours |
while read sign commit msg
do
echo "$commit: $msg"
case "$commit" in
$commit1|$commit2)
continue ;;
esac
case "$sign" in
-)
echo >&2 "* Already applied: $msg"
continue ;;
esac
echo >&2 "* Applying: $msg"
S=$(git-rev-parse --verify HEAD) &&
git-cherry-pick --replay $commit || {
echo >&2 "* Not applying the patch and continuing."
echo $commit >>$fail
git-reset --hard $S
}
done
if test -s $fail
then
echo >&2 Some commits could not be rebased, check by hand:
cat >&2 $fail
echo >&2 "(the same list of commits are found in $tmp)"
exit 1
else
rm -f $fail
fi