Чому git каже: "Перетягнути неможливо, оскільки у вас є неперероблені файли"?


196

Коли я намагаюся втягнути в каталог свого проекту в терміналі, я бачу таку помилку:

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"і як це можна вирішити?


1
У моєму випадку я просто використовую ці команди "git add". потім "git commit -m" Test "і врешті-решт" git push ". Помилка видалена
Akhzar Nazir

Вам просто потрібно було додати "$ git add <file>" ... оновити те, що буде зроблено або відновити (щоб відмовити зміни в робочому каталозі), потім зробити "$ git commit", потім "$ git push", щоб укласти об'єднання.
find_X

У випадку, якщо це допомагає: я помітив, що просто роблю "git add". то вчинення не працювало. Мені довелося додати окремий файл по імені, потім зробити фіксацію та потягнути / натиснути.
ouonomos

Відповіді:


214

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

Так трапляється, що конфлікти ваших об'єднань з (мабуть) останньою фіксацією не були вирішені, тому ваші файли не об'єднані нормально, а значить U( unmerged) прапор для файлів. Отже, коли ви робите a 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

1
Для завершення я б додав відповідь @ Pawan, щоб використовувати 'git mergetool' для вирішення конфліктів. Крок другий-останній може бути не дуже практичним ("вирішити об'єднання ... [встановивши] ... його вміст: [деякий текст]").
безперечнороб

Крім того, ви можете злитися, скориставшись порадою @ user261. Так чи інакше, я думаю, що додавання кроку щодо того, як злитися в практичному сенсі, завершить цю відповідь.
безперечнороблять

3
Ця відповідь справді добре працює, коли у вас є прості конфлікти, які потрібно виправити на окремих файлах. Наприклад, один або два рядки коду, які відрізняються. Якщо у вас є кілька файлів, які були сильно змінені, це важко виправити. Але додому приходить думка, що з Git вам слід часто погоджуватися, щоб уникнути складних конфліктів.
Вон Д. Тейлор

46

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

віддалений: A <- B <- C <- D
local: A <- B *
(* вказує на те, що у вас є кілька файлів, які були змінені, але не скоєні.)

Є два варіанти вирішення цієї ситуації. Ви можете або відкинути зміни у своїх файлах, або зберегти їх.

Варіант перший: викиньте зміни, які
ви можете використовувати git checkoutдля кожного неперевіреного файлу, або ви можете git reset --hard HEADскинути всі файли у вашій гілці до HEAD. До речі, HEAD у вашому місцевому відділенні - B, без зірочки. Якщо ви виберете цей варіант, схема стає:

віддалений: A <- B <- C <- D
локальний: A <- B

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

місцеві: 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.


33

Є просте рішення для цього. Але для цього спочатку потрібно буде вивчити наступне

vimdiff

Щоб видалити конфлікти, ви можете використовувати

git mergetool

Наведена вище команда відкриває локальний файл, змішаний файл, віддалений файл (всього 3 файли) для кожного конфліктуючого файлу. Локальні та віддалені файли - лише ваша довідка, і за їх допомогою ви можете вибрати, що потрібно включати (чи ні) до змішаного файлу. І просто збережіть і закрийте файл.


2
Я б сказав, що vimdiff не потрібно (ви можете використовувати будь-який інструмент злиття / різниці на ваш вибір, наприклад, WinMerge або вбудований FileMerge OSX тощо). Сказавши це, це чудове доповнення до відповіді @ mu.
безперечнороблять

32

Якщо ви не хочете об'єднати зміни, і все ще хочете оновити локальний, запустіть:

git reset --hard HEAD  

Це скине місце з допомогою HEAD, а потім витягніть ваш пульт за допомогою git pull.

Якщо ви вже здійснили злиття локально (але ще не натиснули на віддалений), а також хочете відновити його:

git reset --hard HEAD~1 

7

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

5

У вас є локальні файли, які потрібно об'єднати, перш ніж ви зможете витягнути їх. Ви можете перевірити файли, а потім потягніть, щоб перезаписати локальні файли.

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

Об'єднання об'єднує вміст двох файлів. Наразі ваші локальні файли відрізняються від файлів на віддаленому сервері. Об'єднання повинно здійснюватися на віддаленому сервері. Отже, якщо ви ставите редаговані файли та натискаєте їх, ваші зміни будуть додані до файлів у сховищі. Тоді ваші файли будуть синхронізовані, і ви можете перетягнути весь проект з іншими змінами. Я знайшов книгу довідки про git дуже корисною, коли почав використовувати git. Ви можете знайти його тут: git-scm.com/book/en/Getting-Started
Нік

Зауважте, що я не ОП. "Об'єднання файлів" - це неправильна термінологія. Строго кажучи, ви зливаєте коміти, а не файли.
jub0bs

Так, це правда, мої вибачення. Я намагався дати просту відповідь
Нік

Що ж, якщо у вас є конфлікти під час об'єднання комітету, то так, у вас будуть конфліктуючі, неперероблені файли, і вам потрібно буде їх об'єднати.
Едвард Томсон

3

Кроки для виконання:

step-1 : git reset --hard HEAD  (if you want to reset it to head)
step-2 : git checkout Master 
step-3 : git branch -D <branch Name>
(Remote Branch name where you want to get pull) 
step-4 : git checkout <branch name>
step-5 : git pull. (now you will not get any
error)

Спасибі, Сарбашиш


2

Зі мною виникла
така ж проблема. У моєму випадку кроки наведені нижче,

  1. Вилучено весь файл, який починався із символу U (не занурений) . як

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 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

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


1

Якщо виникає конфлікт злиття, ви можете відкрити окремий файл. Ви отримаєте символи "<<<<<<< або >>>>>>>". Вони стосуються ваших змін та змін, які існують на дистанційному. Ви можете вручну відредагувати необхідну частину. після цього збережіть файл і виконайте: git add

Конфлікти злиття будуть вирішені.


-1

Просто запустіть цю команду:

git reset --hard

3
Ви повинні пояснити, що робить команда, оскільки деякі люди будуть дуже розчаровані, якщо спробують і дізнаються, що вона видалила всі їхні поточні локальні зміни: /
Джозеф Будін

Це працює, якщо ви просто копіюєте свої зміни у зовнішнє тимчасове джерело. Якщо у вас є лише пара файлів, наприклад, конфігураційні файли для проекту, це ідеально. Виконайте команду та відновіть зміни. Для мене працює!
cwiggo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.