code

자식 리베이스 병합 충돌

codestyles 2020. 11. 27. 08:07
반응형

자식 리베이스 병합 충돌


나는 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".

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


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

git mergetool

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

git rebase --continue

행운을 빕니다


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

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

  • git rebase --skip커밋을 완전히 건너 뛰기 위해 실행할 수 있습니다 . 즉, 문제가있는 커밋으로 인한 변경 사항이 포함되지 않습니다. 이 옵션을 선택하는 것은 매우 드뭅니다.

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

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


참고 : 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 사용자.
이를 위해 이러한 메시지에 사용 된 용어를이 사용자 세그먼트가 이해할 수 있도록하고 문제를 해결하도록 안내하는 것이 도움이됩니다.

In particular, failure to apply a patch during a git rebase is a common problem that can be very destabilizing for the inexperienced user.
It is important to lead them toward the resolution of the conflict (which is a 3-steps process, thus complex) and reassure them that they can escape a situation they can't handle with "--abort".
This commit answer those two points by detailing the resolution process and by avoiding cryptic git linguo.


If you have a lot of commits to rebase, and some part of them are giving conflicts, that really hurts. But I can suggest a less-known approach how to "squash all the conflicts".

First, checkout temp branch and start standard merge

git checkout -b temp
git merge origin/master

You will have to resolve conflicts, but only once and only real ones. Then stage all files and finish merge.

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

Then return to your branch (let it be alpha) and start rebase, but with automatical resolving any conflicts.

git checkout alpha
git rebase origin/master -X theirs

Branch has been rebased, but project is probably in invalid state. That's OK, we have one final step. We just need to restore project state, so it will be exact as on branch 'temp'. Technically we just need to copy its tree (folder state) via low-level command git commit-tree. Plus merging into current branch just created commit.

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

And delete temporary branch

git branch -D temp

That's all. We did a rebase via hidden merge.

Also I wrote a script, so that can be done in a dialog manner, you can find it here.

참고URL : https://stackoverflow.com/questions/11709885/git-rebase-merge-conflict

반응형