Откат локального и удаленного репозитория 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, верно?