Почему 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", и как я могу это решить?
9 ответов:
в настоящее время происходит то, что у вас есть определенный набор файлов, которые вы пытались объединить ранее, но они вызвали конфликты слияния. В идеале, если вы получаете конфликт слияния, он должен разрешить их вручную и зафиксировать изменения с помощью
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'.отметим, что
fileтеперь находится в несвязанном состоянии, и если мы сделаем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
вы пытаетесь добавить еще один новый коммит в локальную ветку, пока ваш рабочий каталог не чист. В результате Git отказывается делать тягу. Рассмотрим следующие диаграммы, чтобы лучше визуализировать сценарий:
remote: A
local: A
(*указывает, что у вас есть несколько файлов, которые были изменены, но не зафиксированы.)есть два варианта для решения этой ситуации. Вы можете либо отменить изменения в ваших файлах, либо сохранить их.
Вариант первый: выбросить изменения
Вы можете использоватьgit checkoutдля каждого несвязанного файла, или вы можете использоватьgit reset --hard HEADчтобы сбросить все файлы в вашей ветке в HEAD. Кстати, голова в вашем местном филиале-это B, без звездочки. Если вы выберете этот параметр, диаграмма станет:remote: A
local: Aтеперь, когда вы тянете, вы можете быстро перемотать свою ветку с изменениями от master. После вытягивания, вы ветка будет выглядеть как мастер:
local: A
Вариант второй: Сохранить изменения
Если вы хотите сохранить изменения, вы сначала захотите разрешить любые конфликты слияния в каждом из файлов. Вы можете открыть каждый файл в IDE. и обратите внимание на следующие символы:// ваша версия кода
= = = = = = =
// удаленная версия кода
>>>> > > >Git представляет вам две версии кода. Код, содержащийся в маркерах головы, является версией из вашего текущего локального филиала. Другая версия-это то, что приходит с пульта дистанционного управления. После того, как вы выбрали версию кода (и удалили другой код вместе с маркерами), вы можете добавить каждый файл в промежуточную область, введя
git add. Последний шаг-зафиксировать свой результат, набравgit commit -mС соответствующим сообщением. На данный момент наша диаграмма выглядит так:remote: A
local: Aздесь я обозначил фиксацию, которую мы только что сделали, как C', потому что она отличается от фиксации C на пульте дистанционного управления. Теперь, если вы попытаетесь потяните, вы получите ошибку без быстрой перемотки вперед. Git не может воспроизвести изменения в remote на вашей ветке, потому что и ваша ветвь, и удаленный разошлись от общего предка commit B. В этот момент, если вы хотите вытащить, вы можете сделать еще один
git mergeилиgit rebaseваша ветка на пульте дистанционного управления.для овладения Git требуется умение понимать и манипулировать однонаправленными связанными списками. Я надеюсь, что это объяснение заставит вас думать в правильном направлении о с помощью Git.
есть простое решение. Но для этого вам сначала нужно узнать следующее
vimdiffчтобы удалить конфликты, вы можете использовать
git mergetoolвышеуказанная команда в основном открывает локальный файл, смешанный файл, удаленный файл (всего 3 файла), для каждого конфликтного файла. Локальные и удаленные файлы предназначены только для справки, и с их помощью вы можете выбрать, что включать (или нет) в смешанный файл. И просто сохраните и закройте файл.
у вас есть некоторые файлы локально, которые должны быть объединены, прежде чем вы можете вытащить. Вы можете проверить файлы, а затем потянуть, чтобы перезаписать локальные файлы.
git checkout app/config/app.php app/config/database.php app/routes.php git pull origin master
Если вы хотите снять удаленную ветку для запуска локально (скажем, для просмотра или тестирования), и когда вы
$ 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)
Если вы не хотите объединять изменения и все еще хотите обновить свой локальный, перейдите к команде.
git reset HEAD —hardэто сбросит ваш локальный с головой, а затем вытащить пульт дистанционного управления с помощью git pull!
при возникновении конфликта слияния можно открыть отдельный файл. Вы получите " > > > > > > " символы. Они относятся к вашим изменениям и изменениям, присутствующим на пульте дистанционного управления. Вы можете вручную отредактировать требуемую деталь. после этого сохраните файл и выполните : git add
конфликты слияния будут решены.
была такая же проблема со мной
В моем случае, шаги, как показано ниже-
- удалены все файлы, которые были начать с U (unmerged) символ. как-
U project/app/pages/file1/file.ts U project/www/assets/file1/file-name.html
- вытащить код из master
$ 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 add ..."чтобы отметить разрешение)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

Comments