rebase -i: avoid 'git reset' when possible
When picking commits whose parents have not changed, we do not need to rewrite the commit. We do not need to reset the working directory to the parent's state, either. Requested by Sverre Rabbelier. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
1d035f8564
commit
0e757e30c7
@ -442,6 +442,30 @@ do_rest () {
|
||||
done
|
||||
}
|
||||
|
||||
# skip picking commits whose parents are unchanged
|
||||
skip_unnecessary_picks () {
|
||||
fd=3
|
||||
while read command sha1 rest
|
||||
do
|
||||
# fd=3 means we skip the command
|
||||
case "$fd,$command,$(git rev-parse --verify --quiet $sha1^)" in
|
||||
3,pick,"$ONTO"*|3,p,"$ONTO"*)
|
||||
# pick a commit whose parent is current $ONTO -> skip
|
||||
ONTO=$sha1
|
||||
;;
|
||||
3,#*|3,,*)
|
||||
# copy comments
|
||||
;;
|
||||
*)
|
||||
fd=1
|
||||
;;
|
||||
esac
|
||||
echo "$command${sha1:+ }$sha1${rest:+ }$rest" >&$fd
|
||||
done <"$TODO" >"$TODO.new" 3>>"$DONE" &&
|
||||
mv -f "$TODO".new "$TODO" ||
|
||||
die "Could not skip unnecessary pick commands"
|
||||
}
|
||||
|
||||
# check if no other options are set
|
||||
is_standalone () {
|
||||
test $# -eq 2 -a "$2" = '--' &&
|
||||
@ -746,6 +770,8 @@ EOF
|
||||
has_action "$TODO" ||
|
||||
die_abort "Nothing to do"
|
||||
|
||||
test -d "$REWRITTEN" || skip_unnecessary_picks
|
||||
|
||||
git update-ref ORIG_HEAD $HEAD
|
||||
output git checkout $ONTO && do_rest
|
||||
;;
|
||||
|
@ -459,4 +459,15 @@ test_expect_success 'submodule rebase -i' '
|
||||
FAKE_LINES="1 squash 2 3" git rebase -i A
|
||||
'
|
||||
|
||||
test_expect_success 'avoid unnecessary reset' '
|
||||
git checkout master &&
|
||||
test-chmtime =123456789 file3 &&
|
||||
git update-index --refresh &&
|
||||
HEAD=$(git rev-parse HEAD) &&
|
||||
git rebase -i HEAD~4 &&
|
||||
test $HEAD = $(git rev-parse HEAD) &&
|
||||
MTIME=$(test-chmtime -v +0 file3 | sed 's/[^0-9].*$//') &&
|
||||
test 123456789 = $MTIME
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user