Почему 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", и как я могу это решить?

3550   9  

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

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

была такая же проблема со мной
В моем случае, шаги, как показано ниже-

  1. удалены все файлы, которые были начать с U (unmerged) символ. как-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. вытащить код из master

$ 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 add ..."чтобы отметить разрешение)

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

какой поворот может решить проблему с этим изображением - enter image description here

просто выполните эту команду:

git reset --hard

Comments

    Ничего не найдено.