Вопрос по version-control, git-merge, git – Отменить мерзавец, как привести репо в старое состояние

817

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

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

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

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

Похоже, у вас есть только две вещи в вашей истории: клон и выборка. Просто сбросьте на клон:git reset --hard 01b34faв этом случае вы могли бы сделатьgit reset --hard HEAD^ который сбрасывается на один коммит перед заголовком. jkp
--hard необходимо, если вы хотите изменить файлы в вашем рабочем каталоге William Pursell
git reset --hard HEAD ^ funroll
git reflog покажет все, что было сделано с git. Есть опасение, чтоgit reset --hard [sha1 of something from reflog] вернет все, что показано вreflog, которые иногда не являются целью, например. Вы хотите отменить слияние в основной ветке, извлеченной из источника с неверными данными (происходит), и после этого слияния вы работали с другими ветвями.reflog покажет каждую шейгу на других ветках. Ноgit checkout master а такжеgit reset --hard [SH1 of commit on master branch just before merge] сбросит только текущую основную ветку, удалив слитые данные из источника Vladimir Vukanac
@ seg.server.fault: если это сработало, вы всегда можете принять ответ;) jkp

Ваш Ответ

9   ответов
1144

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

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

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

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

Работал отлично:git reset --hard [email protected]{"10 minutes ago"}
Спасибо огромное. Вы только что спасли мою жизнь
В этом случае ORIG_HEAD также должен работать («git reset --hard ORIG_HEAD»)
Вы должны обязательно упомянуть тот факт, что это должноnot be done если у вас есть незафиксированные изменения!
Отличный способ выбрать предыдущее состояние вместо использования git-reflog и копирования хэшей - это использовать ярлык[email protected]{1}, которая является предыдущей позициейmaster, [email protected]{"5 minutes ago"}, или же[email protected]{14:30}, Полную информацию об указании ревизий таким способом можно найти вman git-rev-parseв разделе «указание ревизий».
1

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

26

предполагать$COMMIT был последним идентификатором коммита перед выполнениемgit pull. What you need to undo the last pull is

git reset --hard $COMMIT

.

Bonus:

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

git pull --rebase

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

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

Найти детали на:http://gitolite.com/git-pull--rebase

262

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

git reset --hard a0d3fe6

где a0d3fe6 находится путем

git reflog

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

Я не смог использовать идентификаторы левой стороны, ноgit reset --hard [email protected]{n} работал
Почему я просто не могуgit reset HEAD --hard, например?
Вы должны были предложить изменить ответ jkp вместо того, чтобы почти повторить его здесь после стольких лет.
Если у меня есть это наgit reflog: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} и bbbbbbb HEAD @ {2}. Если я сделаюgit reset --hard bbbbbbbЯ потерял ГОЛОВУ 0 и 1?
@MikeC Этот подход позволяет вам вернуться, например, на несколько шагов назад.
38

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

Это стоит побежать, если вы этого не видели. Появляется сумасшедший графический интерфейс.
git-pull автокоммиты.
6

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

git reset --hard 9573e3e0

куда9573e3e0 ваш {Commit id}

11

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

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

47

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

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

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

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

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, so they are not only old and new syntax for the same thing, Вот почему я нахожуgit reset --merge быть более полезным в повседневной работе.

git merge --abort работает во время слияния, а не послеgit pull закончен. Так что этот ответ кажется несоответствующим вопросу.

Похожие вопросы