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