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
Решение для людей, которые предпочитают нажимать:
-
Установите sourcetree (это бесплатно)
-
Проверьте, как выглядят ваши коммиты. Скорее всего, у вас есть что-то похожее на это ![enter image description here]()
-
Щелкните правой кнопкой мыши на родительском коммите. В нашем случае это основная ветка.
![enter image description here]()
-
Вы можете сдавить коммит с предыдущим, нажав кнопку. В нашем случае мы должны нажать 2 раза. Вы также можете изменить сообщение коммита ![enter image description here]()
-
Результаты потрясающие, и мы готовы к этому! ![enter image description here]()
Примечание: если вы выдвигали свои частичные коммиты на дистанционное управление, вы должны использовать принудительный толчок после сквоша