Есть ли способ раздавить ряд коммитов не в интерактивном режиме?



Я пытаюсь раздавить ряд коммитов-голова к голове~3. Есть ли быстрый способ сделать это, или мне нужно использовать rebase --interactive?

540   8  

8 ответов:

убедитесь, что ваше рабочее дерево чисто, а затем

git reset --soft HEAD~3
git commit -m'new commit message'

мне лично нравится wilhelmtell это устранение:

git reset --soft HEAD~3
git commit -m 'new commit message'

однако, я сделал псевдоним с некоторой проверкой ошибок, так что вы можете сделать это:

git squash 3 'my commit message'

Я рекомендую настроить псевдонимы, которые фактически запускают скрипты, чтобы было проще (а) кодировать ваши скрипты и (Б) выполнять более сложную работу с проверкой ошибок. Ниже приведен скрипт, который выполняет работу сквоша, а затем ниже-скрипт для настройки вашего git псевдонимы.

скрипт для раздавливания (squash.sh)

#!/bin/bash
#

#get number of commits to squash
squashCount=

#get the commit message
shift
commitMsg=$@

#regular expression to verify that squash number is an integer
regex='^[0-9]+$'

echo "---------------------------------"
echo "Will squash $squashCount commits"
echo "Commit message will be '$commitMsg'"

echo "...validating input"
if ! [[ $squashCount =~ $regex ]]
then
    echo "Squash count must be an integer."
elif [ -z "$commitMsg" ]
then
    echo "Invalid commit message.  Make sure string is not empty"
else
    echo "...input looks good"
    echo "...proceeding to squash"
    git reset --soft HEAD~$squashCount
    git commit -m "$commitMsg"
    echo "...done"
fi

echo
exit 0

затем подключить, что squash.sh сценарий к псевдоним ЖКТ, сделать еще один скрипт для настройки ГИТ псевдонимы вроде так (create_aliases.команда или create_aliases.sh):

#!/bin/sh
echo '-----------------------'
echo 'adding git aliases....'
echo '-----------------------'
echo
git config --global alias.squash "!bash -c 'bash <path to scripts directory>/squash.sh $1 $2' -"
#add your other git aliases setup here
#and here
#etc.
echo '------------------------------------'
echo 'here is your global gitconfig file:'
echo '------------------------------------'
more ~/.gitconfig
echo 
echo
echo '----------------'
echo 'end of script...'
echo '----------------'

Я:

EDITOR="sed -i '2,/^$/s/^pick\b/s/'" git rebase -i <ref>

работал довольно хорошо. Просто не пытайтесь иметь журнал фиксации со строкой, которая начинается с "pick":)

используйте следующую команду, чтобы раздавить последние 4 коммита в пределах последнего коммита:

git squash 4

С псевдонимом:

squash = !"f() { NL=; GIT_EDITOR=\"sed -i '2,$NL s/pick/squash/;/# This is the 2nd commit message:/,$ {d}'\"; git rebase -i HEAD~$NL; }; f"
sq = !git squash 
sqpsf = !git squash  && git psf 

от https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

добавить к ответу по wilhelmtell Я нахожу удобным мягкий сброс в HEAD~2, а затем внесение поправок в фиксацию HEAD~3:

git reset --soft HEAD~2
git commit --all --amend --no-edit    

это объединит все коммиты в HEAD~3 commit и использует его сообщение commit. Обязательно начните с чистого рабочего дерева.

вот один лайнер, чтобы раздавить последние 2 коммита. В этом примере сообщение о втором последнем фиксации будет сохранено. Вы можете изменить сообщение, как вы хотите.

git commit -am "$(git log -1 --skip=1 --pretty=%B | xargs && git reset --soft HEAD~2)"

эта команда будет очень полезна, если вы создадите псевдоним для этой команды и вместо него используете псевдоним.

вы можете получить довольно близко с

git rebase --onto HEAD~4 HEAD~ master

это предполагает, что вы находитесь на master с линейной историей. Это не совсем сквош, потому что он отбрасывает промежуточные коммиты. Вам нужно будет изменить новый заголовок, чтобы изменить сообщение фиксации.

раздавить все, так как ветка была раздвоена от мастера:

git reset --soft $(git merge-base --fork-point master) \
  && git commit --verbose --reedit-message=HEAD --reset-author

Comments

    Ничего не найдено.