Git извлечь из чистой директории конфликты слияния

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

Является ли это ошибкой в ​​ git? Я мало знаю об этом, поэтому я полностью согласен с тем, что сделал это с собой.

Здесь мой усеченный вывод (это происходит примерно с 9 файлами, но я хотел сэкономить место, а имена файлов были изменены для защиты невинных):

$ git status
# On branch master
nothing to commit (working directory clean)
$ git pull
Auto-merged xxxx/xxxx/xxxx.xxx
CONFLICT (content): Merge conflict in xxxx/xxxx/xxxx.xxx
Automatic merge failed; fix conflicts and then commit the result.

Я использую Solaris 11 Express с пакетом по умолчанию git.

$ uname -a
SunOS xxxx 5.11 snv_151a i86pc i386 i86pc Solaris
$ git --version
git version 1.5.6.5
$ pkg list git
NAME (PUBLISHER)                              VERSION         STATE      UFOXI
developer/versioning/git                      1.5.6.5-0.151.0.1 installed  -----

Я нашел этот вопрос: Git pull failed: у вас есть неустановленные изменения. Git статус: ничего не зафиксировать (рабочий каталог чист), который кажется самым близким, но имеет неудовлетворительный ответ.

Как я могу пройти мимо этого без удаления всего моего репозитория и создания нового клона?

Ответ 1

Ваш рабочий каталог может быть чистым, но у вас есть одна или несколько коммитов, которые вы сделали локально, а не на сервере. Когда вы тянете, git пытается объединить эти локальные коммиты с теми, что есть на сервере, но поскольку они изменяют одну и ту же область кода, они конфликтуют.

Ваши варианты здесь в основном сводятся к:

  • Исправить конфликты. Вы сообщаете git, как обрабатывать конфликтующие изменения и двигаться дальше.
  • Восстановите и устраните конфликты с помощью git pull --rebase. Это не сильно отличается от 1, но если ваши изменения никогда не публиковались (т.е. Никогда их не толкали), это может дать вам более чистую (линейную) историю.
  • Отмените локальные изменения и используйте пульт дистанционного управления, с git reset --hard remotename/remotebranch. Это потеряет любые изменения, которые вы совершили локально, но не нажали в другом месте.

Ответ 2

Потяните, разрешите конфликты слияния и зафиксируйте? Даже если у вас есть чистый рабочий каталог, если вы совершили какую-то работу, которая противоречит входящим изменениям, вы получаете конфликт слияния.

Ответ 3

Добавляя к bdonlan ответ, это может произойти, когда у вас есть некоторые коммиты (в вашем локальном репозитории), но удаленный репозиторий впереди (был некоторый прогресс по сравнению с вашими локальными файлами).

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

Попытался сделать " rebase" или " reset --hard" без везения.

Единственное решение, с которым я работал, заключалось в том, чтобы возвратить один фиксатор и тянуть;

Следуйте следующим шагам:

Предупреждение: это разрушительная операция, которая приведет к потере последних изменений этого кода, поэтому сначала создайте резервные копии своих изменений!

  • Используйте ' git журнал' в своем локальном репозитории и сравните это с журналом коммитов на удаленном компьютере - чтобы понять, какая из ваших фиксаций не была нажата
  • Используйте git reset --hard ', чтобы вернуться в последний раз, когда ваш код подходит к удаленному репозиторию (я использовал git reset - -hard HEAD ^ ', чтобы сознательно потерять мою предыдущую фиксацию)
  • Теперь ' git pull' будет работать; использовать его для получения последнего кода с удаленного сервера.