@Bjornie
Изучаю Python

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

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

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

В идеале я хочу закомитить только последний коммит, а промежуточные удалить или игнорировать их при git push на Bitbucket.
  • Вопрос задан
  • 257 просмотров
Пригласить эксперта
Ответы на вопрос 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы