LINUX.ORG.RU

[git] Помогите, я убил репозиторий


0

1

Доброго времени суток! Я сделал несколько (скажем, 10) коммитов в проект и захотел откатить последние 10 этих коммитов (я единственный разраб в проекте). Для этого я, работая в ветке master выполнил команду

git reset --hard HEAD~10

Далее

git push --force

После этого информация о тех 10-ти коммитах исчезла их вывода git log в моём локальном репе, однако осталась в репе проекта на сервере (я вижу эти коммиты на странице «Репозиторий» в трекере проекта (мы используем Redmine)). Но это пол-беды. Теперь когда я делаю git commit -a && git push изменения идут на сервер, применяются, и следом за моим коммитом в трекере идёт строка, говорящая о том, что автор с именем «git repository hosting» сделал коммит с комментарием «Merge branch 'master' of 178.63.190.XXX:project-x». Этот коммит вносит изменения, сделанные в тех пресловутых 10-ти коммитах, удалённых из моего локального репа.

Товарищи, подскажите пожалуйста, что творится с нашим репом на сервере, и как можно исправить ситуацию.

>После этого информация о тех 10-ти коммитах исчезла

Они валяются в папке .git/objects. Восстановить можно просто git reset --hard <commit>. Нужно только знать id коммита.

Со второй проблемой может помочь git push -f. Но будь аккуратнее.

elverion ()

>и как можно исправить ситуацию.

Загрузиться из другого репозитория. На то оно и DVCS. Или у тебя все яйца в одной корзинке?

KRoN73 ★★★★★ ()

Внимательно проверь какие remote ветки куда ведут, посмотри какие действия(в какой репозиторий) будут производиться при push/pull.

поидее после git push --force потом git pull, просмотри логи на удаленном репозитории руками git log origin/master или еще лучше зайди туда через ssh и посмотри прям там.

jerry_ru ()
Ответ на: комментарий от jerry_ru

поидее после git push --force потом git pull должно все быть пучком :)

jerry_ru ()
Ответ на: комментарий от jerry_ru

Не помню, делал ли я git pull после git reset --hard. Я новичек в git, повторял за статьёй с хабра.

Sergey_MSU ()
Ответ на: комментарий от Sergey_MSU

git reflog и поискать нужный коммит. Или посмотреть git log ORIG_HEAD

phoenix ★★★★ ()

А что рефлог говорит? Вытащи оттуда sha своих коммитов и замёржи их обратно!

Apple-ch ★★ ()
Ответ на: комментарий от elverion

Так я делал git push -f (он же --force), в результате на сервере одна история, у меня в локальном репе - другая.

Sergey_MSU ()
Ответ на: комментарий от Sergey_MSU

В приличном обществе за такое сами знаете что отрывают. Никогда не правь историю в удаленом репе

anonymous ()

Как уже говорили, просто используй git reflog и не делай git gc!

l5k ()
Ответ на: комментарий от Apple-ch

А что рефлог говорит? Вытащи оттуда sha своих коммитов и замёржи их обратно!

git reflog говорит следующее:

serg@serg-laptop:/var/www/XXX.com/panel$ git reflog
9b0e1db HEAD@{0}: commit: git!
bd406d0 HEAD@{1}: commit: #120 closed
8bb54aa HEAD@{2}: checkout: moving from master to master
8bb54aa HEAD@{3}: HEAD~1: updating HEAD
04a2a36 HEAD@{4}: HEAD~4: updating HEAD
f014385 HEAD@{5}: HEAD~1: updating HEAD
3fc310a HEAD@{6}: commit: microcommit on #120
f014385 HEAD@{7}: commit: microcommit on #120
fa43042 HEAD@{8}: commit: microcommit on #120
224fb64 HEAD@{9}: commit: microcommit on #120
266fd93 HEAD@{10}: commit: microcommit on #120
04a2a36 HEAD@{11}: commit: working on #120
8bb54aa HEAD@{12}: commit: ticket 55 is closed finally
02b0e89 HEAD@{13}: commit: set mode 0644 to Utils/JsonProvider.j
2397af6 HEAD@{14}: commit: Tickets 55, 56. Cappuccino update to v0.1 and new class JsonProvider
8d7bf47 HEAD@{15}: commit: Cappuccino updated to v0.9
84d642d HEAD@{16}: commit: #56 Domain for JSON requests
2281e57 HEAD@{17}: clone: from gitosis@178.63.190.XXX:panel.git

А как надо замерживать коммиты? знаю только про мёрженье веток.

Sergey_MSU ()
Ответ на: комментарий от l5k

Как уже говорили, просто используй git reflog и не делай git gc!


А как использовать git reflog в моём случае? Выше я привёл вывод команды.
И почему git gc зло? Кому-то что-то портило уже?

Sergey_MSU ()

В логах смотри последние коммиты - восстанавливай бранч исходя из них

Led ★★★☆☆ ()
Ответ на: комментарий от Led

Я пытался восстановиться командами git reset, git pull, но результат плачевный:

serg@serg-laptop:/var/www/XXX.com/_panel$ git reset --hard HEAD@{5}
HEAD is now at f014385 microcommit on #120
serg@serg-laptop:/var/www/XXX.com/_panel$ git pull
remote: Counting objects: 19, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 16 (delta 12), reused 0 (delta 0)
Unpacking objects: 100% (16/16), done.
From 178.63.190.218:panel
   bd406d0..6bcace8  master     -> origin/master
Auto-merging Application/AppController.j
Merge made by recursive.
 Application/AppController.j |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
serg@serg-laptop:/var/www/XXX.com/_panel$ git push
Counting objects: 32, done.
Compressing objects: 100% (25/25), done.
Writing objects: 100% (25/25), 2.11 KiB, done.
Total 25 (delta 19), reused 0 (delta 0)
remote: U	Application/AppController.j
remote: Pull is not possible because you have unmerged files.
remote: Please, fix them up in the work tree, and then use 'git add/rm <file>'
remote: as appropriate to mark resolution, or use 'git commit -a'.
To gitosis@178.63.190.XXX:panel.git
   6bcace8..2093b64  master -> master

Я сделал так, что файлы Application/AppController.j на сервере и у меня совпадают. Как же мне избавиться от ошибки «you have unmerged files» ?

Sergey_MSU ()
Ответ на: комментарий от Sergey_MSU

>Я пытался восстановиться командами git reset, git pull, но результат плачевный:

git checkout -b <имя-бранча> <коммит-из-лога>

Led ★★★☆☆ ()
Ответ на: комментарий от Sergey_MSU

А, я подумал что тебе восстановить комиты надо, сорри. Тебе про это все и советуют, не читая вопроса.

Короче, я бы на твоём месте сделал бы так:

- потупил бы в

git log --graph --all

- потом

git fetch
git checkout master
git reset --hard origin/master

- как-то убил бы ненужные комиты либо с помощью rebase -i, либо revert, либо reset --hard.

- далее

git push origin +master

Комит вида «Merge branch 'master' of 178.63.190.XXX:project-x» возникает когда ты делаешь pull с помощью мержа, т.е. мержишь origin/master со своим master-ом. Такова политика по-умолчанию. Я, например, всегда делаю git pull --rebase.

git gc убивает осиротевшие и бездетные комиты.

l5k ()
Ответ на: комментарий от Sergey_MSU

А как надо замерживать коммиты? знаю только про мёрженье веток.

Да точно так же:

git merge 04a2a36
Apple-ch ★★ ()
Ответ на: комментарий от Apple-ch

Какая-то сплошная дезинформация.

git cherry-pick будет мержить комит.

git merge 04a2a36 будет мержить ветку с комитами до 04a2a36.

l5k ()
Ответ на: комментарий от Sergey_MSU

>Я новичек в git, повторял за статьёй с хабра.

Ты бы ещё rm -rf сделал.

anonymous ()
Ответ на: комментарий от Sergey_MSU

> Я новичек в git, повторял за статьёй с хабра.

как жаль, что ты не новичек в перле и не стал повторять за статьёй с лора…

arsi ★★★★★ ()
Ответ на: комментарий от l5k

Спасибо за коммент. В мемориз и в будущем приму к сведению. А в этот раз мне просто сделали свежий реп :)

Sergey_MSU ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.