Ответ 1
Кажется, есть ответ на восстановление поэтапных файлов здесь:
Восстановление добавленного файла после выполнения git reset --hard HEAD ^
Вопросы, которые я видел для отмены git, немного отличаются от моих.
Это то, что я сделал:
В каталоге A
(не репо) есть проект. Я инициализировал в нем репозиторий, добавил файлы, но ничего не сделал. Затем я вытащил из репозитория B, который перезаписал кучу моих поэтапных файлов.
У меня было впечатление, что я могу использовать git reset --hard
для отмены слияния. Конечно, только что проверил ГЛАВУ коммитов, которые я только что втянул.
Я должен был разветкить и совершить что-то, прежде чем я это сделал, задним числом приятно. Есть ли способ вернуть мои старые неустановленные файлы?
Кажется, есть ответ на восстановление поэтапных файлов здесь:
Восстановление добавленного файла после выполнения git reset --hard HEAD ^
A git pull
совпадает с git fetch
+ git merge
. Это шаг слияния, который заменил ваши изменения. Чтобы вернуться к состоянию перед слиянием, используйте git log
, чтобы найти последний коммит, а затем используйте git reset --hard 1234abcd
, где 1234abcd - хэш требуемого коммита.
Обратите внимание, что после reset git pull
снова слияние изменений. Чтобы вернуться к изменениям навсегда, используйте git revert
, который создаст дополнительную фиксацию, изменяющую изменения.
Либо просто reset для предыдущего HEAD (т.е. фиксация, которую вы имели в вашем репозитории, которая не была обновлена с удаленного), или используйте git reflog
. Последний отображает список действий, которые были сделаны в вашем репозитории, команда git pull
должна быть частью этого. Просто git reset --hard X
до состояния перед этой командой.
Или просто откройте предыдущую HEAD (вы можете удалить/перезаписать предыдущую ветку), внесите изменения и git снова вытащите...
Думаю, вы не сможете полностью восстановить себя. Лучшее, что вы можете сделать, это git status
, чтобы проверить, какие файлы (файлы) по-прежнему неповреждены. Если незафиксированные файлы здесь отсутствуют, они теряются.
В следующий раз рассмотрите возможность использования git stash
до git pull
или, еще лучше, используйте git fetch
.
ЕСЛИ ВЫ РАСШИРЕННЫЙ GIT ПОЛЬЗОВАТЕЛЬ, И ФАЙЛЫ ДЕЙСТВИТЕЛЬНО ВАЖНЫ:
Если файлы поставлены, вы можете извлечь их из репозитория объектов. Но они идут прямо в GIT кишки, которые я не думаю, что вы должны попробовать.
Если вы действительно этого хотите, прочитайте следующее:
Просто перечитайте свой вопрос. Я упустил из виду, что вы тянули проект b, а не копировали файлы в свой проект. Не уверен, что мой ответ по-прежнему сохраняется с учетом вашего сценария. Я считаю, что лучше всего следовать geoffreyd answer и проверить ответ на вопрос StackOverflow Восстановить добавленный файл после выполнения git reset --hard HEAD ^.
Просто выполните git checkout -- <file>
.
Вот пример, который я использовал для подтверждения выше...
# Create a test directory and some test files
$ mkdir blah
$ echo "I've been overwritten" > test1.txt
$ cd blah
$ echo "I'm the real test1.txt" > test1.txt
$ git init .
Initialized empty Git repository in /Users/matthew/blah/.git/
$ git add .
$ cp ~/test1.txt .
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: test1.txt
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: test1.txt
#
$ cat test1.txt
I've been overwritten
$ git checkout -- test1.txt
$ cat test1.txt
I'm the real test1.txt
Когда вы выполняете git status
, он говорит вам использовать git checkout -- <file>
для отмены изменений в рабочем каталоге. Если я правильно прочитаю ваш вопрос, что вы хотите сделать.