Почему 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
- Вытянуть код из мастера
$ git pull origin master
- Проверено состояние
$ 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
- Добавлены все новые изменения -
$ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
- Зафиксировать изменения на голове -
$ git commit -am "resolved conflict of the app."
- Вытолкнул код -
$ git push origin master
Какой поворот может решить проблему с этим изображением -
![введите описание изображения здесь]()
Ответ 9
При возникновении конфликта слияния вы можете открыть отдельный файл. Ты получишь
символы "< < < < или → → → > ". Они относятся к вашим изменениям и изменениям, присутствующим на пульте дистанционного управления.
Вы можете вручную отредактировать требуемую часть.
после этого сохраните файл, а затем выполните:
git добавить
Конфликты слияния будут разрешены.
Ответ 10
Просто запустите эту команду:
git reset --hard