3-way merge에서의 conflict를 해소할 수 있는 4가지 방법
안녕하세요, geek님.
영상 16:55~ 부분에서 설명해주시는 conflict를 해결할 수 있는 방법에 대해서 다음 네 가지를 설명해주셨습니다.
main 브랜치 쪽 diff를 더한다.
test 브랜치 쪽 diff를 더한다. (선택됨)
둘 다 더한다.
둘 다 더하지 않고, 아예 다른 내용을 적는다.
그리고 예제에서는 2번 방식을 선택해주셨고, 이에 따라서 머지 커밋은 다음과 같이 계산됩니다.
base(red) + main 최신 커밋과의 diff(green) + test 최신 커밋과의 diff(blue)
즉, 3개가 더해져서 만들어지는 커밋인데요. 이로 인해 3-way merge라는 이름으로 불린다고 이해했습니다.
여기서 질문이 생기는데요.
만약 1번 방식을 선택한다면, 머지 커밋이 다음과 같이 계산됩니다.
base(red) + main 최신 커밋과의 diff(green)
즉, 2개가 더해져서 커밋이 만들어집니다.
그런데 앞서 말씀하신 내용을 고려하면 머지의 세부 명칭(예를 들어 3-way merge같은)에 영향을 주는 요소는 '커밋 히스토리의 모양'입니다.
따라서 2개가 더해져서 커밋이 만들어지는 이 상황도 여전히 3-way merge라고 부를 수 있습니다.
그래서 처음 들었던 의문은 "1번 방식을 택했을 때는 2개가 더해지는 건데, 이때도 3-way라고 부르는 것은 그냥 관례적인 표현인가?" 입니다.
그리고 질문을 작성하면서 제가 스스로 내린 답변은 "더하는 개수가 3개여야 하는 것이 아니고, 더할지 말지 고민하는 기준점이 3개인 상황이라 3-way라는 이름이 붙은 것 같다" 입니다.
즉, 커밋 히스토리가 예제와 같은 상황에서는 다음 3가지를 기준점으로 사용하게 됩니다.
두 브랜치의 공통 부모 (base)
main 브랜치의 최종 커밋
test 브랜치의 최종 커밋
각 기준점에 대해 어떤 판단을 내리느냐에 따라 세 개를 더하는 2번 상황이 되거나 두 개를 더하는 1번 상황이 되거나, 또 다른 3번, 4번 상황이 될 수도 있습니다.
하지만 '기준점이 3개'라는 사실을 모든 상황에서 동일하기 때문에 3-way merge라는 이름이 붙여진 것으로 판단했습니다.
가르쳐주신 내용에 혼란을 느낀 부분을 서술하느라 글이 좀 길어졌는데, 결론적으로 '기준점이 3개라서 3-way merge라고 부른다'는 제 판단이 적절한지 여쭤보고 싶습니다.
回答 2
0
안녕하세요, dev.rudevico 님 😀
네, 적절합니다. 제가 강의에서 설명한 내용은 판단해주신대로 입니다.
강의를 만들면서 dev님과 비슷한 고민을 많이했던 터라, 저와 이야기가 잘 통할 것 같은 기분이 드네요 ㅎㅎ
0
안녕하세요, 인프런 AI 인턴입니다. dev.rudevico님, 3-way merge의 개념에 대해 깊은 고민을 하셨군요.
3-way merge란?
3-way merge는 Git에서 병합할 때 사용하는 일반적인 기법으로, 다음 세 가지 기준점을 기반으로 병합이 이루어집니다:
- 공통 조상 커밋(base): 두 브랜치가 분기되기 이전의 마지막 공통 커밋입니다.
- 현재 브랜치의 최신 커밋: 예를 들어,
main브랜치의 최신 커밋.
- 머지하고자 하는 브랜치의 최신 커밋: 예를 들어,
test브랜치의 최신 커밋.
3-way merge는 이 세 가지 기준점을 사용하여, 충돌이 발생하지 않는 한 병합 커밋을 만들어 냅니다. 충돌이 발생했을 경우에는 사용자가 4가지 방법 중 하나를 선택하여 수동으로 해결할 수 있습니다: main의 변경을 취하거나, test의 변경을 취하거나, 두 변경을 모두 반영하거나, 완전히 새로운 내용을 작성하는 것입니다.
‘기준점이 3개라서 3-way merge라고 부른다’는 판단
네, dev.rudevico님의 판단이 맞습니다. ‘3-way’라는 명칭은 사용되는 커밋 기준점이 세 가지로 나뉘기 때문에 붙여진 이름입니다. 즉, 실제로 병합 중 두 개 이상의 변경이 적용되지 않더라도, 기본적으로 세 개의 기준점을 고려하여 병합을 수행하기 때문에 3-way merge라고 부릅니다.
기준점이 세 개로 구성되기 때문에 기본적으로 3-way merge라 칭하며, 더하는 개수는 상황에 따라 변동될 수 있습니다.
질문에 대한 보다 깊이 있는 이해와 설명을 원하신다면, 다음 링크를 참고해 도움을 받으실 수 있습니다:
- Git 병합의 기본 개념
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
깃 풀(git pull)에 대한 궁금증이 있습니다!
0
14
1
섹션7 수업자료 업로드 부탁드립니다.
0
22
2
gitforwindows에서 맥은 뭘 다운받아야 하나요...?
0
31
2
d-day count소스및 그라비티에서 기술하면 뭔가 내용이 안나오네요
0
21
1
간단한 사이드 프로젝트 작성에도 Max 요금제를 결제하는게 좋을까요?
0
57
2
git 커밋한 내용 궁금합니다.
0
27
1
충돌의 최소화 파트 질문입니당!
0
28
1
자바스크립트 파일 중, DOM 영역에서 querySelector가 아닌 다른 함수를 쓰는데 괜찮을까요?
1
81
2
48강에 필요한 아스키아트 자료가 첨부되어 있지 않습니다.
0
54
2
mac python 3.10 - permission denied
0
54
1
26강 [게임 메인 루프 및 메뉴 구현]에서 2가지 오류가 있어서 남기게 되었습니다.
0
69
2
Rider에서 .ignore 플러그인으로 .gitignore 파일 내용 생성시 Csharp으로 검색되는 내용이 없습니다.
1
67
2
EC2 설정보다 RDS를 먼저 설정하는 이유
0
102
1
pull할때
0
41
1
강의 마지막에 언급하는 '다음 강의'란?
0
85
1
궁금해요
0
85
3
git checkout 되돌리기
0
214
2
파일별 git checkout
0
71
1
git branch 결과
0
90
2
8강 git status 관련 질문
0
74
2
머지 2번째 강의 pdf가 자료에 빠져있는 것 같습니다.
0
69
1
geek 강사님!
1
77
1
git diff는 언제 사용하나요?
0
179
2
staging area 질문있습니다.
0
138
2

