Как удалить коммит с гитхаба
Перейти к содержимому

Как удалить коммит с гитхаба

  • автор:

Как удалить коммит с Github

Если вы случайно зафиксировали что-то, чего не должны были делать, и отправили это на Github, все еще есть способы удалить или изменить это. Обычно вы не хотите возиться с историей Git, но в некоторых случаях это может быть безопасно, если все сделано правильно.

Не делайте этого, если можете этого избежать

Удаление коммитов из истории Git, как правило, плохая идея. Git предназначен для отслеживания каждой версии ваших файлов, и всегда есть альтернативы удалению, такие как git revert, которые сохранят историю нетронутой.

Когда он находится в удаленном репозитории, таком как Github, полностью избавиться от коммита гораздо сложнее. Это связано с тем, что любой, кто использует репозиторий, будет иметь свою собственную локальную копию этого репо, и принудительное удаление коммита приведет к их рассинхронизации.

Однако есть еще несколько причин для этого — возможно, вы случайно передали личные данные в общедоступный репозиторий, который все равно будет виден в истории, независимо от того, что вы делаете. Это вызовет некоторые проблемы у ваших коллег, но даже в этом случае это возможно с принудительным толчком.

Исправление коммитов локально

Если вы работаете локально и еще не отправили свои изменения в Github, вы можете безопасно сбросить или изменить коммиты, которые не находятся на удаленном компьютере. Git отслеживает ваш локальный каталог, выполняет внутренние изменения и хранит историю Git. Все это синхронизируется с пультом, но только при запуске push/pull . Github не заботится о состоянии вашего репо, пока вы не нажмете.

Если вы только что допустили ошибку при фиксации файлов, вы можете сделать программный сброс и сделать новую фиксацию. На самом деле это обычное дело и полезно, если вы хотите объединить несколько коммитов в один, который называется «сквошинг». Если вы хотите полностью отменить изменения, вы также можете сделать это (с помощью —hard сброса).

Если вы еще не перешли на Github, вы можете отменить самую последнюю фиксацию с помощью мягкого сброса, который вообще не влияет на ваши локальные файлы, но делает так, что вы никогда не фиксировали изменения в Git в первую очередь.

git reset --soft HEAD~

Если вы просто хотите добавить новый файл/изменение в самую последнюю фиксацию, в Git есть встроенный флаг, позволяющий сделать именно это:

git commit --amend --no-edit

Возврат (Github Safe)

Если вы хотите отменить изменения из коммита, который вы уже отправили на Github, безопасный способ сделать это — выполнить откат. Возврат создаст «противоположный коммит», который в основном отменит все изменения из определенного коммита. Если вы добавили строку, она удаляется, а если удалили файл, он добавляется обратно.

Это безопасно, потому что не изменяет историю, а только добавляет новую историю поверх нее. Вы можете отправить возвратную фиксацию на Github, и пусть ваши коллеги запустят git pull , чтобы получить обновления.

Сначала запустите git log , чтобы получить список коммитов:

Затем скопируйте хеш SHA1 и отмените коммит:

git revert 62ff517cc7c358eaf0bffdebbbe1b38dea92ba0f

Принудительный сброс (небезопасно)

Если вы действительно хотите удалить фиксацию, способ сделать это — удалить ее локально, а затем принудительно отправить на Github. Поскольку это очень опасно и может испортить локальные репозитории вашего коллеги, если вы все еще хотите, вам, возможно, придется отключить принудительную принудительную передачу ветки в настройках репозитория Github:

Затем вы можете удалить фиксацию локально, что проще всего сделать, если это последняя фиксация:

git reset --soft HEAD~

Вы также можете выполнить интерактивную перебазировку, что полезно, если коммит не самый последний. Если коммит был, например, 12 коммитов назад, вы можете перебазировать его, удалить ошибочный коммит и сохранить.

git rebase -i HEAD~12

Как только ваш локальный репозиторий будет в рабочем состоянии, вы можете принудительно отправить его на Github.

git push origin master --force

Убедитесь, что ваш репозиторий обновлен! Если в удаленной ветке есть изменения, которых нет у вас, они будут перезаписаны этим push-уведомлением.

Возможно, вы захотите согласовать это с членами вашей команды, так как вам, возможно, придется пропинговать их и сказать им, чтобы они выполнили выборку и сброс:

git fetch git reset origin/master --soft

Перемещение коммита в другую ветку

Если вы случайно совершили коммит не в ту ветку и хотите удалить коммит и переместить его в правильную ветку, в Git есть инструменты для решения этой проблемы. Вы можете прочитать наше руководство по перемещению коммитов, чтобы узнать больше, но применяются те же принципы — если вам нужно полностью удалить коммит, вы должны выполнить принудительный сброс. Если у вас все в порядке с возвратом, вы можете просто вернуться и выбрать вишневый.

Все права защищены. © Linux-Console.net • 2019-2024

15. Удаление коммитов из ветки

revert из предыдущего раздела является мощной командой, которая позволяет отменить любые коммиты в репозиторий. Однако, и оригинальный и «отмененный» коммиты видны в истории ветки (при использовании команды git log ).

Часто мы делаем коммит, и сразу понимаем, что это была ошибка. Было бы неплохо иметь команду «возврата», которая позволила бы нам сделать вид, что неправильного коммита никогда и не было. Команда «возврата» даже предотвратила бы появление нежелательного коммита в истории git log .

01 Команда reset

Мы уже видели команду reset и использовали ее для согласования области подготовки с выбранным коммитом (в предыдущем уроке мы использовали коммит HEAD ).

Если выполнить команду reset с указанием ссылки на коммит (т.е. метки HEAD , имени ветки или тега, хеша коммита), то команда.

  1. Изменит текущую ветку, чтобы она указывала на указанный коммит.
  2. Опционально сбросит область подготовки до соответствия с указанным коммитом.
  3. Опционально сбросит рабочую директорию до соответствия с указанным коммитом.

02 Проверьте нашу историю

Давайте сделаем быструю проверку нашей истории коммитов.

Выполните
git log 
Результат
$ git log 86364a1 2023-11-28 | Revert "Oops, we didn't want this commit" (HEAD -> main) [Alexander Shvets] 6a44bec 2023-11-28 | Oops, we didn't want this commit [Alexander Shvets] b7614c1 2023-11-28 | Added HTML header (tag: v1) [Alexander Shvets] 46afaff 2023-11-28 | Added standard HTML page tags (tag: v1-beta) [Alexander Shvets] 78433de 2023-11-28 | Added h1 tag [Alexander Shvets] 5836970 2023-11-28 | Initial commit [Alexander Shvets] 

Мы видим, что два последних коммита в этой ветке — «Oops» и «Revert Oops». Давайте удалим их с помощью сброса.

03 Для начала отметьте эту ветку

Но прежде чем удалить коммиты, давайте отметим последний коммит тегом, чтобы потом можно было его найти.

Выполните
git tag oops 
Результат
$ git log 86364a1 2023-11-28 | Revert "Oops, we didn't want this commit" (HEAD -> main, tag: oops) [Alexander Shvets] 6a44bec 2023-11-28 | Oops, we didn't want this commit [Alexander Shvets] b7614c1 2023-11-28 | Added HTML header (tag: v1) [Alexander Shvets] 46afaff 2023-11-28 | Added standard HTML page tags (tag: v1-beta) [Alexander Shvets] 78433de 2023-11-28 | Added h1 tag [Alexander Shvets] 5836970 2023-11-28 | Initial commit [Alexander Shvets] 

04 Сброс к коммиту, предшествующему oops

Глядя на историю лога (см. выше), мы видим, что коммит с тегом v1 является коммитом, предшествующим ошибочному коммиту. Давайте сбросим ветку до этой точки. Поскольку ветка имеет тег, мы можем использовать имя тега в команде сброса reset (если она не имеет тега, мы можем использовать хеш коммита).

Выполните
git reset --hard v1 git log 
Результат
$ git reset --hard v1 HEAD is now at b7614c1 Added HTML header $ git log b7614c1 2023-11-28 | Added HTML header (HEAD -> main, tag: v1) [Alexander Shvets] 46afaff 2023-11-28 | Added standard HTML page tags (tag: v1-beta) [Alexander Shvets] 78433de 2023-11-28 | Added h1 tag [Alexander Shvets] 5836970 2023-11-28 | Initial commit [Alexander Shvets] 

Наша ветка main теперь указывает на коммит v1 , а коммитов «Revert Oops» и «Oops» в ветке уже нет. Параметр —hard указывает, что рабочая директория должна быть приведена к тому состоянию, которое соответствует HEAD -коммиту ветки.

05 Ничего никогда не теряется

Что же случается с ошибочными коммитами? Оказывается, что коммиты все еще находятся в репозитории. На самом деле, мы все еще можем на них ссылаться. Помните, в начале этого урока мы создали для отмененного коммита тег oops ? Давайте посмотрим на все коммиты.

Выполните
git log --all 
Результат
$ git log --all b7614c1 2023-11-28 | Added HTML header (HEAD -> main, tag: v1) [Alexander Shvets] 86364a1 2023-11-28 | Revert "Oops, we didn't want this commit" (tag: oops) [Alexander Shvets] 46afaff 2023-11-28 | Added standard HTML page tags (tag: v1-beta) [Alexander Shvets] 6a44bec 2023-11-28 | Oops, we didn't want this commit [Alexander Shvets] 78433de 2023-11-28 | Added h1 tag [Alexander Shvets] 5836970 2023-11-28 | Initial commit [Alexander Shvets] 

Мы видим, что ошибочные коммиты не исчезли. Они все еще находятся в репозитории. Просто они отсутствуют в ветке main . Если бы мы не отметили их тегами, они по-прежнему находились бы в репозитории, но не было бы никакой возможности ссылаться на них, кроме как при помощи хешей этих коммитов. Коммиты, на которые нет ссылок, остаются в репозитории до тех пор, пока не будет запущен сборщик мусора.

06 Опасность сброса

Сброс в локальных ветках, как правило, безопасен. Последствия любой «аварии» как правило, можно восстановить простым сбросом с помощью нужного коммита.

Однако, если ветка уже стала общедоступной на удаленных репозиториях, сброс может сбить с толку других пользователей ветки.

vorozhba / Как удалить commit в Github.txt

Save vorozhba/b458077f396191a6105cf91e1739a313 to your computer and use it in GitHub Desktop.

Как удалить commit в Github

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

Как отменить последний коммит git

Тут нужно понять, что именно необходимо сделать. Потому что под отменой часто понимают удаление последнего коммита. Удалить последний коммит можно очень просто с помощью команды git reset . Причём можно как сохранить изменения в рабочей директории, так и полностью удалить все изменения сделанные в последнем коммите.

# удаляем только коммит git reset --hard HEAD~ # удаляем коммит и изменения 

А вот отменить изменения сделанные в последнем коммите можно с помощью команды git revert . Она делает еще один коммит, но с противоположными изменениями.

# нужно передать ей хеш коммита, который мы отменяем 

28 декабря 2022

Обратите внимание, что команда git reset может быть опасна, поскольку она изменяет историю репозитория. Поэтому важно следить за тем, что вы делаете, и убедиться, что вы работаете над локальным репозиторием, а не с удаленным репозиторием, так как при изменении истории удаленного репозитория у других участников могут возникнуть проблемы с синхронизацией своих локальных репозиториев.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *