Поиск по сайту:

Как удалить коммит с 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 есть инструменты для решения этой проблемы. Вы можете прочитать наше руководство по перемещению коммитов, чтобы узнать больше, но применяются те же принципы — если вам нужно полностью удалить коммит, вы должны выполнить принудительный сброс. Если у вас все в порядке с возвратом, вы можете просто вернуться и выбрать вишневый.