Отменить git pull, как вернуть репозиции в старое состояние

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

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

git reflog
bb3139b... [email protected]{0}: pull : Fast forward
01b34fa... [email protected]{1}: clone: from ...name...

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

Ответ 1

Запуск git pull выполняет следующие задачи по порядку:

  1. git fetch
  2. git merge

Шаг слияния объединяет ветки, которые были настроены для слияния в вашей конфигурации. Вы хотите отменить шаг слияния, но, вероятно, не извлекать (не имеет большого смысла и не должно быть необходимо).

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

Предупреждение

Команды, перечисленные в этом разделе, удаляют все незафиксированные изменения, которые могут привести к потере работы:

git reset --hard

В качестве альтернативы можно выполнить сброс к определенному моменту времени, например:

git reset --hard [email protected]{"10 minutes ago"}

Ответ 2

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

git reset --hard a0d3fe6

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

git reflog

и посмотрим на точку, в которую вы хотите отменить.

Ответ 3

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

git merge --abort

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

git reset --merge

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

git reset --hard

Но на самом деле стоит заметить, что git merge --abort эквивалентен только git reset --merge, если присутствует MERGE_HEAD. Это можно прочитать в справке git для команды 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 намного полезнее в повседневной работе.

Ответ 4

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

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

git reset --hard [email protected]{1}

Ответ 5

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

Ответ 6

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

git reset --hard $COMMIT

.

Бонус:

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

git pull --rebase

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

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

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

Ответ 7

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

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

Ответ 8

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

git reset --hard 9573e3e0

Где 9573e3e0 - ваш {идентификатор_команды}

Ответ 9

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

Ответ 10

Попробуйте эту команду ниже. Надеюсь, что это решит вашу проблему.

git reset --keep [email protected]{1}

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

Ответ 11

Используйте git reset только в крайнем случае. Вы можете потерять данные. Просто найдите старые добрые файлы и передайте их плохим.