Как откатиться на предыдущую версию в Git?

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

Вот что я сделал (обратите внимание, что я впервые подключаюсь к этому серверу Git). Сначала я инициализирую свой репозиторий:

 $ rm -rf .git/
 $ git init
 $ git remote add origin https://remote.url/myProject.git
 $ git commit -m "My first commit"
 On branch master
 Initial commit
 Untracked files:
   (use "git add <file>..." to include in what will be committed)
        .foundry/
        .gitignore
        .teamcity/
        GitVersion.yml
        README.md
        config.ini
        block.py
        view.py
        entities.py
 nothing added to commit but untracked files present (use "git add" to track)

Затем, поскольку я только изменил entities.py, я добавил его в список для фиксации:

$ git add entities.py
$ git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   entities.py
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .foundry/
        .gitignore
        .teamcity/
        GitVersion.yml
        README.md
        config.ini
        block.py
        view.py

Git обнаружил изменение в entities.py, поэтому я решил, что все в порядке:

$ git commit -m "entities.py first commit"
[master (root-commit) 1dc09d9] entities.py first commit
1 file changed, 535 insertions(+)
create mode 100644 entities.py
$ git push -f origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 6.64 KiB | 1.66 MiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://remote.url/myProject.git
 + 4a0d8a5...1dc09d9 master -> master (forced update)

Когда я хотел проверить на сервере, сработал ли коммит, все файлы проекта исчезли! Есть только один файл: entities.py. Когда я запускаю git ls-tree, возвращается только один файл:

$ git ls-tree -r master --name-only
entities.py

Как видите, мы потеряли все. Раньше я использовал TFS, и любую ошибку можно было легко откатить за 1 минуту, здесь я потратил часы, пытаясь найти нужную команду в книге Git, но не могу найти, как восстановить предыдущую версию? Можно ли хотя бы откатиться в Git?

Безуспешные попытки решить эту проблему

fatal: ambiguous argument 'HEAD~': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
$ git push origin HEAD~1:master
error: src refspec HEAD~1 does not match any
error: failed to push some refs to 'https://remote.url/myProject.git'

person Hydraxize    schedule 21.05.2021    source источник
comment
Отвечает ли это на ваш вопрос? Как я могу восстановиться после ошибочного git push -f мастер происхождения?   -  person Joe    schedule 21.05.2021
comment
Если вы зафиксируете только одно изменение на сервере, вы должны увидеть только один файл на сервере, не так ли?   -  person Alex    schedule 21.05.2021
comment
rm -rf .git/ потерял свою местную историю; git push -f origin master перезаписал то, что было на сервере. Вам нужно будет восстановить резервную копию вашего локального каталога .git или спросить администратора вашего удаленного репозитория, возможно ли восстановить его из резервной копии. Вы можете повторно клонировать репозиторий, затем git reset 4a0d8a5.   -  person Joe    schedule 21.05.2021
comment
Если у вас есть теги или ветки на удаленке, это будет проще. В частности, если у вас есть тег 'foo' на исходном мастере, вы можете просто git fetch --tags; git reset --hard foo Если на исходный мастер нет ссылки, вам придется найти sha. К счастью, он у вас уже есть: 4a0d8a5   -  person William Pursell    schedule 21.05.2021
comment
Как сказал @Joe, rm -rf .git/ был настоящим источником проблемы. Я бы сказал сильнее, чем потерял вашу локальную историю: это полностью уничтожило репозиторий Git (который хранится в том каталоге .git), после чего вы сделали новый, в котором вообще не было коммитов. Затем вы сделали в нем один коммит с одним файлом в одном коммите. Вот почему вам пришлось принудительно нажать: чтобы сказать серверу отбросить все его коммиты в пользу этого нового и улучшенного единственного коммита с одним файлом в нем.   -  person torek    schedule 21.05.2021


Ответы (1)


К счастью, вы знаете краткий ша оригинального мастера на пульте дистанционного управления. Вывод вашего начального git push -f показывает, что это было в 4a0d8a5. Если у вас есть доступ оболочки к удаленному, перейдите туда и создайте ветку (или тег. Вам просто нужно сделать фиксацию доступной) в этой фиксации с помощью:

git branch original-master 4a0d8a5    # Run on origin

Теперь в локальном репо:

git fetch origin
git reset --hard 4a0d8a5
person William Pursell    schedule 21.05.2021
comment
Вероятно, это правильный ответ, но он не сработал из-за другого сообщения об ошибке error: unknown switch s'. В итоге решили начать с нуля, создать новое репо на сервере и локально. - person Hydraxize; 21.05.2021