Подтвердить что ты не робот

Git: восстановление удаленной (удаленной) ветки

Мне нужно восстановить две ветки Git, которые я как-то удалил во время нажатия.

Эти две ветки были созданы в другой системе, а затем помещены в мой "общий" (github) репозиторий.

В моей системе я (по-видимому) извлекал ветки во время извлечения:

~/myfolder> git fetch
remote: Counting objects: 105, done.
remote: Compressing objects: 100% (58/58), done.
remote: Total 62 (delta 29), reused 0 (delta 0)
Unpacking objects: 100% (62/62), done.
From github.com:mygiturl
 * [new branch]      contact_page -> origin/contact_page
   731d1bb..e8b68cc  homepage   -> origin/homepage
 * [new branch]      new_pictures -> origin/new_pictures

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

~/myfolder> git push
Counting objects: 71, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (43/43), done.
Writing objects: 100% (49/49), 4.99 KiB, done.
Total 49 (delta 33), reused 0 (delta 0)
To [email protected]:mygiturl.git
 - [deleted]         contact_page
 + e8b68cc...731d1bb homepage -> homepage (forced update)
   bb7e9f2..e0d061c  master -> master
 - [deleted]         new_pictures
   e38ac2e..bb7e9f2  origin/HEAD -> origin/HEAD
   731d1bb..e8b68cc  origin/homepage -> origin/homepage
   e38ac2e..bb7e9f2  origin/master -> origin/master
 * [new branch]      origin/contact_page -> origin/contact_page
 * [new branch]      origin/new_pictures -> origin/new_pictures

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

Вся информация об отмене Git "отменить", которую я искал, требует восстановления потерянных коммитов. Я не думаю, что это применимо здесь, так как у меня нет идентификаторов UID для этих ветвей.

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

EDIT: по запросу здесь моя конфигурация репо

user.name=Craig Walker
[email protected]
alias.unadd=reset HEAD
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
[email protected]:MyGitURL.git
remote.origin.mirror=true
branch.master.remote=origin
branch.master.merge=refs/heads/master
alias.undo=reset --hard
alias.test=push -f ci HEAD:master
alias.st=status
alias.ci=commit
alias.br=branch
alias.co=checkout
alias.ch=checkout
alias.df=diff
alias.lg=log -p
alias.who=shortlog -s --
remote.ci.url=ContinuousIntegrationGitURL
remote.ci.fetch=+refs/heads/*:refs/remotes/ci/*
branch.photo.remote=origin
branch.photo.merge=refs/heads/photos
remote.foo.url=FooGitURL
remote.foo.fetch=+refs/heads/*:refs/remotes/cynthia/*
branch.homepage.remote=origin
branch.homepage.merge=refs/heads/homepage
4b9b3361

Ответ 1

Я не эксперт. Но вы можете попробовать

git fsck --full --no-reflogs | grep commit

чтобы найти фиксацию HEAD удаленной ветки и вернуть ее.

Ответ 2

Ваши удаленные ветки не потеряны, они были скопированы в origin/contact_page и origin/new_pictures "удаленные ветки отслеживания" по полученной вами выборке (они также были нажаты назад, вы показали, но они были нажаты в refs/remotes/origin/вместо refs/heads/). Проверьте git log origin/contact_page и git log origin/new_pictures, чтобы узнать, соответствуют ли ваши локальные копии текущему состоянию, что бы вы ни думали. Если какие-либо новые коммиты были перенесены на эти ветки (из какого-то другого репо) между извлечением и нажатием, которые вы показали, вы можете "потерять" их (но, вероятно, вы, вероятно, могли бы найти их в другом репо, который недавно подтолкнул эти ветки).

Fetch/Push Conflict

Похоже, вы загружаетесь в обычном "удаленном режиме" (удаленные refs/heads/хранятся локально в refs/remotes/origin/), но нажатие "зеркального режима" (локальные ссылки refs/push to remote refs/). Проверьте свой .git/config и скорректируйте настройки remote.origin.fetch и remote.origin.push.

Сделать резервную копию

Прежде чем приступать к каким-либо изменениям, создайте простой архив tar или zip или все ваше местное репо. Таким образом, если вам не нравится, что происходит, вы можете попробовать еще раз с восстановленного репо.

Вариант A: переконфигурировать как зеркало

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

git branch contact_page origin/contact_page &&
git branch new_pictures origin/new_pictures &&
git config remote.origin.fetch '+refs/*:refs/*' &&
git config --unset remote.origin.push &&
git config remote.origin.mirror true

Возможно, вам также понадобится удалить все ваши ссылки refs/remotes/origin/refs, так как они не полезны, если вы работаете в зеркальном режиме (ваши обычные ветки заменяют обычные ветки удаленного отслеживания).

Вариант B: переконфигурировать как обычный пульт дистанционного управления

Но поскольку кажется, что вы используете это дистанционное репо с несколькими "рабочими" репозиториями, вы, вероятно, не хотите использовать зеркальный режим. Вы можете попробовать следующее:

git config push.default tracking &&
git config --unset remote.origin.push
git config --unset remote.origin.mirror

Затем вы в конечном итоге захотите удалить фиктивные refs/remotes/origin refs в удаленном репо: git push origin :refs/remotes/origin/contact_page :refs/remotes/origin/new_pictures ….

Test Push

Попробуйте git push --dry-run, чтобы увидеть, что бы он сделал git push, без внесения каких-либо изменений в дистанционное репо. Если вам не нравится то, что он говорит, что он собирается сделать, восстановите резервную копию (tar/zip) и попробуйте другой вариант.

Ответ 3

только две команды сохраняют мою жизнь

1. Это отобразит список всех предыдущих HEADs

git reflog

2. Это вернет HEAD, чтобы зафиксировать, что вы удалили.

git reset --hard <your deleted commit>
ex. git reset --hard b4b2c02

Ответ 4

Данные все еще существуют в github, вы можете создать новую ветку из старых данных:

git checkout origin/BranchName #get a readonly pointer to the old branch
git checkout –b BranchName #create a new branch from the old
git push origin BranchName #publish the new branch

Ответ 5

Я думаю, что у вас есть несогласованная конфигурация для "выборки" и "push", так что это вызвало неправильный выбор/выборка по умолчанию. К счастью, вы извлекли ветки, которые впоследствии удалили, чтобы вы могли воссоздать их с явным нажатием.

git push origin origin/contact_page:contact_page origin/new_pictures:new_pictures

Ответ 6

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

Ответ 7

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