자식 리베이스 병합 충돌


91

나는 github repo를 포크하고 github repo에서 작업했습니다.
풀 요청을했고 완료되었습니다.

그 후 업스트림에 더 많은 커밋이 있었으므로 이제 리베이스하고 싶습니다. 그게 내가해야 할 일입니다.
하지만 다음과 같은 병합 충돌이 발생합니다.

First, rewinding head to replay your work on top of it...
Applying: Issue 135 homepage refresh
Using index info to reconstruct a base tree...
<stdin>:17: trailing whitespace.
      %h4 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Auto-merging app/views/home/index.html.haml
CONFLICT (content): Merge conflict in app/views/home/index.html.haml
Auto-merging app/views/home/_group_projects.html.haml
CONFLICT (content): Merge conflict in app/views/home/_group_projects.html.haml
Failed to merge in the changes.
Patch failed at 0001 Issue 135 homepage refresh

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

이 문제를 해결하는 방법을 모르겠습니다. 도와주세요.


이 게시물에 내 대답을 살펴 가지고 stackoverflow.com/questions/48307297/...
Abhishek

답변:


121

리베이스는 진짜 골칫거리가 될 수 있습니다. 병합 충돌을 해결하고 리베이스를 계속해야합니다. 예를 들어 병합 도구를 사용할 수 있습니다 (설정에 따라 다름).

git mergetool

그런 다음 변경 사항을 추가하고 계속하십시오.

git rebase --continue

행운을 빕니다


2
네 rebasing은 두통입니다. git pull upstream master를 사용할 수 있습니까?
pahnin 2012-07-29

2
예, 시도해 볼 수 있습니다. 차이점은 커밋이 업스트림의 커밋 위에 배치되지 않는다는 것입니다. 잠재적으로 병합 충돌이 적습니다.
iltempo

7
@iitempo 커밋 할 필요가 없습니다. git add만으로 rebase를 계속할 수 있습니다.
enigmaticPhysicist

45

리베이스 중에 충돌이 발생하면 세 가지 옵션이 있습니다.

  • git rebase --abort리베이스를 완전히 실행 취소하기 위해 실행할 수 있습니다 . Git은 git rebase가 호출되기 전과 마찬가지로 브랜치의 상태로 돌아갑니다.

  • git rebase --skip커밋을 완전히 건너 뛰기 위해 실행할 수 있습니다 . 이는 문제가있는 커밋에 의해 도입 된 변경 사항이 포함되지 않음을 의미합니다. 이 옵션을 선택하는 것은 매우 드뭅니다.

  • 일 템포가 말한대로 갈등을 해결할 수 있습니다. 완료되면로 전화해야합니다 git rebase --continue. 내 mergetool은 kdiff3이지만 충돌을 해결하는 데 사용할 수있는 것이 더 많습니다. https://git-scm.com/docs/git-mergetool을 호출 할 때 호출 할 수 있도록 git의 설정에서 병합 도구를 설정하기 만하면됩니다.git mergetool

위의 방법 중 어느 것도 효과가 없으면 산책을하고 다시 시도하십시오. :)


2
예,하지만 충돌을 해결하는 방법은 무엇입니까? 그것이 질문입니다. "갈등 해결"과 "완료되면"사이에
무엇입니까

@KansaiRobot 수동 수정을 수행하는 한 가지 옵션 : 텍스트 편집기에서 충돌하는 파일을 열고 찾기<<<<<
스핀 업

16

리베이스 할 커밋이 많고 그 중 일부가 갈등을 일으키고 있다면 정말 아픕니다. 그러나 "모든 갈등을 제거"하는 방법에 대해 잘 알려지지 않은 접근 방식을 제안 할 수 있습니다 .

먼저 임시 브랜치를 체크 아웃하고 표준 병합을 시작합니다.

git checkout -b temp
git merge origin/master

갈등을 해결해야하지만 단 한 번만 실제 문제를 해결해야합니다. 그런 다음 모든 파일을 준비하고 병합을 완료합니다.

git commit -m "Merge branch 'origin/master' into 'temp'"

그런 다음 브랜치로 돌아가서 ( 알파가되게 함 ) 리베이스를 시작하지만 충돌을 자동으로 해결합니다.

git checkout alpha
git rebase origin/master -X theirs

분기가 리베이스되었지만 프로젝트가 잘못된 상태 일 수 있습니다. 괜찮습니다. 마지막 단계가 있습니다. 프로젝트 상태를 복원하면되므로 분기 'temp'와 동일합니다. 기술적으로 우리는 저수준 명령 git commit-tree 를 통해 트리 (폴더 상태)를 복사하면 됩니다. 또한 현재 브랜치로 병합하여 방금 커밋을 생성했습니다.

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)

임시 브랜치 삭제

git branch -D temp

그게 다야. 숨겨진 병합을 통해 리베이스를 수행했습니다.

또한 스크립트를 작성 했으므로 대화 방식으로 수행 할 수 있습니다 . 여기에서 찾을 수 있습니다 .


13

참고 : Git 2.14.x / 2.15 (2017 년 3 분기)에서는 git rebase충돌시 메시지가 더 명확 해집니다.

William Duclot ( )의 commit 5fdacc1 (2017 년 7 월 16 일)을 참조하십시오 . (Merged by Junio ​​C Hamano -- in commit 076eeec , 11 Aug 2017)williamdclt
gitster

rebase: 경험이없는 사용자를 위해 해결 메시지를 더 명확하게

전에:

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort"

후:

Resolve all conflicts manually, 
mark them as resolved with git add/rm <conflicted_files>
then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".')

git UI는 그들이 돕는 사람들에게 오류 메시지를 처리함으로써 개선 될 수 있습니다 : 경험이없는 일반 git 사용자.
이를 위해 이러한 메시지에 사용 된 용어를이 사용자 세그먼트가 이해할 수 있도록하고 문제를 해결하도록 안내하는 것이 도움이됩니다.

특히, git rebase 중에 패치를 적용하지 못하는 것은 경험이없는 사용자에게 매우 불안정 할 수있는 일반적인 문제입니다.
갈등을 해결하는 방향으로 그들을 이끌고 (따라서 복잡한 3 단계 과정) " --abort"로 처리 할 수없는 상황에서 벗어날 수 있다는 확신을주는 것이 중요 합니다.
이 커밋은 해결 프로세스를 자세히 설명하고 비밀스러운 git linguo를 피함으로써이 두 가지 요점에 답합니다.


1
좋은! 도움말 페이지에는 변경 사항을 적용하여 충돌을 해결하라는 메시지가 표시되지만 아니요! 여기서 우리는 커밋을 건너 뛰고 대신 병합을 계속해야합니다! (도움말 페이지 : help.github.com/articles/… )
Jerther
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.