Отменить 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
упомянутый в каждом другом ответе требует.