Отменить мерзавец, как привести репо в старое состояние - PullRequest
862 голосов
/ 03 августа 2009

Есть ли способ отменить или отменить git pull, чтобы мои исходные / репозитории пришли в старое состояние, которое было до выполнения git pull? Я хочу сделать это, потому что он объединяет некоторые файлы, которые я не хотел делать, а объединяет только остальные файлы. Итак, я хочу вернуть эти файлы, это возможно? Спасибо:)

РЕДАКТИРОВАТЬ Я хочу отменить мерзавец слияния для уточнения. Увидев некоторые ответы, я сделал это

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

Теперь, что мне делать? Делать git reset --hard в порядке? Я не хочу ввернуть это снова, поэтому просите подробные шаги?

Ответы [ 9 ]

1199 голосов
/ 03 августа 2009

git pull сделает две вещи: git fetch, а затем git merge, где он объединяет ветви, которые были настроены для объединения в вашей конфигурации.

Итак, вы хотите отменить слияние (отмена выборки не имеет большого смысла и не должна быть необходимой).

Для этого вы можете попробовать использовать git reset --hard для возврата в предыдущее состояние. Используйте команду git-reflog , чтобы найти SHA-1 предыдущего состояния и затем восстановить его.

Предупреждение : git reset --hard удаляет все незафиксированные изменения.

279 голосов
/ 22 июля 2014

То же, что и ответ jkp, но вот полная команда:

git reset --hard a0d3fe6

где a0d3fe6 можно найти, выполнив

git reflog

и глядя на точку, в которой вы хотите отменить.

98 голосов
/ 20 мая 2015

Более современный способ отменить слияние:

git merge --abort

И немного более старый способ:

git reset --merge

Способ старой школы, описанный в предыдущих ответах (предупреждение: отменит все ваши локальные изменения):

git reset --hard

Но на самом деле стоит заметить, что git merge --abort эквивалентен только git reset --merge, если присутствует MERGE_HEAD. Это можно прочитать в справке git для команды слияния.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

После неудачного слияния, когда нет MERGE_HEAD, неудачное слияние может быть отменено с git reset --merge, но не обязательно с git merge --abort, , так что они не только старый и новый синтаксис для одной и той же вещи . Вот почему я считаю git reset --merge гораздо более полезным в повседневной работе.

51 голосов
/ 08 марта 2016

это работает первое использование: git reflog

найдите свой SHA своего прежнего состояния и сделайте (например, HEAD @ {1})

git reset --hard HEAD@{1}
39 голосов
/ 03 августа 2009

Если у вас есть gitk (попробуйте запустить «gitk --all из командной строки git»), это просто. Просто запустите его, выберите коммит, на который вы хотите откатиться (щелкните правой кнопкой мыши), и выберите «Сбросить основную ветвь сюда». Если у вас нет незафиксированных изменений, выберите «жесткий» вариант.

28 голосов
/ 23 декабря 2015

Предположим, $COMMIT был последним идентификатором коммита перед выполнением git pull. То, что вам нужно, чтобы отменить последнее нажатие

git reset --hard $COMMIT

.

Бонус:

Говоря о тяге, я хотел бы поделиться интересным трюком,

git pull --rebase

Эта команда является самой полезной в моей жизни в git, которая сэкономила много времени.

Перед отправкой вашего нового коммита на сервер, попробуйте эту команду, и она автоматически синхронизирует последние изменения на сервере (с выборкой + слиянием) и поместит ваш коммит наверху в git log. Не нужно беспокоиться о ручном вытягивании / слиянии.

Найти подробности можно по адресу: http://gitolite.com/git-pull--rebase

12 голосов
/ 19 августа 2015

вы можете сделать git reset --hard ORIG_HEAD

поскольку "pull" или "merge" устанавливают ORIG_HEAD в текущее состояние перед выполнением этих действий.

8 голосов
/ 13 ноября 2018

Это самый простой способ отменить внесенные вами изменения.

git reset --hard 9573e3e0

Где 9573e3e0 - ваш {Commit id}

2 голосов
/ 24 сентября 2018

Если произошел сбой слияния, что является наиболее распространенной причиной желания отменить git pull, запуск git reset --merge делает именно то, что и следовало ожидать: сохранить выбранные файлы, но отменить слияние, которое предприняла git pull объединить. Тогда можно решить, что делать без беспорядка, который иногда генерирует git merge. И он не нужен для того, чтобы найти точный идентификатор фиксации, который требуется --hard, упомянутый в каждом другом ответе.

...