Отменить git pull, как привести РЕПО в старое состояние

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

EDIT я хочу отменить слияние git для уточнения. Увидев некоторые ответы, я сделал это

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

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

8 ответов


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

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

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

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


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

git reset --hard a0d3fe6

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

git reflog

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


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

git merge --abort

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

git reset --merge

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

git reset --hard

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

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 быть гораздо более полезным в повседневной работе.


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

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

git reset --hard HEAD@{1}

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


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

git reset --hard $COMMIT

.

бонус:

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

git pull --rebase

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

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

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


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

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


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