Я делаю новую ветку из master
:
git checkout -b testbranch
Я делаю 20 коммитов в это.
Теперь я хочу раздавить эти 20 коммитов. Я делаю это с:
git rebase -i HEAD~20
А если я не знаю, сколько коммитов? Есть ли способ сделать что-то вроде:
git rebase -i all on this branch
git
version-control
user3803850
источник
источник
git rebase -i 58333012713fc168bd70ad00d191b3bdc601fa2d
интерактивную перебазировку, где commitnumber - это последний коммит, который остается неизменнымОтветы:
Еще один способ уничтожить все ваши коммиты - сбросить индекс на master:
Это не идеально, так как подразумевает, что вы знаете, из какой ветки идет ваш филиал.
Примечание: найти эту исходную ветку нелегко / невозможно с помощью Git ( визуальный способ часто самый простой , как показано здесь ).
РЕДАКТИРОВАТЬ: вам нужно будет использовать
git push --force
Карлоча Хоа добавляет в комментариях :
источник
YourBranch
данный момент. Это сохранится,YourBranch
когда вы это сделаетеreset
git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))
автоматически использовать ветку, в которой вы находитесь. И если вы используете это, вы также можете использовать псевдоним, так как команда не полагается на имя ветви.git push --force
(и предупредите своих коллег, если в этой ветке работает несколько человек)Оформите ветку, для которой вы хотите объединить все коммиты в один коммит. Скажем, это называется
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"
источник
-f
флага.То, что вы делаете, довольно подвержено ошибкам. Просто сделать:
который автоматически перебазирует только коммиты вашей ветки на текущий последний мастер.
источник
commit -am "the whole thing!"
reset origin/master
метод действительно плохой, так как это то же самое, что делать коммиты непосредственно на master - нет истории 'merge branch', нет опции pull request. Я думаю, что ответ @WaZaA намного больше соответствует нормальному рабочему процессу gitЕще один простой способ сделать это: перейти на ветку origin и сделать a
merge --squash
. Эта команда не выполняет "сдавленный" коммит. когда вы это сделаете, будут собраны все сообщения о коммитах вашей ветки.источник
Предполагая, что вы переходили от мастера, вам не нужно
yourBranch
все время входить в шаг сброса:Пояснение :
git rev-list --count HEAD ^master
подсчитывает коммиты, так как вы сделали свою ветку объектов от мастера, например. 20.git reset --soft HEAD~20
сделает мягкий сброс последних 20 коммитов. Это оставляет ваши изменения в файлах, но удаляет коммиты.Использование :
В моем .bash_profile я добавил псевдоним для
gisquash
этого одной командой:После сброса и фиксации вы должны сделать a
git push --force
.Подсказка :
Если вы используете Gitlab> = 11.0, вам больше не нужно это делать, поскольку у него есть опция сжатия при объединении ветвей.
источник
Основываясь на прочтении нескольких вопросов Stackoverflow и ответов на вопрос об использовании, я думаю, что это хороший вариант для того, чтобы раздавить все коммиты на ветке:
Это при условии, что мастер является базовой веткой.
источник
Решение для людей, которые предпочитают нажимать:
Установите sourcetree (это бесплатно)
Проверьте, как выглядят ваши коммиты. Скорее всего у вас что-то похожее на это
Щелкните правой кнопкой мыши на родительском коммите. В нашем случае это основная ветка.
Вы можете сдавить коммит с предыдущим, нажав кнопку. В нашем случае мы должны нажать 2 раза. Вы также можете изменить сообщение коммита
Результаты потрясающие, и мы готовы к этому!
Примечание: если вы выдвигали свои частичные коммиты на дистанционное управление, вы должны использовать принудительный толчок после сквоша
источник
Другим решением было бы сохранить все журналы фиксации в файл
git log> branch.log
Теперь branch.log будет иметь все идентификаторы коммитов с начала. Прокрутите вниз и возьмите первый коммит (это будет сложно в терминале), используя первый коммит
git reset --soft
все коммиты будут раздавлены
источник
Git reset, как упоминалось во многих ответах ранее, безусловно, лучший и самый простой способ достичь того, чего вы хотите. Я использую его в следующем рабочем процессе:
(на ветке разработки)
источник
Весь этот git reset, hard, soft и все остальное, упомянутое здесь, вероятно, работает (это не для меня), если вы делаете шаги правильно и что-то вроде джинна.
Если вы средний Джо Смо, попробуйте следующее:
Как использовать git merge --squash?
Спасла мне жизнь, и я буду играть в сквош, используя это 4 раза, так как я узнал об этом. Простой, чистый и в основном 1 комад. Вкратце:
если вы находитесь на ветке, давайте назовем ее «my_new_feature» от разработки, и ваш запрос на выборку имеет 35 коммитов (или столько же), и вы хотите, чтобы это было 1.
A. Убедитесь, что ваша ветка обновлена, перейдите на разрабатывать, получать последние версии, объединять и разрешать любые конфликты с помощью «my_new_feature»
(этот шаг на самом деле вы должны предпринять как можно быстрее, в любом случае)
B. Получить последние из разработки и расшириться в новом филиале называют его «my_new_feature_squashed»
C. магия здесь.
Вы хотите перенести свою работу из "my_new_feature" в "my_new_feature_squashed".
Просто сделайте это (в то время как в вашей новой ветке мы создали от разработки):
git merge --squash my_new_feature
Все ваши изменения теперь будут в вашей новой ветке, не стесняйтесь тестировать ее, затем просто сделайте свой 1 единственный коммит, нажмите, новый PR этой ветки - и ждите повторения на следующий день.
Ты не любишь кодировать? :)
источник
Вы можете использовать инструмент, который я создал специально для этой задачи:
https://github.com/sheerun/git-squash
В основном вам нужно позвонить,
git squash master
и все готовоисточник