Есть ли способ раздавить несколько коммитов не в интерактивном режиме? - PullRequest
99 голосов
/ 01 сентября 2011

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

Ответы [ 8 ]

127 голосов
/ 01 сентября 2011

Убедитесь, что ваше рабочее дерево чистое, тогда

git reset --soft HEAD~3
git commit -m'new commit message'
30 голосов
/ 03 июня 2014

Мне лично нравится решение от 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=$1

#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 к псевдониму git, создайте другой сценарий для настройки ваших псевдонимов git, например ( create_aliases.command или create_aliases.ш ):

#!/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 '----------------'
9 голосов
/ 20 сентября 2013

Я использовал:

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

Работал вполне нормально.Только не пытайтесь иметь журнал коммитов со строкой, которая начинается с «pick»:)

8 голосов
/ 20 августа 2017

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

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

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

3 голосов
/ 01 марта 2015

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

git squash 4

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

squash = !"f() { NL=$1; 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 $1
sqpsf = !git squash $1 && git psf 

С https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

2 голосов
/ 28 июня 2017

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

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

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

0 голосов
/ 12 февраля 2018

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

git reset --soft $(git merge-base --fork-point master) \
  && git commit --verbose --reedit-message=HEAD --reset-author
0 голосов
/ 01 сентября 2011

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

git rebase --onto HEAD~4 HEAD~ master

Предполагается, что вы являетесь мастером с линейной историей. Это не совсем сквош, потому что он отбрасывает промежуточные коммиты. Вам нужно изменить новый HEAD, чтобы изменить сообщение о коммите.

...