Можно ли восстановить ветвь после ее удаления в Git?

Если я запустил git branch -d XYZ, есть ли способ восстановить ветвь? Есть ли способ вернуться, как будто я не запускал команду удаления ветки?

4b9b3361

Да, вы должны быть в состоянии сделать git reflog и найти SHA1 для коммита в конце вашей удаленной ветки, а затем просто git checkout [sha]. И как только вы получите этот коммит, вы можете просто сделать git checkout -b [branchname] чтобы воссоздать ветку оттуда.


Благодарим @Cascabel за эту сокращенную/однострочную версию.

Вы можете сделать это за один шаг:

git checkout -b <branch> <sha>
1519
ответ дан 04 сент. '10 в 6:43
источник

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

Возможно, что-то легче, если коммит был частью конкретной ветки, которая все еще существует, - это использовать команду git reflog name-of-my-branch. Он работает также с удаленным, например, если вы принудительно нажимаете.


Если ваши коммиты не находятся в вашем рефлоге (возможно, потому что они были удалены сторонним инструментом, которые не записывают в reflog), я успешно восстановил ветвь, переведя мою ветку в sha of фиксация найдена с использованием такой команды (она создает файл со всеми оборванными коммитами):

git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt

Если вы должны использовать его более одного раза (или хотите его где-то сохранить), вы также можете создать псевдоним с этой командой...

git config --global alias.rescue '!git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt'

и используйте его с git rescue

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

Чтобы отобразить метаданные передачи (автор, дата создания и сообщение фиксации):

git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

Чтобы увидеть также различия:

git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

После того, как вы нашли свою фиксацию, затем создайте ветку на этом коммите с помощью:

git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
112
ответ дан 10 марта '14 в 18:10
источник

Если вы хотите использовать графический интерфейс, вы можете выполнить всю операцию с помощью gitk.

gitk --reflog

Это позволит вам увидеть историю фиксации ветки, как если бы ветка не была удалена. Теперь просто щелкните правой кнопкой мыши самую последнюю фиксацию на ветку и выберите пункт меню Create new branch.

36
ответ дан 02 июня '15 в 17:28
источник

Самое популярное решение действительно больше, чем было запрошено:

git checkout <sha>
git checkout -b <branch>

или

git checkout -b <branch> <sha>

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

A более чистое (и более простое) решение кажется однострочным (после того, как вы нашли <sha> с git reflog):

git branch <branch> <sha>

Теперь ни ваша текущая ветвь, ни неизменные изменения не затронуты. Вместо этого только новая ветвь будет создана до <sha>.

Если это не подсказка, она все равно будет работать, и вы получите более короткую ветку, после чего вы сможете повторить попытку с новым <sha> и новым именем ветки, пока не получите правильное решение.

Наконец, вы можете переименовать успешно восстановленную ветку в то, что она была названа, или что-то еще:

git branch -m <restored branch> <final branch>

Излишне говорить, что ключом к успеху было найти правильную фиксацию <sha>, поэтому назовите свои коммиты разумно:)

18
ответ дан 08 апр. '15 в 18:33
источник

Добавление в tfe ответ: есть также git-resurrect.sh script в области contrib/ в Git источники (в хранилище git.git), которые могут вам помочь.

git-resurrect <name> пытается найти следы кончика ответвления называется <name> и пытается его воскресить. В настоящее время reflog поиск сообщений проверки, а с помощью -r - также слияние сообщений. С -m и -t, история всех refs сканируется для Merge <name> into other/Merge <other> into <name> (соответственно) объектов фиксации, которые довольно медленный, но позволяет воскрешать тему других людей ветки.

14
ответ дан 06 сент. '10 в 22:39
источник

Если у вас нет reflog, например. потому что вы работаете в голом репозитории, в котором нет reflog, и коммит, который вы хотите восстановить, был создан недавно, другой вариант - найти недавно созданные объекты фиксации и просмотреть их.

Изнутри каталога .git/objects выполните:

find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit

Это находит все объекты (фиксации, файлы, теги и т.д.), созданные за последние 12 часов, и фильтрует их для отображения только коммитов. Проверка их - это быстрый процесс.

Я попробовал бы git -ressurect.sh script, упомянутый в ответ Jakub, хотя.

9
ответ дан 13 мая '13 в 14:26
источник

Для пользователей GitHub без Git:

Если вы хотите восстановить его с сайта GitHub, вы можете взломать их сайт;)

• Прежде всего, найдите эти SHA (commit hashes):

curl -i https://api.github.com/repos/PublicUser/PublicRepo/events

... или для частных РЕПО:

curl -su YourUserName https://api.github.com/repos/YourUserName/YourProject/events

... (будет запрошен пароль)

• Затем перейдите в GitHub и создайте новую временную ветку, которая будет удалена навсегда (предпочтительнее Chrome).

• Перейдите в ветки и удалите их.

На той же странице без перезагрузки откройте DevTools, Network panel. Теперь подготовьте...

• Нажмите "Восстановить". Вы заметите новую "линию". Щелкните его правой кнопкой мыши и выберите "Копировать как cURL" и сохраните этот текст в каком-либо редакторе.

• Добавить в конец скопированной строки кода, это: -H "Cookie=".

Вы должны получить что-то вроде этого:

curl 'https://github.com/UserName/ProjectName/branches?branch=BranchSHA&name=BranchName' -H 'Cookie:' -H 'Origin: https://github.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US' -H 'User-Agent: User-Agent' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Accept: */*' -H 'Referer: https://github.com/UserName/ProjectName/branches' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data 'utf8=%E2%9C%93&authenticity_token=token' --compressed

• Заключительный шаг: замените "BranchSHA" на ваш зонд SHA -H и имя BranchName с желаемым именем (BTW, это отличный взлом для переименования ветки из Интернета). Если вы не слишком медленны, вам нужно сделать этот запрос в любом случае. Например, просто скопируйте-вставьте в терминал.

PS

Я знаю, это не очень простое решение или правильное решение, но на всякий случай, если кто-то, без пароля root и виртуальной машины, во время hackathon должен будет сделать что-то странное?.. Это абсолютно реально, так что спасибо за то, что вы не торопитесь и удачи :)

ОБНОВИТЬ

Ахаха, я очень взволнован тем фактом, что кто-то из World Wide Web нашел мой ответ и, действительно, прочитав его, нашел его забавным или полезным и поддержал мой умопомрачительный, безумный и так ошибочный ответ: :) Это замечательный мир вокруг, и мы, программисты и кодеры, являются одной из самых сумасшедших ее частей <3

7
ответ дан 26 авг. '16 в 8:01
источник

Я использовал следующие команды для поиска и извлечения удаленной ветки. Первые шаги из описания gcb.

$ git fsck --full --no-reflogs --unreachable --lost-found > lost
$ cat lost | cut -d\  -f3 > commits
$ cat commits | xargs -n 1 git log -n 1 --pretty=oneline

Теперь найдите идентификатор git commit (GIT -SHA) на основе комментариев коммита и используйте его в приведенной ниже команде. Оформить покупку нового ветки под названием NEW-BRANCH с ранее найденным GIT -SHA:

$ git checkout -b NEW-BRANCH GIT-SHA
7
ответ дан 14 нояб. '16 в 16:28
источник

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

git branch -d [branch]

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

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

git branch -d [branch]

Это часть обязательного просмотра видео от Скотта Чакона о Git. Проверьте минутку 58:00, когда он расскажет о ветких и как их удалить.

Введение в Git со Скоттом Чаконом из GitHub

6
ответ дан 12 авг. '12 в 0:04
источник

Я переустановил ветку с удаленного, чтобы попытаться очистить несколько коммитов, которых я не хотел, и собирался сделать черри нужные, которые я хотел. Конечно, я написал SHA неправильно...

Вот как я их нашел (в основном, более простой интерфейс/взаимодействие от вещей по ответам здесь):

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

git fsck --full --no-reflogs --unreachable --lost-found > lost

Создает файл lost со всеми коммитами, на которые вам придется посмотреть. Чтобы упростить нашу жизнь, разрежьте только SHA:

cat lost | cut -d\  -f3 > commits

Теперь у вас есть файл commits со всеми коментами, которые вы должны посмотреть.

Предполагая, что вы используете Bash, последний шаг:

for c in `cat commits`; do  git show $c; read; done

Это покажет вам информацию о различиях и фиксации для каждого из них. И ждите, пока вы нажмете Enter. Теперь запишите все те, которые вы хотите, а затем вишни - заберите их. После того, как вы закончите, просто нажмите Ctrl-C.

4
ответ дан 10 дек. '14 в 9:40
источник

Для восстановления удаленной ветки сначала перейдите в историю reflog,

git reflog -n 60

Где n указывает на последние n коммитов. Затем найдите нужную голову и создайте ветку с этой головой.

git branch testbranch HEAD@{30}
3
ответ дан 23 февр. '16 в 16:57
источник

Добавляя к ответу tfe, вы можете восстановиться с указанным процессом, если только он не совершает ошибку, это не сбор мусора. Разделитель Git - это просто указатель на конкретную фиксацию в дереве фиксации. Но если вы удаляете указатель и коммиты на этой ветке не объединяются в другую существующую ветвь, то Git рассматривает ее как зависающую фиксацию и удаляет ее во время сбора мусора, которая может периодически запускаться автоматически.

Если ваша ветка не была объединена с существующей ветвью, и если она была собрана в мусор, то вы потеряете все коммиты до точки, откуда ветвь была разветвлена ​​из существующей ветки.

1
ответ дан 19 марта '16 в 15:49
источник

Связанная с этим проблема: Я пришел на эту страницу после поиска "как узнать, что такое удаленные ветки".

При удалении многих старых ветвей я почувствовал, что ошибочно удалил одну из новых ветвей, но не знал имя, чтобы восстановить его.

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

Если вы перейдете на свой Git URL-адрес, который будет выглядеть примерно так:

https://your-website-name/orgs/your-org-name/dashboard

Затем вы можете увидеть фид, что удалено, кем, в недавнем прошлом.

1
ответ дан 14 мая '17 в 10:14
источник

Сначала перейдите в git пакетный переход к вашему проекту, например:

cd android studio project
cd Myproject
then type :
git reflog

У вас есть список изменений, а номер ссылки - номер ref, а затем checkout
из студии android или из git betcha. другое решение возьмем номер ref и перейдите в андроид-студию, нажмите на git ветки вниз, затем нажмите на тег checkout или версию за ссылочным номером, затем lol у вас есть ветки.

1
ответ дан 02 дек. '14 в 12:08
источник

Просто использование git reflog не возвращало sha для меня. Только commit id (который длится 8 символов, а ша - длиннее)

Поэтому я использовал git reflog --no-abbrev

И затем сделайте то же самое, что указано выше: git checkout -b <branch> <sha>

0
ответ дан 19 нояб. '18 в 15:37
источник

Обязательно выполняйте все это локально, и подтвердите, что ваше репо находится в состоянии, которое вы хотите, прежде чем нажать на Bitbucket Cloud. Также может быть хорошей идеей клонировать ваше текущее репо и сначала проверить эти решения.

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

    Удаленная ветка (была)

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

    git checkout -b

Если вы не знаете "ша" с верхней части головы, вы можете:

  1. Найдите "sha" для фиксации на кончике удаленной ветки, используя:

    git reflog

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

    git checkout -b

Если ваши коммиты не находятся в вашем рефлоге:

  1. Вы можете попытаться восстановить ветвь, переведя свою ветку в sha из найденной команды, используя команду:

    git fsck --full - -n o-reflogs --unreachable - найденный | grep commit | вырезать -d\-f3 | xargs -n 1 git log -n 1 --pretty = oneline>.git/lost-found.txt

    2. Затем вы можете отобразить каждую фиксацию с помощью одного из них:

    git log -p git cat-file -p

0
ответ дан 07 нояб. '18 в 18:52
источник

БОЛЬШОЕ ДА

если вы используете GIT, выполните следующие простые шаги: https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html

если вы используете smartgit и уже нажимаете эту ветку на начало координат, найдите эту ветку и щелкните правой кнопкой мыши, затем проверьте

0
ответ дан 06 дек. '18 в 6:21
источник