Почему git говорит: "Вытащить невозможно, потому что у вас есть несмешанные файлы"?

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

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" и как его разрешить?

82
задан Harsukh Makwana 15 окт. '14 в 10:28
источник поделиться

9 ответов

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

Так получилось, что ваши конфликты слияния (возможно) последнего коммита не были разрешены, поэтому ваши файлы не объединены в порядке и, следовательно, флаг 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'.

Обратите внимание, что file теперь находится в несвязанном состоянии, и если мы делаем 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
113
ответ дан mu 無 28 нояб. '14 в 13:51
источник поделиться
git fetch origin
git reset --hard origin/master
git pull

Объяснение выше упомянутой команды:

Подробнее о документации git в http://git-scm.com/docs.

31
ответ дан Faisal 30 янв. '17 в 9:05
источник поделиться

Вы пытаетесь добавить еще одну новую запись в свой локальный филиал, пока рабочий каталог не является чистым. В результате Git отказывается делать притяжение. Для лучшего визуализации сценария рассмотрите следующие диаграммы:

удаленный: A < -B < -C < -D
локальный: A < -B *
(* указывает, что у вас есть несколько файлов, которые были изменены, но не зафиксированы.)

Есть два варианта решения этой ситуации. Вы можете либо отменить изменения в своих файлах, либо сохранить их.

Вариант один: выбросить изменения
Вы можете использовать git checkout для каждого несвязанного файла, или вы можете использовать git reset --hard HEAD to reset все файлы в своей ветке в HEAD. Кстати, HEAD в вашем местном филиале B, без звездочки. Если вы выберете эту опцию, диаграмма станет следующей:

удаленный: A < -B < -C < -D
локальный: A < -B

Теперь, когда вы тянете, вы можете переадресовать свою ветку с изменениями от мастера. После того, как вы потянете, ветка будет выглядеть как master:

local: A < -B < -C < -D

Вариант второй: сохранить изменения
Если вы хотите сохранить изменения, вы сначала захотите разрешить любые конфликты слияния в каждом из файлов. Вы можете открыть каждый файл в своей среде IDE и искать следующие символы:

< < < < < < < ГОЛОВА
//ваша версия кода
=======

//удаленная версия кода
→ → → >

Git представляет вам две версии кода. Код, содержащийся в марке HEAD, представляет собой версию из текущей локальной ветки. Другая версия - это то, что исходит от пульта. После того, как вы выбрали версию кода (и удалили другой код вместе с маркерами), вы можете добавить каждый файл в свою промежуточную область, набрав git add. Последним шагом является фиксация вашего результата, набрав git commit -m соответствующим сообщением. На этом этапе наша диаграмма выглядит так:

удаленный: A < -B < -C < -D
локальный: A < -B < -C '

Здесь я обозначил фиксацию, которую мы только что сделали как C ', потому что она отличается от фиксации C на пульте. Теперь, если вы попытаетесь вытащить, вы получите немедленную ошибку вперед. Git не может воспроизвести изменения в удаленной области на вашей ветке, поскольку и ваша ветка, и удаленная часть отделились от общего предкового фиксации B. В этот момент, если вы хотите вытащить, вы можете либо сделать еще один git merge, либо git rebase ваша ветка на пульте дистанционного управления.

Получение мастерства Git требует способности понимать и манипулировать однонаправленными связанными списками. Надеюсь, это объяснение заставит вас думать в правильном направлении об использовании Git.

29
ответ дан Tim Biegeleisen 01 дек. '14 в 12:26
источник поделиться

Theres простое решение. Но для этого вам сначала нужно изучить следующие

vimdiff

Чтобы удалить конфликты, вы можете использовать

git mergetool

Вышеуказанная команда в основном открывает локальный файл, смешанный файл, удаленный файл (всего 3 файла) для каждого конфликтующего файла. Локальные и удаленные файлы предназначены только для справки, и с их помощью вы можете выбрать, что включать (или нет) в смешанный файл. И просто сохраните и закройте файл.

15
ответ дан Pawan Seerwani 03 дек. '14 в 22:04
источник поделиться

У вас есть локальные файлы, которые необходимо объединить, прежде чем вы сможете потянуть. Вы можете проверить файлы, а затем потянуть за перезапись локальных файлов.

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master
5
ответ дан Nick 15 окт. '14 в 10:32
источник поделиться

Если вы хотите удалить удаленную ветвь для локального запуска (скажем, для проверки или тестирования), а когда вы $ git pull получаете локальные конфликты слияния:

$ git checkout REMOTE-BRANCH
$ git pull  (you get local merge conflicts)
$ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD)
$ git pull (now get remote branch updates without local conflicts)
2
ответ дан user5245397 03 авг. '16 в 18:50
источник поделиться

Если вы не хотите объединять изменения и по-прежнему хотите обновить свой локальный, то перейдите к команде.

git reset HEAD —hard

Это будет reset ваш локальный с HEAD, а затем вытащите ваш пульт с помощью git pull!

1
ответ дан Santosh 11 июля '16 в 15:51
источник поделиться

Со мной была такая же проблема
В моем случае следующие шаги:

  • Удален весь файл, который запускается с символом U (unmerged). as-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. Вытянуть код из мастера
$ git pull origin master
  1. Проверено состояние
 $ git status

Вот сообщение, которое появилось -
и имеют соответственно 2 и 1 разные фиксации соответственно.
(use "git pull" to merge the remote branch into yours)
У вас есть несмываемые пути.
(fix conflicts and run "git commit")

Неподвижные пути:
(используйте "git добавить..." для отметки разрешения)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. Добавлены все новые изменения -
    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. Зафиксировать изменения на голове -
$ git commit -am "resolved conflict of the app."
  1. Вытолкнул код -
$ git push origin master

Какой поворот может решить проблему с этим изображением - введите описание изображения здесь

0
ответ дан S.Yadav 10 мая '17 в 10:30
источник поделиться

При возникновении конфликта слияния вы можете открыть отдельный файл. Ты получишь символы "< < < < или → → → > ". Они относятся к вашим изменениям и изменениям, присутствующим на пульте дистанционного управления. Вы можете вручную отредактировать требуемую часть. после этого сохраните файл, а затем выполните: git добавить

Конфликты слияния будут разрешены.

0
ответ дан dfordevy 11 февр. '16 в 12:44
источник поделиться

Другие вопросы по меткам