Почему git говорит: «Извлечь невозможно из-за того, что у вас есть незакрепленные файлы»?

197

Когда я пытаюсь открыть каталог проекта в терминале, я вижу следующую ошибку:

harsukh@harsukh-desktop:~/Sites/branch1$ git pull origin master
U app/config/app.php
U app/config/database.php
U app/routes.php
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Почему Git говорит "Pull is not possible because you have unmerged files", и как я могу решить это?

Харсух Маквана
источник
1
В моем случае я просто использовал эти команды "git add". затем "git commit -m" Test "и в конце" git push ". Ошибка устранена
Ахзар Назир
Вам просто нужно было добавить «$ git add <file>» ... чтобы обновить то, что будет зафиксировано или восстановлено (чтобы отменить изменения в рабочем каталоге), затем зафиксировать «$ git commit», затем «$ git push», чтобы завершить слияние.
find_X
На случай, если это поможет: я заметил, что просто делаю «git add». тогда совершение не сработало. Мне пришлось добавить отдельный файл по имени, затем зафиксировать и вытащить / нажать.
Уоном

Ответы:

215

В настоящее время происходит то, что у вас есть определенный набор файлов, которые вы пытались объединить ранее, но они вызывают конфликты объединения. В идеале, если возникает конфликт слияния, он должен разрешить их вручную и зафиксировать изменения, используя git add file.name && git commit -m "removed merge conflicts". Теперь другой пользователь обновил соответствующие файлы в своем хранилище и внес свои изменения в общее репозиторий верхнего уровня.

Случилось так, что ваши конфликты слияния (вероятно) с последним коммитом не были разрешены, поэтому ваши файлы не слились правильно, и, следовательно, для файлов установлен флаг U( unmerged). Так что теперь, когда вы делаете git pull, git выдает ошибку, потому что у вас есть какая-то версия файла, которая не может быть правильно решена.

Чтобы решить эту проблему, вам нужно разрешить конфликты слияния, а также добавить и зафиксировать изменения, прежде чем вы сможете это сделать git pull.

Образец репродукции и решение вопроса:

# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test

Во-первых, давайте создадим структуру хранилища

test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg"
repo $ cd .. && git clone repo repo_clone && cd repo_clone
repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

Теперь мы находимся в repo_clone, и если вы сделаете это git pull, это вызовет конфликты

repo_clone $ git pull origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/anshulgoyal/Desktop/test/test/repo
 * branch            master     -> FETCH_HEAD
   24d5b2e..1a1aa70  master     -> origin/master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

Если мы проигнорируем конфликты в клоне и сделаем больше коммитов в исходном репо,

repo_clone $ cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

И тогда мы делаем git pull, мы получаем

repo_clone $ git pull
U   file
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Обратите внимание, что filenow находится в неопрятном состоянии, и если мы сделаем a git status, то ясно увидим то же самое:

repo_clone $ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      file

Итак, чтобы решить эту проблему, нам сначала нужно разрешить конфликт слияния, который мы игнорировали ранее

repo_clone $ vi file

и установите его содержимое

text2
text1
text1

а затем добавить его и зафиксировать изменения

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts
му 無
источник
1
Чтобы быть полным, я бы добавил ответ @ Pawan, чтобы использовать git mergetool для разрешения конфликтов. Второй до последнего шага может быть не очень практичным («разрешить слияние ... [путем установки] ... его содержимого в: [некоторый текст]»).
undeniablyrob
Кроме того, вы можете объединить, используя советы @ user261. В любом случае, я думаю, что добавление шага о том, как объединить в практическом смысле, завершило бы этот ответ.
undeniablyrob
3
Этот ответ очень хорошо работает, когда у вас есть простые конфликты, которые нужно исправить для отдельных файлов. Например, одна или две строки кода, которые отличаются. Если у вас есть несколько файлов, которые были сильно изменены, это трудно исправить. Но это наводит на мысль о том, что с Git вы должны часто совершать обязательства, чтобы избежать сложных конфликтов.
Вон Д. Тейлор