Как отменить git pull?


238

Я хотел бы отменить мой git pull из-за нежелательных коммитов на удаленном источнике, но я не знаю, к какой ревизии мне нужно вернуться обратно.

Как я могу просто вернуться в состояние до того, как я сделал git на удаленном источнике?


4
Примечание: вы можете git fetch upstreamсначала найти это полезным , а затем быстро взглянуть на git diff upstream/branchто, что вы будете объединять. Если все хорошо, тогда продолжайтеgit merge upstream/branch
Шахбаз

1
Вы потеряете весь свой уличный кредит и будете пристыкованы к зарплате за неделю, если какой-нибудь хипстерский программист увидит, что вы выполняете команды git из графического интерфейса, но и у GitHub Desktop, и у Atom есть безопасные, простые кнопки для undoфиксации и флажки для простой и четкой постановки и удаления файлов. GUI тоже люди!
Дем

Ответы:


391

Или сделать его более явным, чем другой ответ:

git pull 

упс?

git reset --keep HEAD@{1}

Версии git старше 1.7.1 не имеют --keep. Если вы используете такую ​​версию, вы можете использовать --hard- но это опасная операция, потому что она теряет все локальные изменения.


Комментатору

ORIG_HEAD - это предыдущее состояние HEAD, устанавливаемое командами, которые могут иметь опасное поведение, чтобы их было легко вернуть. Теперь менее полезно использовать Git reflog: HEAD @ {1} примерно эквивалентно ORIG_HEAD (HEAD @ {1} всегда является последним значением HEAD, ORIG_HEAD - последним значением HEAD перед опасной операцией)


2
В чем разница между HEAD @ {1} и HEAD ^?
огромный день

7
@ Hugemeow Это был бы хороший вопрос ТАК. Тем временем man git-rev-parseописывает это. HEAD@{1}это предыдущее значение символического HEADв reflogто время как HEAD^это (первая) материнская редакция тока HEAD. Эти два не должны быть эквивалентными (например, после перебазировки, полной перезагрузки, переключения веток и тому подобного). Прочитайте связанную статью для reflog. Приветствия
sehe

10
Пользователи PowerShell, убегайте от скобок с обратной чертой:git reset HEAD@`{1`}
Роберт Клэйпул

3
ss64.com/ps/syntax-esc.html Я думаю, что вы хотели напечатать HEAD@`{1`}или, в этом отношении, сделать то, что работает и на POSIX-оболочках:'HEAD@{1}'
sehe

2
Я думаю, что это не только сбросить тягу, но и мои коммиты = (
falsarella

67

git reflog showдолжен показать вам историю HEAD. Вы можете использовать это, чтобы выяснить, где вы были до pull. Затем вы можете resetваш HEADк этой фиксации.


git reflog show выдает следующие выходные данные: c9e5e4d HEAD @ {0}: вытягивание: ускоренная перемотка вперед 1c86a22 HEAD @ {1}: вытягивание исходного источника: ускоренная перемотка 05c141a HEAD @ {2}: вытягивание: ускоренная перемотка Можно ли безопасно сбросить HEAD в HEAD? @ {1}
Kartins

Другой ответ от sehe содержит подробности о том, как туда добраться.
Нуфал Ибрагим

Это было очень полезно после катастрофического коммита, каким-то образом вкрапленного коммитом слияния в мою историю. Получил их, ища последний известный товар в reflog и затем принудительно толкнул.
Доменик

Что если pullэто первое действие? Если pullэто в HEAD@{1}, и ничего больше до этого, как вы возвращаетесь в состояние до этого?
Хендра Узия

Воссоздать хранилище?
Нуфал Ибрагим

29

Это сработало для меня.

git reset --hard ORIG_HEAD 

Отменить слияние или тягу:

$ git pull                         (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard                 (2)
$ git pull . topic/branch          (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD       (4)

Проверьте это: HEAD и ORIG_HEAD в Git для получения дополнительной информации.


17

Найдите <SHA#>коммит, на который вы хотите пойти. Вы можете найти его в GitHub или набрав git logили git reflog showв командной строке, а затем сделать git reset --hard <SHA#>


Найти что за коммит?
Мартин

Извините, я исправил это<SHA#>
Нина,

Это команда, которую я использую больше всего, когда мне нужно что-то отменить
Kartins

2

С https://git-scm.com/docs/git-reset#Documentation/git-reset.txt-Undoamergeorpullinsideadirtyworkingtree

Отменить слияние или потянуть внутри грязного рабочего дерева

$ git pull           (1)
Auto-merging nitfol
Merge made by recursive.
 nitfol               |   20 +++++----
 ...
$ git reset --merge ORIG_HEAD      (2)

Даже если у вас есть локальные изменения в вашем рабочем дереве, вы можете с уверенностью сказать, что git pullкогда вы знаете, что изменения в другой ветви не перекрываются с ними.

Изучив результат слияния, вы можете обнаружить, что изменение в другой ветке неудовлетворительное. Запуск git reset --hard ORIG_HEAD позволит вам вернуться туда, где вы были, но он отменит ваши локальные изменения, которые вы не хотите. git reset --mergeсохраняет ваши локальные изменения.

Смотрите также https://stackoverflow.com/a/30345382/621690


Спасибо! Вы спасли мой день
Тьяго Мартинс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.