Откат локального и удаленного репозитория git на 1 коммит - PullRequest
163 голосов
/ 10 января 2011

Я читал похожие посты на эту тему и не могу понять, как это сделать правильно.

Я зарегистрировал около 1000 файлов, которые мне не нужны,и я бы предпочел не проходить через 1by1 и удалить их все из репозитория.

  • У меня есть удаленный master Филиал.
  • Iиметь локальную master ветвь.

Они обе с одной и той же ревизией.

Я хочу откатить свой пульт на 1 коммит.

Скажите, что моя история на master равна A--B--C--D--E.
Я хочу откатить локальную область до D.
Затем перенесите ее на удаленный доступ, чтобы мой текущий хэш был Dкак удаленный, так и локальный.

У меня проблемы с этим.
Я использую Git Tower, но мне удобно с командной строкой.Любая помощь?

ОБНОВЛЕНИЕ: Замечательные комментарии ниже.Использование сброса не рекомендуется, особенно если хранилище используется совместно с другими пользователями. Каков наилучший способ отменить изменения предыдущего коммита без использования аппаратного сброса ?Есть ли способ?

Ответы [ 11 ]

267 голосов
/ 10 января 2011

Если никто еще не вытащил ваше удаленное репо, вы можете изменить заголовок филиала и принудительно перенести его в указанное удаленное репо:

git reset --hard HEAD^ 
git push -f 

(или, если у вас есть прямой доступ к удаленному репо, вы можете изменить его ссылку HEAD, даже если это голое репо )

Обратите внимание, что, как прокомментировали alien-technology в комментариях ниже , в Windows (сеанс CMD) вам потребуется ^^:

git reset --hard HEAD^^
git push -f 

Что, если кто-то уже вытащил репо? Что бы я тогда делал?

Тогда я бы предложил что-то, что не переписывает историю:

  • git revert локально ваш последний коммит (создание нового коммита, который отменяет предыдущий коммит)
  • нажмите 'revert', сгенерированный git revert.
52 голосов
/ 10 января 2011

Установить локальную ветвь на одну ревизию назад (HEAD^ означает одну ревизию назад):

git reset --hard HEAD^

Нажмите изменения к источнику:

git push --force

Вам придется принудительно толкать, потому что в противном случае git узнает, что вы отстали от origin на один коммит, и ничего не изменится.

Выполнение этого с помощью --force говорит git перезаписать HEAD в удаленном репо без учета каких-либо достижений.

17 голосов
/ 31 октября 2013

Если вы хотите отменить прослушивание последнего коммита:

Шаг 1:

Проверьте локальные коммиты с сообщениями

$ git log

Шаг 2:

Удалить последний коммит без сброса изменений из локальной ветви (или мастера)

$ git reset HEAD^

ИЛИ, если вы не хотите, чтобы файлы последнего обновления и обновления слушали

$ git reset HEAD^ --hard

Шаг 3:

Мы можем обновить файлы и коды и снова нажать с силой, чтобы удалить предыдущий коммит.Он сохранит новый коммит.

$ git push origin branch -f

Вот и все!

6 голосов
/ 05 мая 2017

Введя нижеприведенную команду, вы можете увидеть свою историю коммитов git -

$ git log

Допустим, ваша история в этой конкретной ветке похожа на, commit_C, commit_D.Где commit_D - последний коммит, и именно здесь HEAD остается.Теперь, чтобы удалить ваш последний коммит из локального и удаленного, вам нужно сделать следующее:

Шаг 1: Удалить последний коммит локально с помощью -

$ git reset --hard HEAD~

Это изменит ваш коммит HEAD на commit_C

Шаг 2: Нажмите ваше изменение для нового коммита HEAD на удаленный

$ git push origin +HEAD

Эта команда удалит последний коммит с удаленного компьютера.

PS Эта команда протестирована на Mac OSX и также должна работать в других операционных системах (не требуяхотя другие ОС)

2 голосов
/ 20 июня 2014

Для Windows Machines используйте:

git reset HEAD~1  #Remove Commit Locally
1 голос
/ 07 марта 2015

Я решил проблему, подобную вашей, с помощью следующих команд:

git reset --hard HEAD^
git push -f <remote> <local branch>:<remote branch> 
0 голосов
/ 06 июня 2019

Если вы хотите удалить только последний коммит из удаленного репозитория, не связываясь с локальным репозиторием, вот одна строка:

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, верно?

0 голосов
/ 11 апреля 2016

на местном мастере

git reflog
-- this will list all last commit
  e.g Head@{0} -- wrong push
      Head@{1} -- correct push  
git checkout Head@{1} .
  -- this will reset your last modified files

git status 
git commit -m "reverted to last best"
git push origin/master

Не нужно беспокоиться, если другие потянули или нет.

Готово! * * 1006

0 голосов
/ 03 декабря 2015

Способ сброса головы и возврата к предыдущей фиксации - через

$ 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)
0 голосов
/ 12 августа 2015

Я просто хотел удалить последний коммит из удаленной и очистить историю коммитов.Следующее сработало как шарм

git reset --hard HEAD^ 
git push -f 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...