Откат коммитов на GitHub
Небольшая статья, посвященная вопросу отката коммитов в GitHub.
В чем заключается вопрос, собственно? В том, что имеется определенный репозиторий, размещенный на сервере GitHub. У этого удаленного репозитория есть локальная синхронизированная версия на рабочей машине автора. Этот репозиторий изменяется с большей или меньшей периодичностью; все изменения фиксируются соответствующими коммитами.
И вот в один прекрасный момент в репозиторий было внесено изменение, которое затем было закоммичено и отправлено на GitHub. Однако, от этого изменения нужно избавиться — оно ошибочное.
Но как это сделать, если коммит уже находится на GitHub? В интерфейсе сервиса GitHub я не нашел нужной кнопки, чтобы удалять конкретный коммит и тем самым возвращать репозиторий до нужного состояния.
Это потому, что управление коммитами на GitHub производится через локальный репозиторий. Ниже приведу три несложных шага для того, чтобы показать, каким образом это выполняется.
Шаг первый
Первое — необходимо получить список hash-сумм последних коммитов репозитория. Это и понятно — нужно иметь перед собой дерево коммитов, чтобы видеть — куда двигаться. В дереве коммитов hash-суммы являются опорными точками, идентификационными номерами каждого из коммитов:
$ git log
git log
commit ee3a2ae6888fb87d5013786f6cf3b18da63f7bbb Author: gearmobile gearmobile@gmail.com> Date: Mon Apr 6 17:48:08 2015 +0300 End commit 6d92268e42eace0c78a5150144645333b769623d Author: gearmobile gearmobile@gmail.com> Date: Mon Apr 6 17:06:35 2015 +0400 Close to end commit 855404bf39b5fabd45ba0c6f5702e7a28949a02e Author: gearmobile gearmobile@gmail.com> Date: Mon Apr 6 15:24:04 2015 +0400 End 2014-07-16 commit 3eb55145a79f9f8f732338a0e80bd71b2325b6da Author: gearmobile gearmobile@gmail.com> Date: Mon Apr 6 12:48:17 2015 +0400 End
vorozhba / Как удалить commit в Github.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
1. Получаем хэш-код коммита, к которому хотим вернуться. |
2. Заходим в папку репозитория и пишем в консоль: |
$ git reset —hard a3775a5485af0af20375cedf46112db5f813322a |
$ git push —force |
levosay commented Jul 7, 2021
alex-sansei commented Jul 15, 2021
JerryCash-x commented Jul 20, 2021
zose43 commented Aug 13, 2021
somefellahere commented Aug 21, 2021 •
be careful with: git reset —hard a3775a5485af0af20375cedf46112db5f813322a
it delete all your current changes, use that command without —hard , then git push —force
Fariarx commented Sep 20, 2021
ZodiacGP commented Sep 24, 2021
Sirena-byte commented Sep 29, 2021
огромное спасибо! помогло)
ghost commented Oct 1, 2021
Che-p-bot commented Nov 26, 2021
Спасибо, это очень помогло!
yurasts commented Nov 27, 2021
SlimDaddy228 commented Dec 12, 2021
Tim-Kids commented Dec 29, 2021
спасибо! все-таки русскоязычные запросы в Google тоже хорошо порой помагают.
KarimullinArthur commented Jan 17, 2022 •
Fobiya commented Mar 5, 2022
instasanjik commented Mar 24, 2022
Спасибо вам большое! Вы нас очень выручили!
Moon1706 commented Apr 17, 2022
@vorozhba
Хелло! А можно ли как-то удалить не последние коммиты путем перемещения HEAD назад, а точечно одни коммит из последовательности? Пример, [1,2,3,4] -> [1,3,4]
olek07 commented Apr 18, 2022
@vorozhba Хелло! А можно ли как-то удалить не последние коммиты путем перемещения HEAD назад, а точечно одни коммит из последовательности? Пример, [1,2,3,4] -> [1,3,4]
mpodaniev commented Apr 18, 2022
@vorozhba
Хелло! А можно ли как-то удалить не последние коммиты путем перемещения HEAD назад, а точечно одни коммит из последовательности? Пример, [1,2,3,4] -> [1,3,4]
Через Вебшторм можно, просто удаляешь нужные коммит и пушишь через force. А как с помощью консольных команд не знаю, но точно можно.
olek07 commented Apr 19, 2022
@vorozhba
Хелло! А можно ли как-то удалить не последние коммиты путем перемещения HEAD назад, а точечно одни коммит из последовательности? Пример, [1,2,3,4] -> [1,3,4]
Через Вебшторм можно, просто удаляешь нужные коммит и пушишь через force. А как с помощью консольных команд не знаю, но точно можно.
Разве так можно? Там же что-то вроде блокчейна. Следующий зависит от предыдущего. Разве нет?
mpodaniev commented Apr 19, 2022
@vorozhba
Хелло! А можно ли как-то удалить не последние коммиты путем перемещения HEAD назад, а точечно одни коммит из последовательности? Пример, [1,2,3,4] -> [1,3,4]
Через Вебшторм можно, просто удаляешь нужные коммит и пушишь через force. А как с помощью консольных команд не знаю, но точно можно.
Разве так можно? Там же что-то вроде блокчейна. Следующий зависит от предыдущего. Разве нет?
Не знаю на счет блокчейна, и думаю что такого нет в гите.
Но постоянно так делаю, когда в фичебранче что-то разрабатываю, а потом оказывается что в каком-то коммите что-то не нужное добавил, а это могло быть десять коммитов назад к примеру. Просто удалил его локально и через форс пуш обновил данные в удаленном репозитории.
Все, в удаленном репозитории больше нет этого коммита
SlimDaddy228 commented Apr 27, 2022
давно нашел, не раз выручало, красавчик
maxim-saharov commented May 28, 2022
@vorozhba
Хелло! А можно ли как-то удалить не последние коммиты путем перемещения HEAD назад, а точечно одни коммит из последовательности? Пример, [1,2,3,4] -> [1,3,4]
Через Вебшторм можно, просто удаляешь нужные коммит и пушишь через force. А как с помощью консольных команд не знаю, но точно можно.
Разве так можно? Там же что-то вроде блокчейна. Следующий зависит от предыдущего. Разве нет?
Не знаю на счет блокчейна, и думаю что такого нет в гите.
Но постоянно так делаю, когда в фичебранче что-то разрабатываю, а потом оказывается что в каком-то коммите что-то не нужное добавил, а это могло быть десять коммитов назад к примеру. Просто удалил его локально и через форс пуш обновил данные в удаленном репозитории.
Все, в удаленном репозитории больше нет этого коммита
при удалении и при переименовании названия комита — вебшторм там много что шаманит и делает rebase всякий — о чем потом показывает в своей консоле — но если будут конфликты то предложит сравнивать и можно наломать там что то — лучше всегда перед этим делайте бек ап и потом играйтесь)
Как удалить коммит из репозитория в Atlassian Bitbucket
В этой статье я расскажу, как удалить коммит из репозитория в Bitbucket.
А зачем вообще удалять коммит?
Может так случиться, что Вы случайно запушите конфиденциальную информацию в репозиторий Bitbucket.
Например, Вы отделили Ваш код от паролей, создав файл настроек, но забыли включить этот файл в .gitignore, в результате после того, как Вы закоммитили изменения и запушили в Bitbucket, файл с паролями виден всем, у кого есть доступ к репозиторию. Или же Вы что-то тестили и написали пароль прямо в исходном файле, Вы, конечно, хотели потом его удалить, но забыли. Вы закоммитили, запушили и Ваш пароль опять виден всем.
Хорошо, он виден всем. Нужно как-то откатить эти изменения. Но как?
Вы можете удалить репозиторий и создать новый. Но в этом случае нужно будет настроить новый репозиторий, как старый, сказать коллегам, что Вы создали новый репозиторий. Это как-то слишком сложно.
Более простой способ это удалить коммит с паролем
В этой статье я покажу, как это сделать.
Создадим репозиторий в Bitbucket
Сначала создадим репозиторий в Bitbucket:
Создадим локальный репозиторий, внесем изменения и запушим в Bitbucket
Я создам новую папку для репозитория:
mkdir bitbucket-tutorial cd bitbucket-tutorial/
Теперь инициализирую репозиторий и добавлю ссылку на мой Bitbucket репозиторий:
git init git remote add origin https://alex1mmm@bitbucket.org/alex1mmm/bitbucket-repo-article.git
Создам новый файл и добавлю содержимое:
touch mynewfile.txt
Вот содержимое файла mynewfile.txt:
this line is initial commit
Я закоммичу изменения и запушу в Bitbucket:
git add * git commit -m "initial" git push origin master
Внесу измененияи в mynewfile.txt с паролем:
this line is initial commit I added my password info here
Опять закоммичу изменения и запушу в Bitbucket:
git add * git commit -m "sensitive info" git push origin master
Теперь у меня в Bitbucket два коммита:
И коммит с конфиденциальной информацией содержит мой пароль:
Даже если я сейчас быстро уберу из файла mynewfile.txt мой пароль, закоммичу изменения и запушу в Bitbucket, то я все-равно буду видеть мой коммит с конфиденциальной информацией, а значит и мой пароль. Поэтому нам нужно удалить коммит.
Удалим коммит с паролем
Давайте сначала найдем идентификатор нашего коммита:
git log --oneline --graph --decorate
Вот вывод этой команды:
Я пометил идентификатор коммита с паролем красный прямоугольником.
Этот коммит нам и нужно удалить. Но для того, чтобы его удалить, нам понадобится идентификатор предыдущего коммита. Вот он:
Теперь удаляем наш коммит вот такой коммандой. В команде мы указываем идентификатор предыдущего коммента:
git reset --hard 3e90065
Теперь файл mytextfile.txt выглядит вот так:
this line is initial commit
Правильно! Информации о пароле нет.
История коммитов выглядит вот так:
У нас нет коммита с паролем. Опять верно!
Но если мы посмотрим в Bitbucket, то коммит все еще будет там:
Правильно. Мы не запушили изменения. Давайте запушим:
git push --force origin master
И теперь если мы посмотрим в Bitbucket, то увидим только один коммит:
Отлично! Больше никто не видит наш пароль.
Удалить коммиты из ветки Git
В этом посте мы обсудим, как удалить коммиты из ветки Git.
1. git сброс
Здесь идея состоит в том, чтобы принудительно сбросить рабочий каталог, чтобы удалить все коммиты, которые идут после указанного коммита, а затем выполнить принудительное нажатие:
git reset --hard []
Вы можете ссылаться на фиксацию через ее родословную, используя ее полный хэш SHA-1 или предоставляя частичный хеш, который должен быть не менее 4 символов и быть однозначным.
# Discard the first 4 commits
git reset --hard HEAD~4
Если эти коммиты присутствуют в удаленном репозитории, вам нужно будет принудительно выполнить полный сброс в удаленный репозиторий.
# Force Push updates to the remote repository
git push [-f | --force]
Вот живой пример:
Обратите внимание, что любые изменения, сделанные в рабочем каталоге с момента последней фиксации, автоматически отбрасываются. Чтобы избежать этого, сначала спрячьте свои локальные изменения, вызвав метод git-stash команда, которая, в свою очередь, также возвращает рабочий каталог в HEAD редакцию после сохранения ваших локальных изменений. git reset —hard HEAD часто используется для удаления всех незафиксированных изменений в соответствии с самой последней фиксацией в рабочем каталоге.
Если вы хотите сохранить свою работу и только отменить фиксацию, вы можете использовать —soft вариант.
git reset --soft []
Это показано ниже:
2. git вернуться
Не рекомендуется выполнять принудительную отправку в общедоступный или общий репозиторий; сделать git-revert вместо. Он создает новую фиксацию, которая отменяет все указанные изменения фиксации, а затем применяет ее к текущей ветке.
# Revert the commit 87859b5
git revert 87859b5
# Push to the remote
git push
Вот живой пример:
3. Интерактивный ребейзинг
Другой вероятный способ удаления комментариев — использование git-rebase команда.
git rebase -i []
Выполнение вышеуказанной команды откроет редактор со всеми фиксациями в вашей текущей ветке, которые идут после указанной фиксации. Чтобы удалить фиксацию, просто замените команду ‘выбрать’ на ‘удалить’ и закройте редактор. Вы также можете удалить соответствующую строку.
Следующая команда удалит всю фиксацию e78d8b1 за один раз с помощью —rebase-merges режим с —onto вариант.
git rebase -r --onto e78d8b1^ e78d8b1
Это все об удалении коммитов из ветки Git.
Оценить этот пост
Средний рейтинг 4.96 /5. Подсчет голосов: 27
Голосов пока нет! Будьте первым, кто оценит этот пост.
Сожалеем, что этот пост не оказался для вас полезным!
Расскажите, как мы можем улучшить этот пост?
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
Подписывайся
0 Комментарии
Встроенные отзывы
Просмотреть все комментарии
Загрузить больше комментариев
Просматривать
Подпишитесь на новые публикации
- Все проблемы
- Практика DSA
- 100 самых популярных задач
- 50 лучших классических задач
- Лучшие алгоритмы
- Компилятор С/С++
- Компилятор Java
- Компилятор Python
- Компилятор JavaScript
- компилятор PHP
- Компилятор C#
- Свяжитесь с нами
- Политика конфиденциальности
- условия обслуживания
- Подпишитесь на новые публикации
Techie Delight © 2023 Все права защищены.
Этот веб-сайт использует файлы cookie. Используя этот сайт, вы соглашаетесь с использованием файлов cookie, нашей политикой, условиями авторского права и другими условиями. Читайте наши Политика конфиденциальности. Понятно