Как я могу отменить мерзавец сбросить --hard ГОЛОВЫ ~ 1?

голоса
889

Можно ли отменить изменения, вызванные следующей командой? Если да, то как?

git reset --hard HEAD~1
Задан 08/08/2008 в 00:22
источник пользователем
На других языках...                            


15 ответов

голоса
1k

Пэт Notz правильно. Вы можете получить фиксации назад до тех пор, как это было в течение нескольких дней. мерзавец только собирает мусор примерно через месяц или около того, пока вы явно не сказать, чтобы удалить новые капли.

$ git init
Initialized empty Git repository in .git/

$ echo "testing reset" > file1
$ git add file1
$ git commit -m 'added file1'
Created initial commit 1a75c1d: added file1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file1

$ echo "added new file" > file2
$ git add file2
$ git commit -m 'added file2'
Created commit f6e5064: added file2
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file2

$ git reset --hard HEAD^
HEAD is now at 1a75c1d... added file1

$ cat file2
cat: file2: No such file or directory

$ git reflog
1a75c1d... HEAD@{0}: reset --hard HEAD^: updating HEAD
f6e5064... HEAD@{1}: commit: added file2

$ git reset --hard f6e5064
HEAD is now at f6e5064... added file2

$ cat file2
added new file

Вы можете увидеть в примере, что file2 было удалено в результате жесткого сброса, но был поставлен на место, когда я сбросить через reflog.

Ответил 22/08/2008 в 05:36
источник пользователем

голоса
308

То , что вы хотите сделать , это указать SHA1 фиксации , вы хотите восстановить. Вы можете получить sha1, исследуя reflog ( git reflog) , а затем делать

git reset --hard <sha1 of desired commit>

Но не ждать слишком долго ... после того, как мерзавец несколько недель, в конечном счете видеть, что обязательство, как и без ссылок удалить все сгустки.

Ответил 09/08/2008 в 06:30
источник пользователем

голоса
117

Ответ скрыт в подробном ответе выше, вы можете просто сделать:

$> git reset --hard HEAD@{1}

(См выход мерзавца reflog шоу )

Ответил 26/02/2011 в 16:13
источник пользователем

голоса
82

Можно его восстановить, если Git не мусора еще.

Получите обзор оборванных совершающее с fsck:

$ git fsck --lost-found
dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

Восстановление оборванных совершить с перебазироваться:

$ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf
Ответил 22/08/2008 в 07:11
источник пользователем

голоса
32

Если вы действительно повезло, как я, вы можете вернуться в текстовый редактор и нажмите «отменить».

Я знаю, что это на самом деле не правильный ответ, но это спасло мне половину рабочего дня так что надеюсь, он будет делать то же самое для кого-то другого!

Ответил 13/01/2012 в 01:48
источник пользователем

голоса
26

Пример IRL случае:

$ git fsck --lost-found

Checking object directories: 100% (256/256), done.
Checking objects: 100% (3/3), done.
dangling blob 025cab9725ccc00fbd7202da543f556c146cb119
dangling blob 84e9af799c2f5f08fb50874e5be7fb5cb7aa7c1b
dangling blob 85f4d1a289e094012819d9732f017c7805ee85b4
dangling blob 8f654d1cd425da7389d12c17dd2d88d318496d98
dangling blob 9183b84bbd292dcc238ca546dab896e073432933
dangling blob 1448ee51d0ea16f259371b32a557b60f908d15ee
dangling blob 95372cef6148d980ab1d7539ee6fbb44f5e87e22
dangling blob 9b3bf9fb1ee82c6d6d5ec9149e38fe53d4151fbd
dangling blob 2b21002ca449a9e30dbb87e535fbd4e65bac18f7
dangling blob 2fff2f8e4ea6408ac84a8560477aa00583002e66
dangling blob 333e76340b59a944456b4befd0e007c2e23ab37b
dangling blob b87163c8def315d40721e592f15c2192a33816bb
dangling blob c22aafb90358f6bf22577d1ae077ad89d9eea0a7
dangling blob c6ef78dd64c886e9c9895e2fc4556e69e4fbb133
dangling blob 4a71f9ff8262701171d42559a283c751fea6a201
dangling blob 6b762d368f44ddd441e5b8eae6a7b611335b49a2
dangling blob 724d23914b48443b19eada79c3eb1813c3c67fed
dangling blob 749ffc9a412e7584245af5106e78167b9480a27b
dangling commit f6ce1a403399772d4146d306d5763f3f5715cb5a    <- it's this one

$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a

commit f6ce1a403399772d4146d306d5763f3f5715cb5a
Author: Stian Gudmundsen Høiland <stian@Stians-Mac-mini.local>
Date:   Wed Aug 15 08:41:30 2012 +0200

    *MY COMMIT MESSAGE IS DISPLAYED HERE*

diff --git a/Some.file b/Some.file
new file mode 100644
index 0000000..15baeba
--- /dev/null
+++ b/Some.file
*THE WHOLE COMMIT IS DISPLAYED HERE*

$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a

First, rewinding head to replay your work on top of it...
Fast-forwarded master to f6ce1a403399772d4146d306d5763f3f5715cb5a.
Ответил 15/08/2012 в 08:01
источник пользователем

голоса
25

насколько я знаю, --hardбудет отбрасывает неподтвержденные изменения. Так как они не отслеживается мерзавцем. но вы можете отменить discarded commit.

$ git reflog

Будет ли списки:

b0d059c HEAD@{0}: reset: moving to HEAD~1
4bac331 HEAD@{1}: commit: added level introduction....
....

где 4bac331это discarded commit.

Теперь просто переместите голову, что совершить ::

$ git reset --hard 4bac331
Ответил 02/04/2015 в 08:57
источник пользователем

голоса
20

Если вы еще не мусора ваше хранилище (например , с использованием git repack -dили git gc, но обратите внимание , что сбор мусора может также происходить автоматически), то ваш совершать все еще там - это просто уже не достижимы через HEAD.

Вы можете попытаться найти вашу фиксацию, глядя через выход git fsck --lost-found.

Новые версии Git есть что - то под названием «reflog», которая представляет собой журнал всех изменений, внесенных в работах (в отличие от изменений, которые вносятся в содержимое хранилища). Так, например, каждый раз , когда вы включаете свой ГОЛОВУ (т.е. каждый раз , когда вы делаете git checkoutдля переключения филиалов) , которые будут записываться. И, конечно же , ваш git resetтакже манипулировать ГОЛОВА, поэтому он был также зарегистрирован. Вы можете получить доступ к пожилому состоянию ваших рефов подобным образом , что вы можете получить доступ к пожилому состоянию вашего хранилища, с помощью @знака вместо того , чтобы ~, как git reset HEAD@{1}.

Это мне потребовалось некоторое время, чтобы понять, в чем разница между головой @ {1} и ГЛАВЫ ~ 1, так что вот небольшое пояснение:

git init
git commit --allow-empty -mOne
git commit --allow-empty -mTwo
git checkout -b anotherbranch
git commit --allow-empty -mThree
git checkout master # This changes the HEAD, but not the repository contents
git show HEAD~1 # => One
git show HEAD@{1} # => Three
git reflog

Так, HEAD~1значит «идти к совершению перед фиксацией , что ГЛАВНОЕ в настоящее время указывает на», а HEAD@{1}значит «идти на коммит , что голова указал на , прежде чем он указал на то, где он в настоящее время указывает на».

Это будет легко позволит вам найти ваши потерянные фиксации и восстановить его.

Ответил 27/08/2008 в 04:45
источник пользователем

голоса
19

В большинстве случаев, да.

В зависимости от состояния вашего хранилища было при выполнении команды, эффекты git reset --hardдиапазона может от тривиального отменить, в принципе невозможно.

Ниже я перечислил целый ряд различных возможных сценариев, и как вы могли бы оправиться от них.

Все мои изменения были совершены, но теперь коммиты ушли!

Эта ситуация обычно возникает при запуске git resetс аргументом, как и в git reset --hard HEAD~. Не волнуйтесь, это легко восстановиться!

Если вы просто бежал git resetи ничего еще не сделал , так как вы можете вернуться туда , где вы были с этим однострочника:

git reset --hard @{1}

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

Однако, если вы уже сделали другие изменения в вашей отрасли с момента сброса, один вкладыш выше не будет работать. Вместо этого, вы должны работать , чтобы увидеть список всех последних изменений , внесенных в вашей отрасли ( в том числе перезагрузок). Этот список будет выглядеть примерно так:git reflog <branchname>

7c169bd master@{0}: reset: moving to HEAD~
3ae5027 master@{1}: commit: Changed file2
7c169bd master@{2}: commit: Some change
5eb37ca master@{3}: commit (initial): Initial commit

Найти работу в этом списке , что вы хотите «отменить». В приведенном выше примере, это будет первая линия, один говорит , что «перезагрузка: переход к ГОЛОВЫ ~». Затем скопируйте представление фиксации перед (ниже) этой операцией. В нашем случае, это было бы master@{1}(или 3ae5027они оба представляют собой то же самое обязательство), и запуститьgit reset --hard <commit> , чтобы сбросить текущую ветку обратно в этот коммит.

Я поставил свои изменения с git add , но никогда не совершал. Теперь мои изменения исчезли!

Это немного сложнее оправиться. мерзавец действительно есть копии файлов , добавленных вами, но так как эти копии не были привязаны к какой - либо конкретной фиксации вы не можете восстановить все изменения сразу. Вместо этого, вы должны найти отдельные файлы в базе данных Git и восстановить их вручную. Вы можете сделать это с помощью git fsck.

Для получения дополнительной информации об этом см Undo мерзавец сброс --hard с неподтвержденными файлами в промежуточной области .

Я имел изменения в файлы в моем рабочем каталоге , что я никогда не постановочные с git add, и никогда не совершал. Теперь мои изменения исчезли!

Ой - ой. Я не хочу сказать вам это, но вы , вероятно , не повезло. мерзавец не сохраняет изменения , которые не добавляют или совершающие к нему, и в соответствии с документацией наgit reset :

--жесткий

Сбрасывает индекс и рабочее дерево. Любые изменения в отслеживаемые файлы в рабочем дереве , так как <commit>отбрасывается.

Вполне возможно , что вы могли бы быть в состоянии восстановить ваши изменения с каким - то утилитой восстановления диска или профессиональной услуги по восстановлению данных, но в этот момент, вероятно , больше проблем , чем это стоит.

Ответил 16/01/2015 в 18:37
источник пользователем

голоса
10

Я знаю, что это старый нить ... но так как многие люди ищут способы, чтобы отменить вещи в Git, я до сих пор думаю, что это может быть хорошей идеей, чтобы продолжать давать советы здесь.

Когда вы делаете «мерзавец добавить» или переместить что-нибудь от верхнего левого угла в нижний левый в мерзавца гуй содержимое файла хранится в сгустка и содержимое файла можно восстановить из этого сгустка.

Так что можно восстановить файл, даже если он не был совершен, но он должен быть добавлен.

git init  
echo hello >> test.txt  
git add test.txt  

Теперь блоб создается, но не ссылается индекс, так что будет не быть перечислены с мерзавца FSCK, пока не будет сброшен. Таким образом, мы сбрасываем ...

git reset --hard  
git fsck  

вы получите свисающие блоб ce013625030ba8dba906f756967f9e9ca394464a

git show ce01362  

даст вам содержимое файла «привет» назад

Для того, чтобы найти неиспользуемые коммиты я нашел наконечник где-то предлагает это.

gitk --all $(git log -g --pretty=format:%h)  

Я его в качестве инструмента в мерзавца графического интерфейса, и это очень удобно.

Ответил 20/01/2014 в 07:27
источник пользователем

голоса
2

Сделан маленький скрипт, чтобы сделать его немного легче найти коммят один ищут:

git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \{\} | egrep '^commit |Date:'

Да, это может быть сделано значительно похорошела с AWK или что-то вроде этого, но это просто, и я просто нужен. Мог бы спасти кого-то еще 30 секунд.

Ответил 11/03/2014 в 09:09
источник пользователем

голоса
1

Прежде чем ответить позволяет добавить некоторый фон, объясняя , что это HEAD.

First of all what is HEAD?

HEADпросто ссылка на текущее обязательство (последний) на текущей ветке.
Там может быть только один HEADв любой момент времени. ( за исключением git worktree)

Содержимое HEADхранится внутри , .git/HEADи она содержит 40 байт SHA-1 тока фиксации.


detached HEAD

Если вы не на последней фиксации - смысл , который HEADнаведен на предшествующее совершить в истории его называют detached HEAD.

введите описание изображения здесь

В командной строке это будет выглядеть this- SHA-1 вместо имени ветви , так как HEADне указывает на кончике текущей ветви

введите описание изображения здесь


Несколько вариантов о том, как восстановить из отдельного РУКОВОДИТЕЛЯ:


git checkout

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>

git reflog

Вы всегда можете использовать , reflogкак хорошо.
git reflogбудет отображать любые изменения , которые обновили HEADи проверить нужную запись reflog установят HEADобратно в эту фиксации.

Каждый раз, когда голова модифицирована будет новая запись в reflog

git reflog
git checkout HEAD@{...}

Это вернет вас к вашему желанию совершить

введите описание изображения здесь


git reset HEAD --hard <commit_id>

«Переместить» голова назад к желаемой фиксации.

# 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как хорошо.


git revert <sha-1>

«Undo» данное обязательство или совершить ряд.
Команда сброса будет «отменить» любые изменения , внесенные в данном обязательстве.
Новый совершить с уничтожьте патч будет поручен в то время как оригинальная фиксации останется в истории.

# add 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.

введите описание изображения здесь

Ответил 21/04/2018 в 16:30
источник пользователем

голоса
1

Я просто сделал жесткий сброс на неверном проекте. Что спасло мою жизнь была краеведение в Eclipse. IntelliJ Idea, как говорят, один тоже, и поэтому может ваш редактор, это стоит проверить:

  1. Eclipse, раздел справки по краеведения
  2. http://wiki.eclipse.org/FAQ_Where_is_the_workspace_local_history_stored%3F
Ответил 07/04/2017 в 08:46
источник пользователем

голоса
0

Если вы используете JetBrains IDE (на основе ничего IntelliJ), вы можете восстановить даже ваши неподтвержденные изменения через их функцию «Local History».

Щелкните правой кнопкой мыши на папке верхнего уровня в файловом дереве, найти «Local History» в контекстном меню, и выберите «Показать историю». Это откроет вид, где ваши недавние изменения могут быть найдены, и как только вы нашли ревизию, которую вы хотите, чтобы вернуться, нажмите правой кнопкой мыши на ней и нажмите кнопку «Восстановить».

Ответил 17/08/2019 в 01:17
источник пользователем

голоса
0

Если у вас есть удаленный филиал, который уже есть изменения, то вы можете вытащить оттуда.

Иначе

git reflog

Найти вашу фиксацию в списке. Скопируйте и вставьте ша.

git cherry-pick <the sha>

Ответил 14/08/2019 в 11:35
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more