Можно ли отменить изменения, вызванные следующей командой? Если так, то как?
git reset --hard HEAD~1
git
version-control
git-reset
Пол Уикс
источник
источник
--hard
отбрасывает незафиксированные изменения. Так как они не отслеживаются git, нет способа восстановить их через git.Ответы:
Пэт Нотц прав. Вы можете вернуть коммит, если он был в течение нескольких дней. git собирает только мусор примерно через месяц или около того, если вы явно не скажете ему удалить более новые BLOB-объекты.
В примере вы можете видеть, что file2 был удален в результате аппаратного сброса, но был восстановлен после сброса через reflog.
источник
git log -g
может быть немного лучше способ просмотра reflog, чемgit reflog
.git reflog
болееgit log -g
просто потому , что вы получите всю информацию на одной линии с sha1, HEAD , информация и сообщения фиксации все выстроены. Гораздо проще читать.Что вы хотите сделать, это указать sha1 коммита, который вы хотите восстановить. Вы можете получить sha1, изучив reflog (
git reflog
), а затем выполнивgit reset --hard <sha1 of desired commit>
Но не ждите слишком долго ... через несколько недель git увидит этот коммит как не имеющий ссылки и удалит все BLOB-объекты.
источник
Ответ скрыт в подробном ответе выше, вы можете просто сделать:
(Смотрите вывод git reflog show )
источник
Его можно восстановить, если Git еще не собрал мусор.
Получите обзор висячих коммитов с
fsck
:Восстановите оборванный коммит с помощью rebase:
источник
Если вам действительно повезло, как и мне, вы можете вернуться в свой текстовый редактор и нажать «Отменить».
Я знаю, что это не совсем правильный ответ, но это сэкономило мне половину рабочего дня, так что, надеюсь, это сделает то же самое для кого-то другого!
источник
насколько я знаю,
--hard
откажется от незавершенных изменений. Так как они не отслеживаются Git. но вы можете отменитьdiscarded commit
.будут списки:
где
4bac331
этоdiscarded commit
.Теперь просто переместите голову на этот коммит:
источник
Пример случая IRL:
$ git fsck --lost-found
$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a
$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a
источник
В большинстве случаев да.
В зависимости от состояния, в котором находился ваш репозиторий при запуске команды, эффекты
git reset --hard
могут варьироваться от тривиальных до отменных, в принципе невозможных.Ниже я перечислил ряд возможных сценариев и способы их устранения.
Все мои изменения были зафиксированы, но коммиты исчезли!
Такая ситуация обычно возникает, когда вы запускаете
git reset
с аргументом, как вgit reset --hard HEAD~
. Не волнуйтесь, это легко восстановить!Если вы только что побежали
git reset
и больше ничего не делали с тех пор, вы можете вернуться туда, где вы были, с помощью этой строки:Это сбрасывает вашу текущую ветку независимо от того, в каком она была состоянии до того, как в последний раз она была изменена (в вашем случае самой последней модификацией ветки будет полная перезагрузка, которую вы пытаетесь отменить).
Однако, если вы уже сделали другие изменения в вашей отрасли с сброса, один вкладыш выше не будет работать. Вместо этого вы должны запустить, чтобы увидеть список всех последних изменений, внесенных в вашу ветку (включая перезагрузки). Этот список будет выглядеть примерно так:
git reflog
<branchname>
Найдите в этом списке операцию, которую вы хотите отменить. В приведенном выше примере это будет первая строка с надписью «сброс: переход к HEAD ~». Затем скопируйте представление коммита до (ниже) этой операции. В нашем случае это будет
master@{1}
(или3ae5027
они оба представляют один и тот же коммит) и будет запущенgit reset --hard <commit>
для сброса текущей ветки обратно в этот коммит.Я поставил свои изменения с
git add
, но никогда не совершал. Теперь мои изменения исчезли!Это немного сложнее, чтобы оправиться от. мерзавец действительно есть копии файлов , добавленных вами, но так как эти копии не были привязаны к какой - либо конкретной фиксации вы не можете восстановить изменения сразу. Вместо этого вам нужно найти отдельные файлы в базе данных git и восстановить их вручную. Вы можете сделать это с помощью
git fsck
.Подробнее об этом смотрите Undo git reset --hard с неподтвержденными файлами в области подготовки .
У меня были изменения в файлах в моем рабочем каталоге, с которыми я никогда не ставил
git add
и никогда не фиксировал. Теперь мои изменения исчезли!Ооо Я не хочу тебе этого говорить, но тебе, вероятно, не повезло. git не хранит изменения, которые вы не добавляете или не фиксируете, и в соответствии с документацией для
git reset
:Вполне возможно , что вы могли бы быть в состоянии восстановить ваши изменения с каким - то утилитой восстановления диска или профессиональной услуги по восстановлению данных, но в этот момент, вероятно , больше проблем , чем это стоит.
источник
Если вы еще не собрали сборщик мусора в своем хранилище (например, с помощью
git repack -d
илиgit gc
, но учтите, что сборка мусора также может происходить автоматически), то ваш коммит все еще там - он просто больше не доступен через HEAD.Вы можете попытаться найти свой коммит, просмотрев выходные данные
git fsck --lost-found
.В более новых версиях Git есть нечто, называемое «reflog», которое представляет собой журнал всех изменений, которые были внесены в ссылки (в отличие от изменений, которые вносятся в содержимое репозитория). Так, например, каждый раз, когда вы переключаете ваш HEAD (то есть каждый раз, когда вы
git checkout
переключаете ветви), который будет регистрироваться. И, конечно же, выgit reset
также манипулировали ГОЛОВОЙ, поэтому она также была зарегистрирована. Вы можете получить доступ к более старым состояниям ваших ссылок таким же образом, как вы можете получить доступ к более старым состояниям вашего репозитория, используя@
знак вместо «~
, как»git reset HEAD@{1}
.Мне потребовалось некоторое время, чтобы понять, в чем разница между HEAD @ {1} и HEAD ~ 1, поэтому вот небольшое объяснение:
Таким образом,
HEAD~1
означает «перейти к коммиту до коммита, на который в данный момент указывает HEAD», аHEAD@{1}
означает «перейти к коммиту, на который указал HEAD, до того, как он указал на тот, на который в данный момент указывает»Это легко позволит вам найти потерянный коммит и восстановить его.
источник
Прежде чем ответить, давайте добавим некоторый фон, объясняя, что это такое
HEAD
.First of all what is HEAD?
HEAD
это просто ссылка на текущий коммит (последний) в текущей ветке.Там может быть только один
HEAD
в любой момент времени. (исключаяgit worktree
)Содержимое
HEAD
хранится внутри.git/HEAD
и содержит 40 байтов SHA-1 текущего коммита.detached HEAD
Если вы не используете последний коммит, то
HEAD
есть он указывает на предыдущий коммит в историиdetached HEAD
.В командной строке это будет выглядеть так - SHA-1 вместо имени ветви, так как
HEAD
не указывает на конец текущей ветвиНесколько вариантов того, как восстановить систему с отключенной HEAD:
git checkout
Это извлечет новую ветку, указывающую на желаемый коммит.
Эта команда вернется к данному коммиту.
На этом этапе вы можете создать ветку и начать работать с этого момента.
git reflog
Вы всегда можете использовать
reflog
также.git reflog
будет отображаться любое изменение, которое обновило,HEAD
и проверка желаемой записи reflogHEAD
вернет этот коммит.Каждый раз, когда ГОЛОВКА изменяется, в
reflog
Это вернет вас к желаемой фиксации
git reset HEAD --hard <commit_id>
«Переместите» свою голову назад к желаемому коммиту.
вы также можете использовать
git rebase --no-autostash
.git revert <sha-1>
"Отменить" данный диапазон фиксации или фиксации.
Команда сброса «отменит» любые изменения, сделанные в данном коммите.
Новый коммит с патчем отмены будет зафиксирован, в то время как оригинальный коммит останется в истории.
Эта схема иллюстрирует, какая команда что делает.
Как вы можете видеть там,
reset && checkout
изменитеHEAD
.источник
git reset HEAD --hard <commit_id>
пример взят из stackoverflow.com/questions/4114095/… - Если это так, не могли бы вы отредактировать в атрибуции?git reflog
git cherry-pick <the sha>
источник
Я знаю, что это старая ветка ... но так как многие люди ищут способы отменить что-то в Git, я все же думаю, что это может быть хорошей идеей продолжать давать советы здесь.
Когда вы делаете «git add» или перемещаете что-либо из верхнего левого угла в нижний левый в git gui, содержимое файла сохраняется в большом двоичном объекте, и содержимое файла можно восстановить из этого большого двоичного объекта.
Таким образом, можно восстановить файл, даже если он не был зафиксирован, но его нужно добавить.
Теперь BLOB-объект создан, но на него ссылается индекс, поэтому он не будет указан с помощью git fsck, пока мы не сбросим его. Итак, мы сбрасываем ...
вы получите болтающийся шарик ce013625030ba8dba906f756967f9e9ca394464a
вернет вам содержимое файла "привет"
Чтобы найти несвязанные коммиты, я нашел подсказку, где это предлагается.
У меня есть это как инструмент в git gui, и это очень удобно.
источник
git fsck --lost-found
может помочь.Если вы используете IDE JetBrains (на базе IntelliJ), вы можете восстановить даже свои незафиксированные изменения с помощью функции «Локальная история».
Щелкните правой кнопкой мыши каталог верхнего уровня в дереве файлов, найдите «Локальная история» в контекстном меню и выберите «Показать историю». Это откроет представление, в котором можно найти ваши последние изменения, и как только вы найдете ревизию, к которой хотите вернуться, щелкните ее правой кнопкой мыши и нажмите «Вернуть».
источник
Я только что сделал полный сброс на неправильный проект. То, что спасло мою жизнь, было местной историей Затмения. Говорят, что у IntelliJ Idea тоже есть такой же, как и у вашего редактора, его стоит проверить:
источник
Сделал крошечный скрипт, чтобы немного легче было найти коммит, который искали:
git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \{\} | egrep '^commit |Date:'
Да, это можно сделать намного красивее с помощью awk или чего-то подобного, но это просто, и мне просто нужно было это. Может спасти кого-то еще 30 секунд.
источник
Моя проблема почти похожа. У меня есть незафиксированные файлы перед входом
git reset --hard
.К счастью. Мне удалось пропустить все эти ресурсы. После того как я заметил, что я могу просто отменить (
ctrl-z
). Just Я просто хочу добавить это ко всем ответам выше.Запись. Невозможно
ctrl-z
открыть неоткрытые файлы.источник
Это спасло мне жизнь
https://medium.com/@CarrieGuss/how-to-recover-from-a-git-hard-reset-b830b5e3f60c
В основном вам нужно запустить:
Затем вручную проходит через боль, чтобы реорганизовать ваши файлы в правильную структуру.
Вывод: никогда не используйте,
git reset --hard
если вы не полностью понимаете, как это работает, лучше не использовать его.источник