Откат локального и удаленного репозитория git на 1 фиксацию
Я читал подобные сообщения по этой теме и не могу для жизни меня выяснить, как это сделать должным образом.
Я проверил около 1000 файлов, которые мне не нужны, и мне бы не пришлось проходить через 1by1 и удалить их из репо.
- У меня есть удаленный ветвь
master
.
- У меня есть локальный ветвь
master
.
Они оба в той же версии.
Я хочу отменить мой пульт на 1 фиксацию.
Скажите, что моя история на master
равна A--B--C--D--E
.
Я хочу отменить мой локальный на D
.
Затем нажмите на пульте дистанционного управления, чтобы мой текущий хэш был как D, так и локальным.
У меня возникают проблемы с этим.
Я использую Git Tower, но мне удобнее работать с командной строкой. Любая помощь?
UPDATE:
Замечательные комментарии ниже. Использование reset, кажется, частично обескуражено, особенно если репозиторий используется совместно с другими пользователями.
Какой лучший способ отменить предыдущие изменения фиксации без использования жесткого reset? Есть ли способ?
Ответы
Ответ 1
Если никто еще не удалил ваше удаленное репо, вы можете изменить свою ветку HEAD и принудительно нажать ее на указанное дистанционное репо:
git reset --hard HEAD^
git push -f
(или, если у вас есть прямой доступ к удаленному репо, вы можете изменить его ссылку HEAD, хотя это голое репо)
Обратите внимание, что в alien-technology в комментариях ниже в Windows (сеанс CMD), вам понадобится ^^
:
git reset --hard HEAD^^
git push -f
Что, если кто-то уже потянул репо? Что бы я тогда сделал?
Тогда я бы предложил что-то, что не переписывает историю:
-
git revert
локально ваше последнее совершение (создание нового фиксации, которое отменяет то, что сделал предыдущий фиксатор)
- нажмите 'revert', сгенерированный
git revert
.
Ответ 2
Установите локальную ветвь на одну ревизию назад (HEAD^
означает одну ревизию):
git reset --hard HEAD^
Введите изменения в начало координат:
git push --force
Вам придется принудительно нажать, потому что иначе git распознает, что вы отстаете от origin
на один коммит и ничего не изменится.
Выполнение этой операции с помощью --force
сообщает git перезаписать HEAD
в удаленном репо без каких-либо изменений.
Ответ 3
Если вы хотите вернуть последнее сообщение фиксации:
Шаг 1:
Проверьте свои локальные сообщения с сообщениями
$ git log
Шаг 2:
Удалить последнюю фиксацию без сброса изменений из локальной ветки (или главной)
$ git reset HEAD^
ИЛИ если вы не хотите, чтобы последние файлы фиксации и обновления прослушивались
$ git reset HEAD^ --hard
Шаг 3:
Мы можем обновлять файлы и коды и снова нуждаться в силе, чтобы удалить предыдущую фиксацию. Он будет сохранять новую фиксацию.
$ git push origin branch -f
Что это!
Ответ 4
Вводя команду ниже, вы можете увидеть свою историю 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
Эта команда удалит последнюю фиксацию с удаленного.
P.S. эта команда протестирована на Mac OSX и должна работать и на других операционных системах (не говоря уже о других ОС)
Ответ 5
Для Windows-машин используйте:
git reset HEAD~1 #Remove Commit Locally
Ответ 6
Я решил эту проблему, как ваш, следующими командами:
git reset --hard HEAD^
git push -f <remote> <local branch>:<remote branch>
Ответ 7
Если у вас есть прямой доступ к удаленному репо, вы всегда можете использовать:
git reset --soft HEAD^
Это работает, поскольку нет попытки изменить несуществующий рабочий каталог. Для получения дополнительной информации см. Оригинальный ответ:
Как я могу раскрыть последнее коммит в git голом репозитории?
Ответ 8
Я просто хотел удалить последнюю фиксацию из удаленной и чистой истории фиксации.
Следующее работало как шарм
git reset --hard HEAD^
git push -f
Ответ 9
Путь к reset голова и возврат к предыдущему фиксации осуществляется через
$ git reset HEAD^ --hard
$ git push <branchname> -f
Но иногда это может быть не принято в удаленной ветке:
To ssh:<git repo>
! [rejected] develop -> develop (non-fast-forward)
error: failed to push some refs to 'ssh:<git repo>'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
то другой способ сделать это
git revert HEAD
git push <remote branch>
Это отлично работает.
ПРИМЕЧАНИЕ: помните, если git push -f <force>
не удалось, а затем вы попытаетесь вернуться. Сделайте git pull
раньше, чтобы удаленные и локальные синхронизировались, а затем попробуйте git revert
.
Проверьте с помощью git log
, чтобы убедиться, что удаленный и локальный находятся в одной точке фиксации с тем же SHA1..
git revert
A --> B --> C -->D
A--> B --> C --> D --> ^D(taking out the changes and committing reverted diffs)
Ответ 10
на локальном главном
git reflog
-- this will list all last commit
e.g [email protected]{0} -- wrong push
[email protected]{1} -- correct push
git checkout [email protected]{1} .
-- this will reset your last modified files
git status
git commit -m "reverted to last best"
git push origin/master
Не нужно беспокоиться, если другой потянул или нет.
Готово!
Ответ 11
Если вы хотите удалить только последний коммит из удаленного репозитория, не путаясь с вашим локальным репозиторием, вот одна строка:
git push origin +origin/master~:master
Это использует следующий синтаксис:
git push <remote> <refspec>
Здесь <remote>
является origin
, а <refspec>
имеет следующую структуру:
+origin/master~:master
Подробности можно найти в git-push(1)
. Предыдущий +
означает "принудительно нажать эту ссылку", а другая часть означает "от origin/master~
к master
(удаленного origin
)". Нетрудно понять, что origin/master~
является последним коммитом перед origin/master
, верно?