Git rebase-모든 병합 충돌이 해결 된 경우에도 계속 불평


115

해결 방법을 잘 모르겠습니다.

내 지점에서 마스터에 대한 리베이스를 수행했습니다.

git rebase master

다음과 같은 오류가 발생했습니다.

 First, rewinding head to replay your work on top of it...
 Applying: checkstyled.
 Using index info to reconstruct a base tree...
 Falling back to patching base and 3-way merge...
 Auto-merging AssetsLoader.java
 CONFLICT (content): Merge conflict in AssetsLoader.java
 Failed to merge in the changes.
 Patch failed at 0001 checkstyled.

그래서 내가 좋아하는 편집기로 가서 1 줄 충돌을 수정하고 파일을 저장하고 git 상태를 수행하고 다음 출력을 얻었습니다.

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   PassengerContactHandler.java
 #
 # Unmerged paths:
 #   (use "git reset HEAD <file>..." to unstage)
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #
 #  both modified:      AssetsLoader.java
 #

나는 git add AssetsLoader.java 및 git status를 수행하고 다음을 얻었습니다.

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   AssetsLoader.java
 #  modified:   PassengerContactHandler.java
 #

그리고 내가 git rebase --continue했을 때 다음을 얻습니다.

git rebase --continue
You must edit all merge conflicts and then
mark them as resolved using git add

패치를 건너 뛰고 리베이스를 계속할 수 있다는 것을 알고 있지만 PassengerContactHandler.java의 변경 사항이 내 브랜치에 리베이스 될지 여부는 확실하지 않습니다.

잘 모르겠습니다. 어떻게 진행해야하나요?

편집 : 충돌이 해결 된 파일이 원래 버전과 똑같을 수 있습니까?

고마워, Lucas

편집, 그것은 나에게 다시 일어났습니다.

다시 나에게 일어난 일

(307ac0d...)|REBASE)$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   assets/world/level1/Level-1.xml
#   modified:   George.java
#   modified:   DefaultPassenger.java
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   mb-art/originalAssets/27dec/

((307ac0d ...) | REBASE) $ git rebase --continue

You must edit all merge conflicts and then
mark them as resolved using git add

git --version

git version 1.7.1

이것이의 전체 출력입니다 git status. 아래에 누락 된 섹션이 없습니까?
Cascabel 2011

git-rebase해결되지 않은 충돌이 없다고보고해서는 안됩니다. 더 간단한 테스트 케이스에서 문제를 재현 할 수 있다면 디버그하는 것이 훨씬 더 쉬울 것입니다.하지만 그래도 git status충돌이 발생 git rebase --continue하지 않았고 Git 버전이 최신 버전이면 Git 개발자에게 이메일을 보내보세요. git@vger.kernel.org의 메일 링리스트에 최대한 많은 진단 정보를 제공합니다.
Cascabel

1
(307ac0d ...) | REBASE) $ git status # 현재 어떤 브랜치에도 없습니다. # 커밋 할 변경 사항 : # ( "git reset HEAD <file> ..."을 사용하여 스테이지 해제) # # 수정 됨 : assets / world / level1 / Level-1.xml # 수정 됨 : George.java # 수정 됨 : DefaultPassenger.java # # 추적되지 않은 파일 : # (커밋 할 내용에 포함하려면 "git add <file> ..."사용) # # mb-art / originalAssets / 27dec /
Lucas

GITKRAKEN을 사용해야한다고 생각합니다. 갈등을 해결하는 데 도움이 될 것입니다
Nikhil Bhardwaj

답변:


115

이는 충돌을 수정할 때 리베이스중인 브랜치에 적용된 패치 비잉의 모든 코드를 제거했기 때문에 발생합니다. git rebase --skip계속 하려면 사용 하세요.

좀 더 자세한 정보 :

일반적으로 리베이스 중에 충돌을 수정할 때 충돌하는 파일을 편집하여 현재 리베이스하는 브랜치에 적용되는 패치의 코드 일부 또는 전체를 유지합니다. 패치를 수정하고 수행 한 후

git add your/conflicted/file
git status

수정 된 파일을 표시하는 (일반적으로 녹색) 줄이 표시됩니다.

수정 됨 : 귀하 / 충돌 / 파일

git rebase --continue는이 상황에서 잘 작동합니다.

그러나 때로는 충돌을 해결할 때 새 패치의 모든 항목을 제거하고 기반으로 한 브랜치의 코드 만 유지합니다. 이제 파일을 추가하면 리베이스하려는 파일과 똑같습니다. git 상태에는 수정 된 파일을 표시하는 녹색 선이 표시되지 않습니다. 자, 그렇다면

git rebase --continue

자식은 불평합니다

변경 사항 없음- 'git add'사용을 잊으셨습니까?

이 상황에서 git이 실제로 원하는 것은

git rebase --skip

패치를 건너 뜁니다. 이전에 저는 이것을 한 적이 없었습니다. 제가 그렇게한다면 실제로 건너 뛸 것이 무엇인지 항상 확신 할 수 없었기 때문에 "이 패치 건너 뛰기"가 실제로 무엇을 의미하는지 분명하지 않았습니다. 그러나 녹색 선이 없으면

수정 됨 : 귀하 / 충돌 / 파일

충돌하는 파일을 편집하고 추가하고 git status를 수행 한 후 전체 패치를 제거하고 대신 사용할 수 있습니다.

git rebase --skip

계속하다.

원래 게시물은 이것이 때때로 작동한다고 말했습니다.

git add -A
git rebase --continue
# works magically?

...하지만 이것에 의존하지 마십시오 (저장소 폴더에 남은 파일을 추가하지 마십시오)


1
나는 똑같은 문제와 똑같은 해결책을 가지고있는 것 같았고, 또한 마법처럼 보였다!
bspink 2015-04-30

나는 같은 문제가 있었는데, 리베이스 브랜치에서 리팩토링하고 새 파일을 추가 한 다음 병합 해결 프로세스가 해당 새 파일을 변경 한 경우 명시 적으로 git add해야합니다.
Ibrahim

저장소에 대한 모든 정크 파일을 추적하지 않으려면이 작업을 수행하지 마십시오.
Jed Lynch

git add ...경로가 긴 파일 힙을 변경 한 후 입력하는 것이 정말 짜증납니다. 거기에 git add --all-the-files-i-changed전에 실행할 수 있습니다 내가 git rebase continue?
jozxyqk

3
명령 자식이 --skip 리베이스 사용할 때 작업 (편집 파일)가 손실 될 수 있습니다주의하십시오
Youness Marhrani


8

준비되지 않은 파일이있을 때이 경고를 받았습니다. 준비되지 않은 파일이 없는지 확인하십시오. 준비되지 않은 파일을 변경하지 않으려면 다음을 사용하여 변경 사항을 취소하십시오.

git rm <filename>  

2
아주 간단합니다. 주석이 될 수 있습니다. 도움이 되었으니 답이되어야합니다. 감사!
Lucas Lima

4

명령 줄에서 다음을 실행 해보십시오.

$ git mergetool

충돌을 해결할 수있는 대화 형 편집기를 불러 와야합니다. 수동으로 시도하는 것보다 쉽고 git은 병합을 수행 할 때 인식합니다. 또한 수동으로 시도 할 때 발생할 수있는 실수로 완전히 병합하지 않는 상황을 피할 수 있습니다.


더 쉬울 수 있으며 앞으로 이와 같은 상황을 피할 수 있다고 생각했습니다.
Batkins 2011

1
당신은 내 저녁을 구했습니다. 간단한 도구이지만이 도구 없이는 충돌을 해결하는 방법을 알 수 없습니다.
eonil

4

충돌을 수정 한 후 변경된 파일이 준비된 파일에 추가되었는지 확인합니다. 이것은 나를 위해 문제를 해결했습니다.


이것은 나를 위해 트릭을했습니다. OP에 설명 된 메시지를받은 후 Sourcetree를 확인한 후 즉시 명령 창에 언급 된 두 파일이 준비되지 않은 것으로 확인되었습니다. 파일을 준비하고 "git rebase --continue"를 실행하고 다시 정상으로 돌아 왔습니다.
Mass Dot Net

3

AssetsLoader.java에서 병합 충돌을 놓쳤습니다. 그것을 열고 충돌 마커 ( ">>>>", "====", "<<<<<")를 찾은 다음 git add를 다시 수행하십시오. 찾는 데 어려움이 있다면 'git diff --staged'를 수행하십시오.


3
추적 된 모든 파일에 대해 grep을 수행했으며 충돌 마커가 없었습니다.
Lucas

합니까는 git diff --staged유용한 아무것도 공개? 이것은 rebase의이 시점에서 병합 충돌을 해결하기 위해 커밋하려는 변경 사항을 나타냅니다. 파일 중 하나에 "죄송합니다.이 문제를 해결하기 위해 의도 한 것이 아닙니다."라는 비트가 있어야합니다.
Ether

4
Git은 계속 진행하려고 할 때 병합 충돌 마커를 찾지 않습니다. 인덱스가 깨끗한 상태인지 확인하기 만하면됩니다. 여전히 충돌 마커가있는 파일을 준비한 경우 해당 파일과 함께 커밋 할 것임을 나타냅니다. 아마도 항상 실수 일 것입니다.
Cascabel 2011

@Ether 이것은 전혀 이유가 아닙니다. git add충돌 마커 가 있는 파일도 가능합니다. 결국 그러한 파일은 완벽하게 합법적 일 수 있습니다!
fge

@Jefromi : 아, 아, 반갑습니다! 나는 항상 마커가 확인되었다고 생각했으며 의도적이라면 강제로지나 쳐야 할 것입니다.
Ether

3

나는 방금이 문제가 있었고 몇 가지 원인이 있다고 생각하지만 여기에 내 것이 있습니다 ...

특정 조건에서 커밋을 거부하는 git pre-commit 후크가 있습니다. 이것은 후크의 출력을 표시하기 때문에 수동으로 커밋 할 때 괜찮습니다. 나는 그것을 고치거나 commit --no-verify를 사용하여 무시하도록 선택할 수 있습니다.

문제는 rebase 할 때 rebase --continue가 후크를 호출한다는 것입니다 (최신 변경 사항을 커밋하기 위해). 그러나 rebase는 후크 출력을 표시하지 않고 실패한 것을 확인한 다음 '모든 병합 충돌을 편집 한 다음 git add를 사용하여 해결 된 것으로 표시해야합니다'라는 덜 구체적인 오류를 내 보냅니다.

이를 수정하려면 모든 변경 사항을 준비하고 'git rebase --continue'대신 'git commit'을 시도하십시오. 동일한 후크 문제가 발생하는 경우 실패 이유를 확인해야합니다.

흥미롭게도 git rebase는 git hook의 출력을 표시하지 않지만 후크를 우회하기 위해 --no-verify를 허용합니다.


1
비슷한 문제가있었습니다. 여기에서 다른 것은 나를 위해 일하지 않았지만 'git commit'을 한 다음 중단하면 불일치가 무엇이든 마술처럼 해결되는 것처럼 보였고 성공적으로 'git rebase --continue'할 수있었습니다.
patrickvacek 2012-08-06

기록을 위해 최근 비슷한 문제로 어려움을 겪고 있으므로 옵션을 git rebase수락 --no-verify합니다. 그러나 pre-rebase후크 만 생략 하지만이 옵션은 다음에 대한 후속 호출에 적용되지 않습니다 git commit.
pkrysiak

유효한 포인트 (변경 사항 커밋)를 포함하지만 좋은 답변을하기에는 너무 장황합니다.
Jack Miller

2

변경 사항을 수정하면 'git add -A'실행하는 것을 잊을 수 있습니다.

git add -A
git rebase --continue

1

나는 방금 문제를 우연히 발견했습니다. 내가 유지하고 싶은 수정 사항을 명확하게 보여 주지 git rebase --skip 않기 때문 git status입니다. 예상치 못한 추가 파일이 있었지만. 나는 결심했다

git checkout .

태그가 지정되지 않은 수정 사항을 제거한 다음 git rebase --continue성공했습니다.

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