Я совершил ошибку и не знаю, как удалить последнюю пушку в репозитории. Я загружаю последние обновления приложения, но у них есть конфликты, и я отправляю их в репозиторий.
Как удалить мой последний коммит? Или как исправить?
Ответы:
Во-первых, если вы работаете с другими людьми в одном и том же репозитории кода, вам не следует удалять фиксацию, поскольку, когда вы принудительно обновляете репозиторий, он оставит локальные репозитории ваших коллег в незаконном состоянии (например, если они сделал коммиты после того, который вы удалили, эти коммиты будут недействительными, поскольку они были основаны на несуществующем коммите).
Сказал, что вы можете отменить фиксацию. Эта процедура выполняется по-разному (разные команды) в зависимости от используемой вами CVS:
В git :
git revert <commit>
О ртутном :
hg backout <REV>
РЕДАКТИРОВАТЬ: операция возврата создает новую фиксацию, которая делает противоположность отмененной фиксации (например, если исходная фиксация добавила строку, возвратная фиксация удаляет эту строку), эффективно удаляя изменения нежелательной фиксации без перезаписи истории репозитория.
git backout <REV>
? Или hg backout <REV>
:?
Если вы не работаете с другими (или счастливы причинить им серьезное раздражение) , то можно удалить коммиты из веток bitbucket.
git reset HEAD^ # remove the last commit from the branch history
git push origin :branch_name # delete the branch from bitbucket
git push origin branch_name # push the branch back up again, without the last commit
Обычно в git ветка master не является особенной - это просто соглашение. Однако bitbucket, github и подобные сайты обычно требуют наличия основной ветки (предположительно потому, что это проще, чем писать дополнительный код для обработки события, что в репозитории нет веток - не уверен). Итак, вам нужно создать новую ветку и сделать ее основной:
# on master:
git checkout -b master_temp
git reset HEAD^ # undo the bad commit on master_temp
git push origin master_temp # push the new master to Bitbucket
На Bitbucket перейдите в настройки репозитория и измените «Основную ветку» на master_temp
(на Github измените «Ветвь по умолчанию»).
git push origin :master # delete the original master branch from Bitbucket
git checkout master
git reset master_temp # reset master to master_temp (removing the bad commit)
git push origin master # re-upload master to bitbucket
Теперь перейдите в Bitbucket, и вы должны увидеть нужную историю. Теперь вы можете перейти на страницу настроек и снова изменить главную ветку на master
.
Этот процесс также будет работать с любыми другими изменениями истории (например, git filter-branch
). Вам просто нужно убедиться, что вы сбросили соответствующие коммиты, прежде чем новая история отделится от старой.
редактировать : очевидно, вам не нужно возиться со всеми этими хлопотами на github, так как вы можете принудительно нажать ветку сброса .
В следующий раз, когда кто-нибудь попытается извлечь из вашего репозитория (если они уже извлекли плохую фиксацию), извлечение завершится ошибкой. Им придется вручную выполнить сброс до фиксации перед измененной историей, а затем снова выполнить операцию.
git reset HEAD^
git pull
Если они сделали плохую фиксацию, и зафиксировали поверх нее , то им придется сбросить, а затем git cherry-pick
хорошие коммиты, которые они хотят создать, эффективно воссоздавая всю ветку без плохой фиксации.
Если они никогда не извлекали плохую фиксацию, то весь этот процесс на них не повлияет, и они могут вытащить как обычно.
вы можете выполнить сброс, а HEAD^
затем принудительно нажать его.
git reset HEAD^
git push -u origin master --force
Он удалит вашу последнюю фиксацию и отразится на битбакете как удаленная фиксация, но все равно останется на их сервере.
Вот простой подход, состоящий из 4 шагов:
0 - Сообщите команде, что собираетесь исправить репозиторий
Свяжитесь с командой и сообщите им о грядущих изменениях.
1 - Удалить последнюю фиксацию
Предполагая, что ваша целевая ветка master
:
$ git checkout master # move to the target branch
$ git reset --hard HEAD^ # remove the last commit
$ git push -f # push to fix the remote
На этом все готово, если вы работаете в одиночку.
2 - Исправьте локальные репозитории вашего товарища по команде
От вашего товарища по команде:
$ git checkout master # move to the target branch
$ git fetch # update the local references but do not merge
$ git reset --hard origin/master # match the newly fetched remote state
Если у вашего товарища по команде не было новых коммитов, на этом вы закончили и должны синхронизироваться.
3 - Восстановление потерянных коммитов
Допустим, у товарища по команде был новый и неопубликованный коммит, который был утерян в этом процессе.
$ git reflog # find the new commit hash
$ git cherry-pick <commit_hash>
Сделайте это для необходимого количества коммитов.
Я много раз успешно использовал этот подход. Требуются командные усилия, чтобы убедиться, что все синхронизировано.
У меня были проблемы с git revert в прошлом (в основном потому, что я не совсем уверен, как это работает). У меня были проблемы с возвратом из-за проблем слияния ..
Мое простое решение таково.
Шаг 1.
git clone <your repos URL> .
ваш проект в другой папке, затем:
Шаг 2.
git reset --hard <the commit you wanna go to>
затем Шаг 3.
в вашем последнем (и основном) каталоге проекта (тот, который имеет проблемную последнюю фиксацию) вставьте файлы шага 2
Шаг 4.
git commit -m "Fixing the previous messy commit"
Шаг 5.
наслаждаться
git revert
прост: он создает новую фиксацию, которая выполняет обратные изменения в предыдущей фиксации (или нескольких фиксациях). Он не удаляет коммиты, поэтому не имеет отношения к этому вопросу. Кроме того, шаг клонирования здесь не нужен.
Как говорили другие, обычно вы хотите использовать hg backout
илиgit revert
. Однако иногда очень хочется избавиться от фиксации.
Во-первых, вам нужно перейти в настройки вашего репозитория. Щелкните Strip commits
ссылку.
Введите идентификатор набора изменений, который нужно уничтожить, и щелкните Preview strip
. Это позволит вам увидеть, какой ущерб вы собираетесь нанести, прежде чем вы его нанесете. Затем просто нажмите, Confirm
и ваша фиксация больше не будет историей. Убедитесь, что вы рассказали всем своим соавторам о том, что вы сделали, чтобы они случайно не вернули ошибочную фиксацию.
После того, как изменения будут зафиксированы, их нельзя будет удалить. потому что основная природа фиксации - не удалять.
То, что вы можете сделать (простой и безопасный метод),
Интерактивная база:
1) git rebase -i HEAD~2
# покажет ваши последние 2 коммита
2) Ваша фиксация будет отображаться как «Недавние», которые появятся внизу страницы LILO (последний в Last Out)
Полностью удалить последнюю строку фиксации
3) сохраните его ctrl+X
илиESC:wq
теперь ваша ветка будет обновлена без вашей последней фиксации ..
К настоящему времени облачный битбакет (я не уверен, какая версия) позволяет откатить фиксацию из файловой системы следующим образом (я не вижу, как вернуться из интерфейса Bitbucket в браузере Chrome).
- сделайте резервную копию всего каталога, чтобы обезопасить внесенные вами непреднамеренно изменения
-выбрать извлеченный каталог
-правая кнопка мыши: меню git черепахи
-repo-browser (опция меню 'вернуться' отменяет только незавершенные изменения)
-нажать кнопку HEAD
-выбираем самую верхнюю строку (последняя фиксация)
-правая кнопка мыши: отменить изменение этой фиксации
-после отмены изменений в файловой системе нажмите кнопку фиксации
-это обновляет GIT сообщением "Вернуть предыдущее сообщение". Это отменяет фиксацию того-то и такого-то '
-выберите «зафиксировать и нажать».