Я читал похожие посты на эту тему и не могу понять, как это сделать правильно.
Я зарегистрировал около 1000 файлов, которые мне не нужны, и я бы предпочел не проходить 1by1 и удалить их все из репо.
- У меня есть удаленный
master
филиал. - У меня есть местное
master
отделение.
Они оба в одной ревизии.
Я хочу откатить свой пульт на 1 коммит.
Скажи мою историю на master
том A--B--C--D--E
.
Я хочу откатить свой локальный до D
.
Затем отправьте его на удаленный компьютер, чтобы мой текущий хеш был D удаленным и локальным.
У меня проблемы с этим.
Я использую Git Tower, но мне удобно работать с командной строкой. Любая помощь?
ОБНОВЛЕНИЕ: большие комментарии ниже. Использование сброса не рекомендуется, особенно если хранилище используется совместно с другими пользователями. Каков наилучший способ отменить изменения предыдущего коммита без использования аппаратного сброса ? Есть ли способ?
git revert
для выполнения без полной перезагрузки и не мешая пользователям.Ответы:
Если никто еще не вытащил ваше удаленное репо, вы можете изменить заголовок ветки и принудительно перенести его в указанное удаленное репо:
(или, если у вас есть прямой доступ к удаленному репо, вы можете изменить его ссылку на HEAD, даже если это пустое репо )
Обратите внимание, что, как прокомментировал Alien-Technology в комментариях ниже , для Windows (сеанс CMD), вам потребуется
^^
:Обновление с 2011 года:
использование
git push --force-with-lease
( которое я представляю здесь , представленное в 2013 году с Git 1.8.5) более безопасно.См Schwern «s ответ на иллюстрации.
Тогда я бы предложил что-то, что не переписывает историю:
git revert
локально ваш последний коммит (создание нового коммита, который полностью изменяет то, что делал предыдущий коммит)git revert
.источник
reset --hard HEAD^
а неreset --hard HEAD^^
сбрасывать последний коммит.Установить локальную ветвь на одну ревизию назад (
HEAD^
значит, на одну ревизию назад):Нажмите изменения к источнику:
Вам придется принудительно нажимать, потому что в противном случае git признает, что вы отстали
origin
на один коммит, и ничего не изменится.Выполнение этого
--force
заставляет git перезаписыватьHEAD
в удаленном репо без учета каких-либо достижений.источник
git push origin master
, Git сможет создать новый коммит на удаленном компьютере, потому что локальная ветвь впереди хотя бы один раз? Кроме того, последнее должно существенно отличаться от того, на что указывает руководитель удаленного репо?Если вы хотите отменить последний коммит, прослушайте:
Шаг 1:
Проверьте ваши локальные коммиты с сообщениями
Шаг 2:
Удалить последний коммит без сброса изменений из локальной ветки (или мастера)
ИЛИ, если вы не хотите, чтобы последние файлы коммитов и обновления слушали
Шаг 3:
Мы можем обновить файлы и коды и снова нажать с силой, чтобы удалить предыдущий коммит. Это сохранит новый коммит.
Это оно!
источник
Введя ниже команду, вы можете увидеть историю ваших изменений в git -
$ git log
Допустим, ваша история в этой конкретной ветке похожа на - commit_A, commit_B, commit_C, commit_D. Где commit_D - последний коммит, и именно здесь HEAD остается. Теперь, чтобы удалить ваш последний коммит из локального и удаленного, вам нужно сделать следующее:
Шаг 1: Удалить последний коммит локально с помощью -
$ git reset --hard HEAD ~
Это изменит ваш коммит HEAD на commit_C
Шаг 2. Переместите изменения для новой фиксации HEAD на удаленный
$ git push origin + HEAD
Эта команда удалит последний коммит из удаленного.
PS Эта команда протестирована на Mac OSX и должна работать и на других операционных системах (хотя и не на других ОС)
источник
Для Windows машин используйте:
источник
Вот обновленная версия процедуры, которая безопаснее.
git push -f
без разбора заменит удаленный репозиторий на ваши собственные изменения. Если кто-то еще внес изменения, они будут потеряны.git push --force-with-lease
только подтолкнет ваш ребаз, если репозиторий будет таким, как вы ожидаете. Если кто-то еще нажал, ваш толчок потерпит неудачу.Видите - сила считается вредной; понимание мерзавца - сила с арендой .
Я рекомендую псевдоним это
repush = push --force-with-lease
.Скажи им
git pull --rebase=merges
. Вместо а такgit fetch origin
иgit merge origin/master
будетgit fetch origin
иgit rebase -r origin/master
. Это перезапишет любые их локальные измененияmaster
поверх новых перебазированныхorigin/master
.-r
сохранит любые слияния, которые они могли сделать.Я рекомендую сделать это поведение по умолчанию для вытягивания. Это безопасно, будет обрабатывать перебазирование других и приводит к меньшему количеству ненужных слияний.
источник
--force-with-lease
опции.Я решил проблему, подобную вашей, с помощью следующих команд:
источник
Если у вас есть прямой доступ к удаленному репо, вы всегда можете использовать:
Это работает, поскольку нет попытки изменить несуществующий рабочий каталог. Для более подробной информации, пожалуйста, смотрите оригинальный ответ:
Как я могу отменить последний коммит в репозитории git bare?
источник
Я просто хотел удалить последний коммит из удаленной и очистить историю коммитов. Следующее работает как шарм
источник
Сбросить голову и вернуться к предыдущему коммиту можно через
Но иногда это может быть не принято в удаленной ветке:
тогда другой способ сделать это
Это отлично работает.
ПРИМЕЧАНИЕ: запомните, если произошел
git push -f <force>
сбой, а затем попытайтесь вернуться. Сделайте этоgit pull
раньше, чтобы удаленный и локальный синхронизировались, а затем попробуйтеgit revert
.Проверьте,
git log
чтобы убедиться, что удаленный и локальный находятся в одной точке фиксации с тем же SHA1.источник
на местного мастера
Не нужно беспокоиться, если другие потянули или нет.
Готово!
источник
Если вы хотите удалить только последний коммит из удаленного репозитория, не путаясь с вашим локальным репозиторием, вот одна строка:
Это использует следующий синтаксис:
Здесь
<remote>
естьorigin
и<refspec>
имеет следующую структуру:Подробности можно найти в
git-push(1)
. Предыдущее+
означает «принудительное нажатие на эту ссылку», а другая часть означает «отorigin/master~
кmaster
(удаленногоorigin
)». Нетрудно понять, чтоorigin/master~
это последний коммитorigin/master
, верно?источник
у меня работает эта две команды:
источник
Вы также можете сделать это:
и сделайте так, чтобы все остальные, кто получил последние сбросы плохих коммитов:
источник