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

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

[email protected]:~/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 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

Ответ 2

Вы пытаетесь добавить еще одну новую запись в свой локальный филиал, пока рабочий каталог не является чистым. В результате 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.

Ответ 3

git fetch origin
git reset --hard origin/master
git pull

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

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

Ответ 4

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

vimdiff

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

git mergetool

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

Ответ 5

Если вы хотите удалить удаленную ветвь для локального запуска (скажем, для проверки или тестирования), а когда вы $ 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)

Ответ 6

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

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master

Ответ 7

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

git reset HEAD --hard 

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

Если вы уже зафиксировали слияние локально (но еще не отправили на удаленное устройство) и хотите отменить его также:

git reset --hard HEAD~1 

Ответ 8

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

  • Удален весь файл, который запускается с символом 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

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

Ответ 9

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

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

Ответ 10

Просто запустите эту команду:

git reset --hard