Merge branch 'js/rebase-i-opt'
* js/rebase-i-opt: rebase -i: avoid 'git reset' when possiblemaint
commit
72c2de5c41
|
@ -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