인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

인프린님의 프로필 이미지

작성한 질문수

Git & GitHub, 원리부터 차근차근 - 근본깃 [완성편]

리베이스할 때 conflict 해결하기 #conflict #rebase ★

rebase conflict 질문

해결된 질문

작성

·

76

0

rebase conflict 질문드립니다.

강의에서는 rebase시에 test branch에서 main branch로 범위가 수정되면서 main branch의 최신 commit을 가리키고 있다가 베이스로부터 기존 test branch에 있다가 떨어져 나온 커밋들의 변경분에 대해 하나씩 tracked area와 staging area에 반영이 되고 여기서 같은 위치에 수정이 일어났으니 conflict가 난다고 말씀주셨는데 이게 기존 3-way-merge 와는 좀 다른 거 같아서요.

 

기존 3-way-merge에서는 base 커밋에 따른 diff를 찾다 보니 두 브랜치의 같은 위치에 동시에 수정이 일어났을 경우에는 git이 어떤 걸 최종적으로 반영해야 할 지 몰라 conflict가 난다고 알고 있는데 여기서는 base 커밋에서의 diff를 확인하는게 아니기 때문에 노란색이 초록색으로 수정되었다고 생각해야 하는 거 아닌가요 ?

예를 들어 main branch가 하나만 있고 여기서 yellow를 green으로 수정해서 커밋하는게 가능하듯이 설명에서 보면 head가 가리키는 게 최신 커밋이고 여기서 변동분을 반영하는 거니까 동시에 같은 부분이 변경이 되어서 뭘 반영해야 할지 모르는 것과는 좀 다른 거 같아서요.

감사합니다.

답변 3

0

geek님의 프로필 이미지
geek
지식공유자

안녕하세요, 인프린님:)

궁금하신 부분은 해결되었나요?
추가로 궁금하신 부분이 있다면, 언제든 질문주세요!

0

geek님의 프로필 이미지
geek
지식공유자

안녕하세요, 인프린님 😀
좋은 의견 감사드립니다.

2:12 부근을 보시면,
green을 워킹디렉토리와 스테이징 에어리어에 더하는 부분을 확인하실 수 있어요.
이 부분을 조금만 더 자세히 살펴볼게요!

여기서 green을 더하라는 diff는..
아무 것도 색칠되어 있지 않은 rectangle의 두 번째 칸에 green을 칠하라는 내용입니다.
근데 지금은 이미 yellow가 칠해져 있는 상황이에요! 😅

그러니까,
아무 것도 칠해져 있지 않은 곳에 green을 칠하려고 하는데,
이미 yellow가 그려져 있다는 내용입니다.

그래서 conflict가 발생했던거에요.

궁금하신 부분이 해결되었나요?
언제든 편하게 질문주세요 😀

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 인프린님, rebase와 병합(merge) 과정에서 발생하는 충돌 처리에 대한 질문을 주셨군요.

Rebase와 Merge의 차이

rebase와 merge는 모두 Git에서 브랜치를 결합하는 방법이지만 처리 방식에서 차이가 있습니다.

  1. 3-Way Merge:

    • 두 브랜치와 공통 base 커밋 간의 차이를 찾아 충돌을 해결합니다.
    • 차이가 있는 경우, Git은 각 브랜치가 해당 위치에서 어떻게 변경되었는지를 확인하고, 둘 간의 충돌을 해결해야 합니다.
  2. Rebase:

    • 한 브랜치의 커밋들을 다른 브랜치의 가장 최신 커밋 뒤로 붙입니다.
    • 중간에 base 커밋이 변경되는 것이 아니라, 단순히 커밋을 이어 붙이는 것이기에 다르게 작동합니다.

충돌 발생 이유

  • Rebase에서 충돌은 연속적인 커밋을 적용하는 과정에서 발생합니다. main 브랜치 뒤로 test 브랜치의 커밋을 재배치할 때, 서로 다른 브랜치에서 동일한 파일의 동일한 부분이 수정된 경우입니다. 이 과정에서는 각 커밋이 순서대로 재적용되므로, 충돌 시에는 수동으로 해결해줘야 합니다.

  • 예를 들어 main 브랜치에서 파일이 yellow인 상태에서 test 브랜치에서 green으로 수정했을 때, rebase 시 순서에 따라 커밋이 하나씩 처리됩니다.

해결 방법

Rebase 중 발생하는 충돌은 수동으로 해결해야 합니다. 충돌을 해결한 후:
- git add <파일>로 충돌을 해결한 파일을 스테이징합니다.
- git rebase --continue명령어를 사용하여 rebase 과정을 이어 나갑니다.

유사한 개념에 대해 더 살펴보고 싶으시다면 다음 링크를 참고하세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.