Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: HydraxizeОтветов: 1

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

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

gitrollback

Ответы

Ответ 1 · рейтинг 3 · William Pursell

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

git branch original-master 4a0d8a5    # Run on origin

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

git fetch origin
git reset --hard 4a0d8a5

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы