병합 후 커밋시 Git 오류-치명적 : 병합 중 부분 커밋을 수행 할 수 없음


280

나는 git pull갈등으로 끝난 것을 달렸다 . 나는 갈등을 해결했고 지금은 모든 것이 괜찮습니다 (mergetool도 사용했습니다).

해결 된 파일을 커밋 git commit file.php -m "message"하면 오류가 발생합니다.

fatal: cannot do a partial commit during a merge.

나는 전에 같은 문제가 있었고 -a커밋에서 사용 하는 것이 완벽하게 작동했습니다. 모든 변경 사항을 적용하고 싶지 않기 때문에 이것이 완벽한 방법은 아니라고 생각합니다. 별도의 주석으로 파일을 별도로 커밋하고 싶습니다. 어떻게해야합니까? git에서 왜 병합 후 사용자가 파일을 별도로 커밋 할 수 없습니까? 이 문제에 대한 만족스러운 답변을 찾을 수 없습니다.


5
그리고 git perform "full commit"을 검색하면 거의 아무것도 반환되지 않습니다. Git의 맨 페이지에서 하나의 관련 문서가 없습니다. 이것은 비참한 도구입니다.
jww

6
@Torek-Git이 만든 또 다른 혼란에 대해 이야기하십시오 ... 왜 다른 지점에서 충돌하는 파일을 체크 아웃하여 충돌을 피하고이 지점에 추가 한 다음 커밋합니까? 그리고 WTF는 부분 커밋입니까? 나는 그것에 대한 문서를 찾을 수 없습니다 ... 사용자는 아래의 추측을 시도해야합니다 ...
jww

넌 어떻게 그걸 했니? 충돌이있어 아무것도 할 수 없습니다
Niklas R.

답변:


442

커밋 명령에 "-i"를 추가하면이 문제가 해결됩니다. -i는 기본적으로 커밋하기 전에 추가 파일을 준비하도록 지시합니다. 그건:

git commit -i myfile.php

18
무슨 Stage additional files뜻입니까?
jcalfee314

9
git에서 @ jcalfee314 준비는 커밋을 위해 파일을 준비하는 것입니다. 이 경우 커밋하기 전에 명령 줄을 통해 파일을 준비합니다. -i 플래그는 주로 병합을 완료 할 때 사용됩니다. 커밋 플래그에 대한 자세한 내용은 여기를 참조하십시오 .
MikaelHalen

4
@ jcalfee314 나는 확인 설명서를 하며 말한다 "는 지금까지 개최 내용을 밖으로 커밋하기 전에 단계가 아니라. 이것은 당신이 충돌 병합을 체결하지 않는 한 당신이 원하는 보통 아닌 명령 행에서 주어진 경로의 내용으로" . 내 생각 에이 조건에서 스테이징 영역에 해결할 수없는 일종의 불일치 git add가있어 git commit실패합니다. 추가하면 -igit에게 동시에 추가하고 커밋하도록 지시합니다. 나는 왜 그런지 잘 모르겠지만 이해가되는 것 같습니다.
JonSlowCN

5
나와 같은 멍청한 놈에게는 따옴표없이 공백이 포함 된 메시지를 시도하면 이와 동일한 오류가 발생합니다. 예 : [git commit -m one two three] 맞음 : [git commit -m "one two three"]
Skychan

2
@Skychan의 의견은 저에게 딱 맞는 티켓이었습니다.
tehbeardedone

106
git commit -am 'Conflicts resolved'

이것은 나를 위해 일했습니다. 이것을 시도해 볼 수도 있습니다.


1
놀랍습니다, 나는 이것을 몰랐습니다!
JeanValjean

11
이렇게하면 모든 수정 된 파일이 커밋에 추가 됩니다 (스테이징 되지 않은 파일도 바람직하지 않음). 사용자는 'a'플래그를 떠나고 싶을 수도 있습니다
Chase Sandmann

4
이것은 사용자가하지 말 것을 요구하는 것인데, 이는 모든 파일의 커밋을 피하는 것입니다.
Michael

33

git commit -i대부분의 경우 사용할 수 있지만 작동하지 않는 경우

해야합니다 git commit -m "your_merge_message". 병합 충돌 중에 단일 파일 하나를 병합 할 수 없으므로 다음을 수행해야합니다.

  1. 충돌 한 파일 만 준비 ( git add your_file.txt)
  2. git commit -m "your_merge_message"

16

커밋을 위해 준비하지 않은 무언가가 충돌했을 수 있습니다. git을 사용하면 독립적으로 일을 커밋 할 수 없습니다 (모두 병합의 일부이기 때문에) . git add그런 다음 해당 파일 을 필요로 합니다 git commit -m "Merge conflict resolution". 에 대한 -i플래그 git commit가 추가됩니다.


5
1.9.0에 – commit -i작동했지만git add; git commit
LeeGee

14

-mgit merge 충돌을 해결할 때 git commit에서 잊어 버렸을 때 이것을 얻었습니다 .

git commit "commit message"

해야한다

git commit -m "commit message"

2
아 아! 나는 다시 잊었다!
user2705463


6

작업 중간에 병합이 중지되었습니다. 파일을 추가 한 다음 'git commit'을 추가해야합니다.

git add file_1.php file_2.php file_3.php git commit

건배


5

체리 따기 전체를 ​​버리고 원하는 세트로 파일을 커밋하려면,

git reset --soft <ID-OF-THE-LAST-COMMIT>

당신을 거기에 데려다줍니다.

소프트 리셋은 현재 HEAD를 가리키는 포인터를 커밋 (ish)으로 이동하지만 파일을 변경하지는 않습니다. 강제 재설정은 포인터를 이동시키고 모든 파일을 해당 커밋 (ish) 상태로 되돌립니다. 즉, 소프트 리셋을 사용하면 병합 상태를 지우고 실제 파일을 변경 한 다음 원하는대로 개별적으로 커밋하거나 재설정 할 수 있습니다.


좀 더 설명해 주시겠습니까? 이것은 아마도 내가 필요로하는 것이지만 그것이 어떻게 작동하는지 따라 가지 않습니다 ... 여기에있는 모든 대답은 '파일을 추가하고 커밋하십시오!'입니다. 그러나 그것은 너무나 명백합니다. 내가 여기있는 이유는 커밋하기 전에 해당 파일을 추가하고 싶지 않기 때문입니다. -_-;
Kyle Baker

도움이됩니다. 감사. :)
Kyle Baker

5
  1. 프로젝트 디렉토리로 이동
    1. 숨겨진 파일 표시 (.git 폴더가 나타남)
    2. .git 폴더를여십시오
    3. MERGE_HEAD 제거
    4. 다시 커밋
    5. git이 git이 잠겨 있다고 말하면 .git 폴더로 이동하여 index.lock을 제거하십시오.
    6. 이번에는 모든 것이 잘 작동합니다.

큰! 그것은 나를 위해 일할 것입니다. 그런데 MacOS의 경우 터미널에서`open .git`을 호출 할 수 있다면, 마녀는 Finder에 '.git'컨텐츠를 표시합니다
tontonCD

이것은 나에게도 효과적입니다. 이것은 답변으로 받아 들여 져야합니다.
vandu

3

나 자신은 모든 파일을 해결하기 전에 병합을 커밋하려고했을 때 SourceTree에서 발생했습니다. 그런 다음 마지막 파일을 해결 된 것으로 표시했지만 커밋하려고 할 때 여전히이 오류가 발생했습니다. SourceTree를 닫았다가 다시 열었습니다.


1
고맙지 만 불행히도 이것은 나를 위해 작동하지 않았습니다. 짜증나게, 병합을 커밋하기 전에 view-private과 병합을 커밋해야했습니다.
Coxy

3

Xcode의 소스 제어 만 사용하여 완전히 다른 접근법 으로이 문제를 해결했습니다 .

배경 : 다른 팀은 Beanstalk를 통해 원격 Git 리포지토리로 변경 사항을 적용했습니다. 결국, .xcodeproj 파일은 다른 디렉토리에 있었고 변경 사항은 적용되지 않았습니다. 나중에 커밋하려고 할 때 Xcode에서 Tree Conflict 오류가 발생했습니다.

나무 갈등 스크린 샷

Xcode를 사용하여 수정하는 것이 거의 불가능하기 때문에 .xcodeproj파일을 Git 서버에서 다운로드 한 버전으로 바꿨습니다. 결과적으로 Xcode 프로젝트가 정리되었지만 손상된 풀의 모든 업데이트가 변경 사항으로 표시되어 커밋을 위해 준비되었습니다.

이 모든 개조 및 추가 파일을보십시오

그러나 커밋하려고 할 때 여기에서 설명한 것과 같은 "치명적 : 병합 중에 부분 커밋을 수행 할 수 없습니다"라는 오류가 발생했습니다.

문제를 해결하는 방법은 다음과 같습니다 ... (지금은 신인 프로그래머라는 것을 이해하고 약간의 이해가 부족하지만 내 무지로 인해 다른 방법을 찾게되었습니다.) 먼저 마스터를 복제했습니다. 2 차 지점으로 분기하여 해당 지점으로 전환하십시오. 그런 다음 Working Copy를 작성하고 원래 프로젝트 디렉토리 외부의 해당 작업 사본에 디렉토리를 배치했습니다. (필요한지 모르겠지만 다른 문제 해결 기술을 읽을 때 내가 한 일을 알았습니다.) 그런 다음 지점을 마스터로 전환하여 모든 준비된 파일 (커밋으로 변경)이 사라 졌다는 것을 깨달았습니다. 모든 파일이 상대방의 최신 변경 사항으로 업데이트되도록 모든 파일을 복제하는 ThirdBranch라는 새 브랜치를 만들었습니다. 그것을 Git 서버에 푸시하고 Beanstalk가 마스터 브랜치의 서버 버전을 방금 밀었던 ThirdBrach 브랜치 (행별로)와 비교하게하고 상대방의 모든 변경 사항이 내 Xcode에 존재했습니다. 이것은 내 마스터 리포지토리와 Git 마스터 리포지토리가 동일하다는 것을 의미하므로 Xcode를 사용하여 문제를 해결했는지 확인합니다.

방금 설명한 내용을 넘어서서 어떻게해야하는지 묻지 말고 확실히 남은 격차를 메우십시오. 나는 이것에 익숙하지 않으며 모든 것을 이해하지 못합니다. 숙련 된 프로그래머가 관련이없는 정보를 관련 정보와 분리하고이 기술을보다 명확하게 재생성 할 수 있습니다.

이것은 다음과 같이 질문을 복제하는 중복 답변입니다 .Xcode Git Merge가 실패 했습니다.


2
중복 답변을 게시하지 마십시오. 근본적인 문제는 동일 할 수 있지만, 귀하의 답변은 훨씬 더 구체적인 문제에 대한 것이며이 일반적인 질문에 대한 답변 만 흐리게합니다. 이 경우 원래 답변에 연결하는 질문에 대한 의견이 더 적절하다고 생각합니다.
Fookatchu

2

병합하는 동안 Git은 모든 종류의 이유로 부모 브랜치를 추적하려고합니다. git이 보는 것처럼 병합하는 것은 아닙니다. 리베이스 또는 체리 픽을 수동으로 수행 할 수 있습니다.


1
나는 전에 rebase 또는 cherry-pick을 사용하지 않았으며, 지금 막 매뉴얼을 살펴 보았으므로 충돌을 병합 한 후 "git rebase master"는 무엇을 제안합니까?
pMan

1
병렬 워크 플로입니다. 참조 stackoverflow.com/questions/804115/git-rebase-vs-git-merge을 당신이 "병합"별도의 커밋 대신 목표 지점의 끝 부분에 소스 지점을 리베이스 수 있도록하려면, 기본적으로.
Talljoe

1
각 개별 파일을 git 추가 한 다음 -a없이 커밋하십시오.
피터 DeWeese

4
당신은 실제로 그 질문에 대답하지 않고 오히려 더 많은 것을 검색하도록 주었다. 이제 "벚꽃 따기 란 무엇인가"와 "리베이스 란 무엇인가"를 알아야합니다.
ftrotter

2
이 답변이 다운 투표 된 이유가 궁금합니다. 누군가 내가 전에 알지 못했던 것을 말해 줄 때 나는 항상 아이의 호기심을 가졌습니다. 위에서 언급했듯이 이제 체리 픽과 리베이스에 대해 알고 있습니다. 진보적이고 도움이되지 않았습니까?
pMan

2

git commit -i -m 'merge message'나를 위해 작동하지 않았다. 그것은 말했다 :

fatal: No paths with --include/--only does not make sense.

FWIW, 나는 이 메시지를 받고 있기 때문에이 관련 질문을 통해 여기 에 도착했습니다.

fatal: You have not concluded your merge (MERGE_HEAD exists).

나는 또한 mergetool을 시도했다 No files need merging. 매우 혼란 스럽다! 따라서 MERGE_HEAD는 병합이 필요한 파일에 없습니다-??

마지막 으로이 트릭을 사용하여 수정 된 파일 만 추가했습니다 (트랙하지 않으려는 일부가 있기 때문에 트리에 모든 파일을 추가하고 싶지는 않았습니다).

git ls-files -m | xargs git add

그런 다음 나는 마침내 커밋하고 밀어 올릴 수있었습니다. git이 이러한 상황에서 수행 할 작업에 대한 더 나은 힌트를 주면 좋을 것입니다.


1

가있는 경우 소스 트리 충돌이 해결 된 후 해결, 우리는 명시 적으로 파일을 표시해야합니다. 충돌없이 해결 된 파일선택하십시오 . 그런 다음 조치-> 충돌 해결-> 표시 해결 . 파일이 여러 개인 경우 모두 동일한 작업을 수행하십시오. 지금 커밋하십시오.


1

모든 의견을 읽은 후. 이것은 내 결의안이었습니다.
커밋보다 다시 "추가"해야했습니다.

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html

1

소스 트리 또는 다른 GUI를 사용하는 경우 병합 후 모든 파일을 확인하십시오.


0

병합 중에 충돌이 발생하고 수동 해결이 필요한 델타가있는 경우가 있습니다. 이 경우 언급 된 파일의 수동 해상도를 수정하십시오.

이제 발행하면

git status Lib/MyFile.php

당신은 같은 출력을 볼 수 있습니다

On branch warehouse
Your branch and 'origin/warehouse' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   Lib/MyFile.php

이미 커밋을 준비 했으므로 문제가 필요합니다.

git commit

그리고 당신의 커밋은 아무런 문제없이 이루어질 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.