Отмените мерзавец - PullRequest
       2

Отмените мерзавец

23 голосов
/ 18 января 2011

Вопросы, которые я видел для отмены мерзавца, немного отличаются от моих.

Вот что я сделал:

В каталоге A есть проект (не репо).Я инициализировал репозиторий в нем, добавил файлы, но ничего не зафиксировал.Затем я вытащил из репозитория B, который переписал кучу моих подготовленных файлов.

У меня сложилось впечатление, что я могу использовать git reset --hard, чтобы отменить слияние.Конечно, это только что проверило ГОЛОВУ коммитов, которые я только что вытащил.

Я должен был что-то разветвлять и коммитить, прежде чем сделать это, задним числом это хорошо.Есть ли какой-нибудь способ вернуть мои старые неотмеченные файлы?

Ответы [ 5 ]

29 голосов
/ 18 января 2011

A git pull совпадает с git fetch + git merge. Это шаг объединения, который переписал ваши изменения. Чтобы вернуться в состояние до слияния, используйте git log, чтобы найти ваш последний коммит, а затем используйте git reset --hard 1234abcd, где 1234abcd - хэш желаемого коммита.

Обратите внимание, что после сброса git pull снова объединит изменения. Чтобы отменить изменения навсегда, используйте git revert, который создаст дополнительный коммит, полностью изменяющий изменения.

13 голосов
/ 18 января 2011

Похоже, что здесь есть ответ на восстановление подготовленных файлов:

Восстановление добавленного файла после выполнения git reset --hard HEAD ^

3 голосов
/ 18 января 2011

Либо просто вернитесь к предыдущему HEAD (то есть к коммиту, который вы имели в своем хранилище, которое не было обновлено с удаленного компьютера), либо используйте git reflog.Последний отображает список действий, которые были выполнены в вашем хранилище, команда git pull должна быть частью этого.Просто git reset --hard X до состояния перед этой командой.

Или просто разветвите предыдущую HEAD (вы можете удалить / перезаписать предыдущую ветку), внесите свои изменения и выполните git pull снова ...

1 голос
/ 18 января 2011

Я думаю, вы не можете полностью восстановиться сейчас.Лучшее, что вы можете сделать - это git status, чтобы проверить, какие файлы все еще не повреждены.Если незафиксированных файлов здесь нет, они будут потеряны.

В следующий раз рассмотрите возможность использования git stash до git pull или, что еще лучше, используйте git fetch.


ЕСЛИ ВЫ РАСШИРЕННЫЙ ПОЛЬЗОВАТЕЛЬ GIT, И ФАЙЛЫ ДЕЙСТВИТЕЛЬНО ВАЖНО:

Если файлы подготовлены, вы можете извлечь их из репозитория объектов,Но они идут прямо в Git Guts, что я не думаю, что вы должны попробовать.

Если вы действительно хотите, прочитайте это:

0 голосов
/ 18 января 2011

Обновление 17 января 2011 г., 18:53

Просто перечитайте свой вопрос.Я упустил из виду, что вы вытаскиваете из проекта b, а не копируете файлы в свой проект.Не уверен, что мой ответ все еще остается в силе с учетом вашего сценария.Я думаю, что вам лучше всего следовать ответу геофрейда и получить ответ на вопрос StackOverflow Восстановление добавленного файла после выполнения git reset --hard HEAD ^ .

OriginalОтвет

Просто выполните 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> для отмены изменений в рабочем каталоге.Если я правильно читаю ваш вопрос, это то, что вы хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...