Как я могу удалить коммит на GitHub?

1261

Я "случайно" нажал фиксацию на GitHub.

Можно ли удалить эту фиксацию?

Я хочу вернуть репозиторий GitHub, как и до этого.

  • 163
    Предостережение : никогда не делайте этого, когда у вас много людей, следующих за вашим репозиторием, вы сделаете их локальный репозиторий не синхронизированным, если они внесут последние изменения. Если это касается ошибки, вы можете просто сделать еще один коммит, чтобы исправить ошибку. Если это касается пароля, вы можете вместо этого изменить пароль и не спешите его удалять. Форсирование вещей не обходится без недостатков.
  • 126
    Слово предостережения 2: коммит все еще может быть доступен напрямую через SHA1. Force push не удаляет коммит, он создает новый и перемещает на него указатель файла. Чтобы действительно удалить коммит, вы должны удалить весь репо.
Показать ещё 9 комментариев
Теги:
github

20 ответов

962
Лучший ответ

Примечание: см. альтернативу git rebase -i в комментариях ниже -

git reset --soft HEAD^

Сначала удалите фиксацию в локальном репозитории. Вы можете сделать это, используя git rebase -i. Например, если это ваша последняя фиксация, вы можете сделать git rebase -i HEAD~2 и удалить вторую строку в появившемся окне редактора.

Затем, принудительно нажмите на GitHub, используя git push origin +branchName

Подробнее см. Git Волшебная глава 5: Уроки истории - и некоторые другие (например, если вы хотите удалить старые коммиты).

О, и если ваше рабочее дерево загрязнено, вы должны сначала выполнить git stash, а затем git stash apply после.

  • 12
    Точнее, вы / должны / копить, потому что git rebase -i не позволит вам, если у вас грязное дерево.
  • 1
    Никакая модификация локального дерева не требуется вообще, чтобы удовлетворить запрос пользователей.
Показать ещё 13 комментариев
757
git push -f origin HEAD^:master

Это должно "отменить" нажатие.

  • 31
    Это тоже работало нормально! Это удаляет push из github, но оставляет мой локальный репозиторий нетронутым. Спасибо!
  • 11
    Ну да. Он делает только то, что вы просили. :) Ваш репозиторий и удаленный репозиторий не обязательно должны иметь соответствующие ссылки.
Показать ещё 12 комментариев
245

Для простого возврата, если это просто ошибка (возможно, вы разветкили репо, а затем вернулись к оригиналу, а не к новой), вот еще одна возможность:

git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479

Очевидно, поменять местами число, на которое вы хотите вернуться.

Все с тех пор будет удалено после повторного нажатия. Для этого следующим шагом будет:

git push --force
  • 5
    ВНИМАНИЕ: Это перезапишет вашу историю, вы потеряете коммит и, как правило, не очень хорошая вещь для совместной работы.
  • 6
    Да, это было самым простым и лучшим для меня. Мой dev-форк нужно было перевернуть, прежде чем я смог отправить PR для чего-то другого. Я должен был положить свои изменения в ветку для начала.
Показать ещё 3 комментария
56
  • git log чтобы узнать коммит, который вы хотите вернуть

  • git push origin +7f6d03:master в то время как 7f6d03 является фиксацией перед ошибочным нажатием фиксации. + был для force push

И что это.

Здесь - очень хорошее руководство, которое решает вашу проблему, легко и просто!

  • 2
    Я рекомендую это руководство, очень полезно в этом.
  • 0
    Лучший ответ! Что происходит так ясно
35

Вам нужно будет очистить свой кеш, чтобы полностью стереть его. эта страница справки из git поможет вам. (это помогло мне) http://help.github.com/remove-sensitive-data/

  • 9
    +1: при удалении коммита из вашей ветки, он все еще доступен на GitHub, если вы знаете URL / SHA-1. Единственный способ удалить фиксацию из кэша - обратиться в службу поддержки GH (см. Раздел «Кэшированные данные на Github» в этой ссылке).
  • 4
    Я хочу отметить, что, возможно, лучше было бы на самом деле объяснить, что находится на странице, и процитировать соответствующие разделы. В справочном руководстве говорится: «Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели представление о том, что это такое и зачем оно есть. Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно недоступен. " Основное правило: притвориться, что ссылки нет, или они не могут щелкнуть по ней.
Показать ещё 1 комментарий
20

Используйте 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 не было).

  • 11
    Это рекомендуемый способ избежать разрушения чужих клонов. Он создает новый коммит, который отменяет предыдущий коммит. Однако это не отвечает на вопрос, который должен был удалить коммит из «истории».
  • 0
    многие другие ответы хороши, но это единственный способ, который работает, если вы не можете заставить насильно толкать.
15
1. git reset HEAD^ --hard
2. git push origin -f

Эта работа для меня.

  • 0
    Говорит "Все актуально", когда коммит уже передан в GitHub ...
  • 0
    Если коммит A является верхним, B является вторым. Какой коммит вы хотите сбросить?
Показать ещё 3 комментария
12

Если вы хотите сохранить изменения фиксации после удаления:

1 - Скопируйте ссылку на фиксацию, которую хотите вернуться в журнал:

git log

2 - Reset 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>" .
  • 1
    Спасибо! Я был просто счастлив вернуть его до 5. Тогда я мог работать с изменениями в github desktop.
11

Чтобы удалить фиксацию из удаленного репозитория:

 git push -f origin last_known_good_commit:branch_name

Чтобы удалить фиксацию из вашего локального репозитория:

git reset --hard HEAD~1

ссылка

8

Найдите спецификацию ref фиксации, которую вы хотите возглавить ветки на Github, и используйте следующую команду:

git push origin +[ref]:[branchName]

В вашем случае, если вы просто хотите вернуться к одной фиксации, найдите начало ссылки для этой фиксации, скажем, например, 7f6d03 и имя ветки, которую вы хотите изменить, например, это мастер и выполните следующие действия:

git push origin +7f6d03:master

Символ "плюс" интерпретируется как --force, который будет необходим, поскольку вы переписываете историю.

Обратите внимание, что в любое время, когда вы --force совершите, вы могли бы переписать историю других народов, которые объединили вашу ветку. Однако, если вы быстро поймаете проблему (прежде чем кто-либо еще скроет вашу ветку), у вас не будет проблем.

7

Вам нужно знать свой хеш фиксации из фиксации, к которой вы хотите вернуться. Вы можете получить его с помощью URL-адреса GitHub, например: https://github.com/your-organization/your-project/commits/master

Скажем, хэш из фиксации (где вы хотите вернуться) - "99fb454" (длинная версия "99fb45413eb9ca4b3063e07b40402b136a8cf264" ), тогда вам нужно всего лишь:

git reset --hard 99fb45413eb9ca4b3063e07b40402b136a8cf264
git push --force
  • 0
    ИМХО это ЛУЧШИЙ ответ здесь
5

Если вы делаете это, потому что у вас есть конфиденциальные данные в фиксации, использование других ответов здесь небезопасно (за исключением 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

Возможно, вы захотите временно сохранить локальную резервную копию на всякий случай.

  • 0
    Связанный: stackoverflow.com/questions/872565/… Я думаю, что этого метода недостаточно, данные все еще доступны через фиксацию.
3

Чтобы сохранить структуру ветвления и слияния, важно использовать параметр --preserve-merges при выполнении rebase:

git rebase --preserve-merges -i HEAD^^
  • 0
    Примечание: не рекомендуется использовать --preserve-merges --interactive и --interactive вместе. Смотрите раздел ошибок на ребаз
2

Сохраните локальные изменения сначала где-нибудь сбоку (резервное копирование)

Вы можете просмотреть последние коммиты, а затем выбрать хеш фиксации, нажав на "Скопировать полный SHA", чтобы отправить его в буфер обмена.

Если ваш последний хэш-код фиксации, скажем, g0834hg304gh3084gh (например)

Вам нужно запустить:

git push origin +g0834hg304gh3084gh:master

Использование хеша, который вы скопировали ранее, чтобы сделать его ревизией "HEAD".

Добавьте необходимые локальные изменения. Готово;)

1

Запустите эту команду на своем терминале.

git reset HEAD~n

Вы можете удалить последние n коммитов из локального репо, например. ГОЛОВА ~ 2. Продолжайте с помощью силы git нажмите на свой репозиторий.

git push -f origin <branch>

Надеюсь, это поможет!

0

Удалите последнюю фиксацию, сохраняя выполненную вами работу:

git reset --soft HEAD~1

Удалите последнее коммит, уничтожив выполненную работу:

git reset --hard HEAD~1
  • 1
    как насчет толчка после?
0

если вы хотите удалить интерактивную перезагрузку,

git rebase -i HEAD~4

4 represents total number of commits to display count your commit and измените его соответственно

и удалить фиксацию из списка...

сохранить изменения Ctrl + X (ubuntu) или : wq (centos)

Второй метод, верните,

git revert 29f4a2 #your commit ID

это приведет к возврату определенного фиксации

0

Для GitHub - Reset ваши коммиты (HARD) в вашем локальном репо и создайте новую ветку. Нажмите новый. Удалить ветку OLD. (Создайте новый как ветвь по умолчанию, если вы удаляете ветвь мастера)

0

Добавить/удалить файлы, чтобы получить то, что вам нужно:

git rm classdir
git add sourcedir

Затем измените фиксацию:

git commit --amend

Предыдущая ошибочная фиксация будет отредактирована, чтобы отразить новое состояние индекса - другими словами, это будет так, как будто вы никогда не ошиблись в первую очередь

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

  • 0
    Это создаст дополнительную ревизию ... без изменений
-3

Не очень хорошо переписать историю. Если мы используем git revert <commit_id>, он создает чистую обратную фиксацию указанного идентификатора фиксации.

Таким образом, история не переписана, но все знают, что произошел возврат.

  • 0
    Этот старый ответ уже говорит пользователю git revert .
  • 0
    Это не соответствует этому требованию: «Я хочу вернуть свой репозиторий GitHub, как это было до этой фиксации»

Ещё вопросы

Сообщество Overcoder
Наверх
Меню