Случайно удаленная ветка, на которой базировалось репо, как исправить? - PullRequest
2 голосов
/ 18 марта 2019

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

notice: HEAD points to an unborn branch

Как это исправить?

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

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

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

git checkout feature/branch_1

, которое помещает имя feature/branch_1 в специальное имя HEAD. Само имя, то есть feature/branch_1, содержало 40-символьный хэш-идентификатор подсказки ветви, так что name запоминало фактический хеш коммита.

Тогда ты побежал:

git branch -d feature/branch_1

Git должен был просто сказать нет, вы можете этого не делать . (Были некоторые ошибки, связанные с этим при использовании git worktree add, и есть различные способы вызвать проблемы, но само по себе git branch это предполагается , чтобы просто сказать нет здесь.) Когда это удалось, вы осталось:

  • HEAD содержит feature/branch_1
  • но feature/branch_1 не существует.

Способ исправить это - воссоздать имя feature/branch_1, указав в нем правильный хэш-идентификатор коммита. Проблема заключается в том, что в памяти нет хэша фиксации, который он должен хранить: этот хэш-идентификатор хранился под именем feature/branch_1 и больше не является

.

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

git branch feature/branch_1 origin/feature/branch_1

например. Однако, если такого имени нет, это не сработает.

К счастью, HEAD имеет reflog , а в HEAD reflog хранятся необработанные хеши коммитов коммитов, которые вы посетили. К сожалению, в этом состоянии Git отказывается его использовать:

$ git reflog HEAD
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.

и

$ git rev-parse HEAD@{0}
HEAD@{0}
fatal: ambiguous argument 'HEAD@{0}': unknown revision or path not in the working tree.

Однако, это делает трюк:

$ tail -1 .git/logs/HEAD | awk '{print $2}'
b5101f929789889c2e536d915698f58d5c5c6b7a

так что вы можете прибегнуть к этому конкретному трюку в данном конкретном случае (который в любом случае никогда не должен происходить).

0 голосов
/ 18 марта 2019

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

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

git checkout -b <branch> <sha>

Этосоздает новую ветку для этого SHA1 с именем, которое вы даете.

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