왜 자식이 "파일을 병합 해제했기 때문에 풀을 사용할 수 없습니다"라고 표시합니까?


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

왜 자식이라고 말하고 "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) 플래그가 발생합니다. 이제는.을 수행 할 때 git pullgit에서 오류가 발생합니다. 파일의 일부 버전이 올바르게 해결되지 않았기 때문입니다.

이 문제를 해결하려면 문제의 병합 충돌을 해결하고 변경 사항을 추가 및 커밋해야합니다 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을 사용하면 어려운 갈등을 피하기 위해 종종 커밋해야한다는 생각을 갖게됩니다.
본 D. 테일러

46

작업 디렉토리가 깨끗하지 않은 상태에서 로컬 분기에 하나 이상의 새 커밋을 추가하려고합니다. 결과적으로 Git은 당기기를 거부합니다. 시나리오를 더 잘 시각화하려면 다음 다이어그램을 고려하십시오.

원격 : A <-B <-C <-D
로컬 : A <-B *
(*는 수정되었지만 커밋되지 않은 여러 파일이 있음을 나타냅니다.)

이 상황을 처리하기위한 두 가지 옵션이 있습니다. 파일의 변경 사항을 삭제하거나 유지할 수 있습니다.

옵션 하나를 변경 버리고
당신이 중 하나를 사용할 수있는 git checkout각 병합되지 않은 파일이, 또는 당신이 사용할 수있는 git reset --hard HEADHEAD로 지점에있는 모든 파일을 재설정합니다. 그건 그렇고, 현지 지점의 HEAD는 별표가없는 B입니다. 이 옵션을 선택하면 다이어그램이 다음과 같이됩니다.

원격 : A <-B <-C <-D
로컬 : A <-B

이제 잡아 당기면 마스터의 변경 사항으로 지점을 빨리 감을 수 있습니다. 당기면 지점이 마스터처럼 보입니다.

로컬 : A <-B <-C <-D

옵션 2 : 변경 사항 유지 변경 사항
을 유지하려면 먼저 각 파일의 병합 충돌을 해결해야합니다. IDE에서 각 파일을 열고 다음 기호를 찾을 수 있습니다.

<<<<<<< HEAD
// 코드 버전
=======
// 리모컨의 코드 버전
>>>>>>>

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 또는 OSX의 내장 FileMerge 등 원하는 병합 / diff 도구를 사용할 수 있습니다). 그러나 이것은 @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 help book이 매우 유용하다는 것을 알았습니다. 여기에서 찾을 수 있습니다 : git-scm.com/book/en/Getting-Started
Nick

나는 OP가 아닙니다. "파일 병합"은 잘못된 용어입니다. 엄밀히 말하면 파일이 아닌 커밋을 병합합니다.
jub0bs

아 맞다, 나의 정책이다. 나는 간단한 대답을하려고 노력했다
Nick

커밋을 병합 할 때 충돌이 발생하면 병합되지 않은 파일이 충돌하여 병합해야합니다.
에드워드 톰슨

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)

고마워, Sarbasish


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
/ : 어떤 사람들은 매우 실망 때문에 그들이 시도하고 현재의 로컬 변경 사항을 모두 삭제 알아낼 경우, 명령이 무엇을하는지 설명해야
조셉 Budin

변경 사항을 외부 임시 소스에 복사하면 효과가 있습니다. 프로젝트의 구성 파일과 같은 파일이 몇 개만 있으면 완벽합니다. 명령을 수행 한 후 변경 사항을 되 돌리십시오. 나를 위해 작동합니다!
cwiggo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.