Как я могу удалить коммит на GitHub?
-
19-08-2019 - |
Вопрос
Я "случайно" отправил коммит на GitHub.
Можно ли удалить этот коммит?
Я хочу вернуть мой репозиторий GitHub в то состояние, в котором он был до этого коммита.
Решение
Примечание: пожалуйста, ознакомьтесь с альтернативой
git rebase -i
в комментариях ниже—
git reset --soft HEAD^
Во-первых, удалите фиксацию в вашем локальном репозитории.Вы можете сделать это с помощью git rebase -i
.Например, если это ваш последний коммит, вы можете сделать git rebase -i HEAD~2
и удалите вторую строку в появившемся окне редактора.
Затем принудительно отправьте на GitHub, используя git push origin +branchName --force
Видишь Магия мерзавца Глава 5:Уроки истории - И затем некоторые для получения дополнительной информации (т.е.если вы хотите удалить старые коммиты).
О, и если ваше рабочее дерево грязное, вам придется сделать git stash
сначала, а затем git stash apply
после.
Другие советы
git push -f origin HEAD^:master
Это должно " отменить " толчок.
Для легкого возврата, если это просто ошибка (возможно, вы разветвили репо, а затем в итоге нажали на оригинал, а не на новый), есть еще одна возможность:
git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479
Очевидно, замените это число номером коммита, на который вы хотите вернуться. Р>
Все, что с тех пор будет удалено, когда вы нажмете снова. Для этого следующим шагом будет:
git push --force
git log
чтобы найти коммит, который вы хотите отменить
<Литий> <р> git push origin +7f6d03:master
в то время как 7f6d03 - коммит до ошибочно выдвинутого коммита.
+
было для force push
Ол>
И это все.
Здесь очень хорошее руководство, которое легко и просто решает вашу проблему!
Если вы хотите сохранить изменения в коммите после удаления:
Обратите внимание, что это решение работает, если удаляемый коммит является последним зафиксированным.
<Ч>1 - Скопируйте ссылку фиксации, к которой вы хотите вернуться, из журнала:
git log
2 - сбросить git со ссылкой на коммит:
git reset <commit_ref>
3 - сохранение / сохранение локальных изменений от неправильного коммита для последующего использования после отправки на удаленный сервер:
git stash
4 - Перенесите изменения в удаленный репозиторий (-f или --force):
git push -f
5 - вернуть сохраненные изменения в локальный репозиторий:
git stash apply
7 - Если у вас есть неотслеживаемые / новые файлы в изменениях, вам нужно добавить их в git перед фиксацией:
git add .
6 - добавьте все необходимые дополнительные изменения, затем зафиксируйте необходимые файлы (или используйте точку '.' вместо указания каждого имени файла, чтобы зафиксировать все файлы в локальном хранилище:
git commit -m "<new_commit_message>" <file1> <file2> ...
или
git commit -m "<new_commit_message>" .
Вам нужно очистить кэш, чтобы он полностью был стерт. эта страница помощи от git поможет вам. (это помогло мне) http://help.github.com/remove-sensitive-data/ р>
Используйте git revert
для отмены толчка.
git-revert - отменить некоторые существующие коммиты
git revert [--edit | --no-edit] [-n] [-m parent-number] [-s] <commit>... git revert --continue git revert --quit git revert --abort
Отмените изменения, внесенные соответствующими исправлениями, и запишите некоторые новые коммиты, которые их записывают. Это требует, чтобы ваше рабочее дерево было чистым (без изменений из коммита HEAD).
1. git reset HEAD^ --hard
2. git push origin -f
Это работа для меня.
Чтобы удалить коммит из удаленного репозитория:
git push -f origin last_known_good_commit:branch_name
Чтобы удалить коммит из вашего локального репозитория:
git reset --hard HEAD~1
Удалите самый последний коммит, сохранив проделанную вами работу.
git reset --soft HEAD~1
Удалите самый последний коммит, уничтожив проделанную вами работу.
git reset --hard HEAD~1
Найдите спецификацию ref коммита, который вы хотите сделать главой вашей ветки на Github, и используйте следующую команду:
git push origin +[ref]:[branchName]
В вашем случае, если вы просто хотите вернуться к одному коммиту, найдите начало ссылки для этого коммита, скажем, например, это 7f6d03, и название ветки, которую вы хотите изменить, скажем, например, это master, и выполните следующие действия:
git push origin +7f6d03:master
Символ плюса интерпретируется как --force
, что будет необходимо, поскольку вы переписываете историю.
Обратите внимание, что в любое время, когда вы --force
коммит, при котором вы потенциально могли бы переписать историю других пользователей, которые объединяют вашу ветку.Однако, если вы быстро обнаружите проблему (до того, как кто-либо другой объединит вашу ветку), у вас не возникнет никаких проблем.
Вам нужно знать ваш хеш коммита из коммита, к которому вы хотите вернуться. Вы можете получить его с GitHub URL, например: https://github.com/your -организация / ваш-проект / совершает / мастер
Допустим, хеш от коммита (к которому вы хотите вернуться) равен " 99fb454 " (длинная версия " 99fb45413eb9ca4b3063e07b40402b136a8cf264 "), тогда все, что вам нужно сделать, это:
git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264
git push --force
Если вы делаете это, потому что у вас есть конфиденциальные данные в коммите, использование других ответов здесь небезопасно (за исключением subutux, о котором я расскажу).
руководство github по этому вопросу рекомендует использовать внешний инструмент, но я предпочитаю использовать встроенный.
Во-первых, сделайте резервную копию вашего хранилища . Тогда:
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \
--prune-empty --tag-name-filter cat -- --all
После этого убедитесь, что репозиторий находится в нужном вам состоянии . Возможно, вы захотите сравнить с резервной копией.
Если вы уверены, что это правильно, то:
#get rid of old unreferenced commits (including the data you want to remove)
git gc --prune=now
git push origin --force --all
Вы можете на некоторое время сохранить локальную резервную копию, на всякий случай.
Запустите эту команду на своем терминале.
git reset HEAD~n
Вы можете удалить последние n коммитов из локального репо, например. ГОЛОВА ~ 2. Продолжайте с помощью git push в вашем хранилище.
git push -f origin <branch>
Надеюсь, это поможет!
Для сохранения структуры ветвления и слияния важно использовать параметр --preserve-merges
при выполнении ребазирования:
git rebase --preserve-merges -i HEAD^^
Сначала сохраните ваши локальные изменения где-нибудь на стороне ( резервная копия ).
Вы можете просмотреть свои последние коммиты, затем выбрать хэш коммита, нажав на кнопку "Скопировать полный файл SHA", чтобы отправить его в буфер обмена.
Если ваш последний хэш фиксации равен, скажем, g0834hg304gh3084gh ( например)
Ты должен бежать:
git push origin +g0834hg304gh3084gh:master
Используя хэш, который вы скопировали ранее, чтобы сделать его редакцией "HEAD".
Добавьте желаемые локальные изменения.Готово ;)
Для GitHub
- Сбросьте ваши коммиты (ЖЕСТКИЕ) в вашем локальном репозитории
- Создайте новую ветку
- Нажмите на новую ветку
- Удалить СТАРУЮ ветвь (сделайте новую ветвью по умолчанию, если вы удаляете главную ветвь)
если вы хотите удалить, сделайте интерактивную перебазировку,
git rebase -i HEAD~4
4 represents total number of commits to display count your commit and
измените его соответственно
и удалите коммит, который вы хотите из списка ...
сохраните изменения с помощью Ctrl + X (ubuntu) или : wq (centos)
2-й метод, вернитесь,
git revert 29f4a2 #your commit ID
это вернет определенный коммит
Переписывать историю не очень хорошо. Если мы используем git revert <commit_id>
, он создает чистую обратную фиксацию указанного идентификатора фиксации.
Таким образом, история не переписывается, вместо этого все знают, что произошел возврат.
Добавляйте / удаляйте файлы, чтобы все было так, как вы хотите:
git rm classdir
git add sourcedir
Затем измените коммит.
git commit --amend
Предыдущая ошибочная фиксация будет отредактирована, чтобы отразить новое состояние индекса - иными словами, вы никогда не допустили ошибку в первую очередь
Обратите внимание, что делать это следует только в том случае, если вы еще не нажали. Если вы нажали, то вам просто нужно зафиксировать исправление в обычном режиме.
В GitHub Desktop вы можете просто щелкнуть правой кнопкой мыши коммит и вернуть его, что создаст новый коммит это отменяет изменения.
Случайное принятие останется в вашей истории (что может быть проблемой, например, если вы случайно зафиксировали ключ или пароль API), но код будет отменен.
Это самый простой и легкий вариант, принятый ответ является более полным.