Задать вопрос
@Bjornie
Изучаю Python

Как удалить\закомиттить только нужный коммит?

После длительного времени сделал очередной коммит в репо, и обнаружил, что с ним приплыли 20 других бесполезных коммитов (делал пробы), которые совсем не нужны в удаленном репозитории (и в локальном тоже). Теперь не понятно как их оттуда убрать.

Пробовал разные способы, типа git revert, git reset --hard менял местами, но что-то не то получается.

В идеале я хочу закомитить только последний коммит, а промежуточные удалить или игнорировать их при git push на Bitbucket.
  • Вопрос задан
  • 259 просмотров
Подписаться 2 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • ProductStar
    Python + Flask + Git: веб-разработка с нуля
    2 месяца
    Далее
  • Учебный центр IBS
    DEV-007 Введение в систему контроля версий Git
    1 неделя
    Далее
  • Stepik
    Git (система контроля версий)
    1 неделя
    Далее
Пригласить эксперта
Ответы на вопрос 2
muhammad_97
@muhammad_97
PHP-разработчик
git rebase -i HEAD~N

- где N - количество мусорных коммитов. Нужно будет выполнить squash. Для этого на первой строке пишем p (pick up), а на остальных s (squash).

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

git push -f
Ответ написан
dlnsk
@dlnsk
ПК Партнер 01.01 -> ПК Поиск -> IBM PC
Вообще, делать пробы лучше в отдельной ветке - так гораздо меньше головняков...
Если пробы все-таки хочется сохранить (хотя бы временно), то можно сделать так:
Итак у вас есть коммит аааааа (последний - о котором вы пишите) и есть коммит сссссс. Пробные коммиты находятся как-раз между аааааа и сссссс. Ветка master, по вашему описанию, находится на самом верху, т.е. на аааааа.
1. Создаем тестовую ветку: git branch Tests (теперь на аааааа две ветки)
2. Переносим master на последний полезный коммит: git reset --hard cccccc
3. Копируем нужный коммит: git cherry-pick аааааа
4. Отправляем master: git push -f
Посмотреть ситуацию наглядно можно так: git log --oneline --decorate --all --graph
Все. Пробные коммиты остались в отдельной ветке. Ее можно удалить. А если они все-таки нужные и там предполагается продолжит работу, то нужно сделать rebase:
5. git checkout Tests
6. git rebase master
Тестовая ветка передвинется на топ master'а а коммит aaaaaa пропадет, т.к. он уже есть внизу.

ЗЫ: Чтобы не писать длинно git log (это очень частая команда), советую сделать alias.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
Made In Dream Санкт-Петербург
от 100 000 до 220 000 ₽
от 250 000 до 320 000 ₽