Git: как раздавить все фиксации на ветке

Я делаю новую ветку от master с помощью:

git checkout -b testbranch

Я делаю 20 коммитов в нее.

Теперь я хочу раздавить эти 20 коммитов. Я делаю это с помощью:

git rebase -i HEAD~20

А если я не знаю, сколько коммитов? Есть ли способ сделать что-то вроде:

git rebase -i all on this branch

Ответ 1

Другой способ уничтожить все ваши коммиты - сбросить индекс на master:

 git checkout yourBranch
 git reset $(git merge-base master yourBranch)
 git add -A
 git commit -m "one commit on yourBranch"

Это не идеально, так как подразумевает, что вы знаете, из какой ветки идет ваш филиал.
Примечание: найти эту исходную ветку нелегко/невозможно с помощью Git (визуальный способ часто самый простой, как показано здесь).


РЕДАКТИРОВАТЬ: вам нужно будет использовать git push --force


Карлоча Хоа добавляет в комментариях:

Для сброса вы можете сделать

git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD)) 

[Это] автоматически использует ветку, в которой вы находитесь.
И если вы используете это, вы также можете использовать псевдоним, так как команда не полагается на имя ветки.

Ответ 2

То, что вы делаете, довольно подвержено ошибкам. Просто выполните:

git rebase -i master

который автоматически переустанавливает только ваш филиал, берет на себя текущий последний мастер.

Ответ 3

Еще один простой способ сделать это: перейдите в ветвь происхождения и выполните merge --squash. Эта команда не выполняет "сжатую" фиксацию. когда вы это сделаете, все сообщения о фиксации вашего брака будут собраны.

$ git checkout master
$ git merge --squash yourBranch
$ git commit # all commit messages of yourBranch in one, really useful
 > [status 5007e77] Squashed commit of the following: ...

Ответ 4

Оформите ветку, для которой вы хотите объединить все коммиты в один коммит. Скажем, он называется, feature_branch.

git checkout feature_branch

Шаг 1:

Сделайте программный сброс вашего origin/feature_branch с вашей локальной веткой master (в зависимости от ваших потребностей, вы также можете выполнить сброс с помощью origin/master). Это сбросит все дополнительные коммиты в вашей feature_branch, но без изменения каких-либо изменений вашего файла локально.

git reset --soft master

Шаг 2:

Добавьте все изменения в вашем каталоге git repo в новый коммит, который будет создан. И совершить то же самое с сообщением.

git add -A && git commit -m "commit message goes here"

Ответ 5

Предполагая, что вы разветвлялись от мастера, вам не нужно постоянно вводить yourBranch в шаг сброса:

git checkout yourBranch
git reset --soft HEAD~$(git rev-list --count HEAD ^master)
git add -A
git commit -m "one commit on yourBranch"

Пояснение:

  • git rev-list --count HEAD ^master подсчитывает коммиты с тех пор, как вы сделали свою ветвь функций от master, например. 20.
  • git reset --soft HEAD~20 сделает мягкий сброс последних 20 коммитов. Это оставляет ваши изменения в файлах, но удаляет коммиты.

Использование:

В моем .bash_profile я добавил псевдоним для gisquash чтобы сделать это одной командой:

# squash all commits into one
alias gisquash='git reset --soft HEAD~$(git rev-list --count HEAD ^master)'

После сброса и фиксации вам нужно сделать git push --force.

Подсказка:

Если вы используете Gitlab> = 11.0, вам больше не нужно это делать, поскольку у него есть опция сжатия при объединении ветвей. Gitlab Squashing option

Ответ 6

Основываясь на чтении нескольких вопросов и ответов Stackoverflow на раздачу, я думаю, что это хороший один лайнер для сквоша всех коммитов на ветке:

git reset --soft $(git merge-base master YOUR_BRANCH) && git commit -am "YOUR COMMIT MESSAGE" && git rebase -i master

Это предполагает, что master является базовой ветвью.

Ответ 7

Решение для людей, которые предпочитают нажимать:

  1. Установите sourcetree (это бесплатно)

  2. Проверьте, как выглядят ваши коммиты. Скорее всего, у вас есть что-то похожее на это enter image description here

  3. Щелкните правой кнопкой мыши на родительском коммите. В нашем случае это основная ветка.

enter image description here

  1. Вы можете сдавить коммит с предыдущим, нажав кнопку. В нашем случае мы должны нажать 2 раза. Вы также можете изменить сообщение коммита enter image description here

  2. Результаты потрясающие, и мы готовы к этому! enter image description here

Примечание: если вы выдвигали свои частичные коммиты на дистанционное управление, вы должны использовать принудительный толчок после сквоша