Сначала получил «ваша ветка опережает источник / мастер на 3 коммита», затем мое приложение вернулось к более раннему времени с более ранними изменениями.
Как я могу получить то, что я потратил за последние 11 часов?
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
Это извлечет новую ветку, указывающую на желаемый коммит.
Эта команда вернется к данному коммиту.
На этом этапе вы можете создать ветку и начать работать с этого момента.
# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>
# Create a new branch forked to the given commit
git checkout -b <branch name>
Вы всегда можете использовать reflogтакже. git reflog будет отображаться любое изменение, которое обновило, HEADи проверка желаемой записи reflog HEADвернет этот коммит.
Каждый раз, когда ГОЛОВКА модифицируется, в reflog
# This will destroy any local modifications.# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.# You could get merge conflicts if you've modified things which were# changed since the commit you reset to.
Примечание: ( начиная с Git 2.7 ) вы также можете использовать git rebase --no-autostash.
"Отменить" данный диапазон фиксации или фиксации.
Команда сброса «отменит» любые изменения, сделанные в данном коммите.
Новый коммит с патчем отмены будет зафиксирован, в то время как оригинальный коммит останется в истории.
# Add a new commit with the undo of the original one.# The <sha-1> can be any commit(s) or commit range
git revert <sha-1>
Эта схема иллюстрирует, какая команда что делает.
Как вы можете видеть, reset && checkoutизмените HEAD.
Это просто сэкономило мне много часов работы. Я использовал "git reflog --date = iso", чтобы увидеть дату / время для каждой записи, так как я не мог сказать точно без временной отметки.
MetalMikester
1
для меня, во git reset --hard <commit_id>, удаление HEADработало! +1 для графического представления !!
reverie_ss
Просто упомянуть: если вы знаете название ветви: это git reflog <branchname>может быть весьма полезно, так как вы видите изменения только одной ветви.
Маркус Шрайбер
35
Другой способ добраться до удаленного коммита - воспользоваться git fsckкомандой.
git fsck --lost-found
Это выведет что-то вроде последней строки:
dangling commit xyz
Мы можем проверить, что это тот же коммит, который используется reflogв других ответах. Теперь мы можем сделатьgit merge
git merge xyz
Примечание.
Мы не сможем вернуть коммит, fsckесли уже выполнили git gcкоманду, которая удалит ссылку на висячий коммит.
Это единственный ответ, который работает, если вы недавно не указали на коммит, например, когда вы выбираете ветку, а затем случайно сбрасываете эту ветку в другом месте.
Ответы:
git reflog
твой друг. Найдите коммит, который вы хотите включить в этот список, и вы можете сбросить его (например:git reset --hard e870e41
.(Если вы не зафиксировали свои изменения ... у вас могут быть проблемы - делайте это рано и часто!)
источник
git log HEAD@{1}
. Если это выглядит как правильная серия коммитов, то вы можетеgit reset HEAD@{1}
.git fsck --lost-found
.Прежде чем ответить, давайте добавим некоторый фон, объясняя, что это
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 --hard <commit_id>
«Переместите» ГОЛОВУ назад к желаемому коммиту.
git rebase --no-autostash
.git revert <sha-1>
"Отменить" данный диапазон фиксации или фиксации.
Команда сброса «отменит» любые изменения, сделанные в данном коммите.
Новый коммит с патчем отмены будет зафиксирован, в то время как оригинальный коммит останется в истории.
Эта схема иллюстрирует, какая команда что делает.
Как вы можете видеть,
reset && checkout
изменитеHEAD
.источник
git reset --hard <commit_id>
, удалениеHEAD
работало! +1 для графического представления !!git reflog <branchname>
может быть весьма полезно, так как вы видите изменения только одной ветви.Другой способ добраться до удаленного коммита - воспользоваться
git fsck
командой.Это выведет что-то вроде последней строки:
Мы можем проверить, что это тот же коммит, который используется
reflog
в других ответах. Теперь мы можем сделатьgit merge
Примечание.
Мы не сможем вернуть коммит,
fsck
если уже выполнилиgit gc
команду, которая удалит ссылку на висячий коммит.источник