Git отменить локальное отделение удалить


377

Я просто удалил не ту ветку с некоторыми экспериментальными изменениями, которые мне нужны git branch -D branchName.

Как мне восстановить ветку?


7
Рад, что я не единственный отстой, который сделал это (и забыл регулярно выдвигать копию)
Рэй,

Ответы:


719

Вы можете использовать git reflog, чтобы найти SHA1 последнего коммита ветви. С этого момента вы можете воссоздать ветку, используя

git branch branchName <sha1>

Редактировать: Как говорит @seagullJS, branch -Dкоманда сообщает вам sha1, поэтому, если вы еще не закрыли терминал, он становится действительно простым. Например, это удаляет, а затем сразу восстанавливает ветку с именем master2:

user@MY-PC /C/MyRepo (master)
$ git branch -D master2
Deleted branch master2 (was 130d7ba).    <-- This is the SHA1 we need to restore it!

user@MY-PC /C/MyRepo (master)
$ git branch master2 130d7ba

71
Git сообщает вам, что такое SHA1, когда ветка удаляется, поэтому, если вы просто удалите ее, это может быть всего несколько строк в командной строке.
seagullJS

если эта ветвь существует на сервере, в качестве альтернативы, вы можете использоватьgit branch branchName origin/branchName
Флориан Кастеллан

кроме того, я использовал git cherry-pick <sha1>, чтобы переместить коммит в ветвь
Akin Okegbile

54

Если вы знаете последний SHA1 ветви, вы можете попробовать

git branch branchName <SHA1>

Вы можете найти использование SHA1 git reflog, описанное в решении здесь .


34

Если вы еще не нажали удаление, вы можете просто сделать:

$ git checkout deletedBranchName

Этот ответ заставляет Git Extensions замолчать из-за того, что «ветка, которую вы пытаетесь нажать, кажется новой ветвью для этого пульта». Большое спасибо.
Омер

29

Если вы только что удалили ветку, вы увидите что-то вроде этого в своем терминале:

Deleted branch branch_name(was e562d13)
  • где e562d13 - это уникальный идентификатор (он же SHA или хэш), с помощью которого вы можете восстановить удаленную ветку.

Чтобы восстановить ветку, используйте:

git checkout -b <branch_name> <sha>

например :

git checkout -b branch_name e562d13 

4

Первое: создайте резервную копию всего каталога, включая каталог .git.

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

Третье: перебазирование или слияние с потерянным коммитом.

Четвертое: всегда дважды подумайте, прежде чем использовать -D или --force с git :)

Вы также можете прочитать это хорошее обсуждение того, как исправить ошибку такого рода.

РЕДАКТИРОВАТЬ: Между прочим, не запускайте git gc(или не позволяйте ему запускаться самостоятельно - т.е. не запускайте git fetchили что-то подобное), иначе вы можете потерять свои коммиты навсегда.


1
1 и 4 перебивают ИМО.
JWG

да, именно поэтому мы используем git, чтобы не носить с собой все это. Каждое совершенное вами действие все еще доступно для вас.
Метеор

4

Спасибо, это сработало.

git branch new_branch_name sha1

git checkout new_branch_name

// могу видеть мои старые проверенные файлы в моей старой ветке


3

Следуй этим шагам:

1: введите:

git reflog show 

Это отобразит всю историю коммитов, вам нужно выбрать sha-1, который имеет последний коммит, который вы хотите вернуть

2: создайте имя ветви с выбранным вами идентификатором Sha-1 , например: 8c87714

git branch your-branch-name 8c87714

0

Это сработало для меня:

git fsck --full --no-reflogs --unreachable --lost-found
git show d6e883ff45be514397dcb641c5a914f40b938c86
git branch helpme 15e521b0f716269718bb4e4edc81442a6c11c139
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.