2022. 8. 9. 23:30ㆍ개발공부 기강잡자/Git
confilt 발생 시, git 내부에서의 처리
merge 명령어를 실행했을 때, confilt (충돌)이 발생한 경우!
= master와 exp branch가 공통의 commit에서 수정했고, 공통된 부분을 수정한 경우
☞ confilt 이 발생하게 됨
자동 병합에 실패했기 때문에 (Automatic merge failed), 사용자가 확인하여 충돌된 부분을 수정하고 commit 해야한다.
.git 내부 파일 변화
1. MERGE_HEAD
: merge를 하려는 commit의 object_id가 기록되어있음
2. index 파일
: 충돌된 파일명 앞에 각각 1, 2, 3 을 붙어 파일을 가리키게 됨
- 1이 붙은 파일 : 공통의 f1.txt 내용
- 2가 붙은 파일 : merge를 명령한, 현재 checkout 되어있는 branch의 f1.txt 내용
- 3이 붙은 파일 : 현재 branch에서 merge하려는 branch의 f1.txt 내용
→ 3 가지의 내용으로 git은 자동 merge를 시도함
3 way Merge
: git의 Merging 기법, 자동으로 파일을 병합함
Branch 1 | Base | Branch 2 |
A | A | |
B | B | B |
1 | C | 2 |
D | D |
위의 표와 같이 base의 내용을 기반으로 branch 1과 branch 2가 A/B/C/D의 내용을 수정했다고 할 때,
2 way merge
- Branch 1과 2를 비교하여 공통인 부분은 그대로 유지
- Branch 1과 2를 비교하여 다른 부분은 사용자에게 어떤 부분을 수정해야할지 Conflit를 발생시킴
3 way merge
- branch 1과 base는 같고 branch 2 만 다른 경우 = 수정된 부분(branch2)을 채택
- branch 2과 base는 같고 branch 1 만 다른 경우 = 수정된 부분(branch1)을 채택
- 셋 다 같은 경우는 그대로 유지
- 셋 다 다른 경우 confilt 발생시킴 > 3-way는 셋 다 다른 경우에만 confilt 발생시킨다.
차이점
2 way - base를 보지않고 branch 1과 branch 2의 내용만 보고 merge
3 way - base를 참고하여 branch 1과 branch 2의 내용을 merge
따라서, 각 merge 방식에 따른 merge 결과는 아래와 같다.
Branch 1 | Base | Branch 2 | 2-way | 3-way |
A | A | Conflit | ||
B | B | B | B | B |
1 | C | 2 | Conflit | Conflit |
D | D | Conflit |
➕
Merge를 위한 Tool 사용하여 confilt 부분 해결 가능
Ex) kdiff3 도구
공통의 내용 = base
checkout 되어있는 branch의 수정사항 = local
merging을 당하는 branch의 수정사항 = remote
git을 공부하다가 merge 방식까지 공부하게 되다니..!
하지만 이 부분을 공부하지 않았다면, 협업할 때 자주 발생할 수 있는 confilt 상황에서 많이 당황하고 적절하지 못한 대응을 할 수도 있을 것 같다. 확실히 원리를 공부하고 나니 git 명령어에 대한 이해가 쉬워지는 것 같다.
오늘도 한발자국 성장함 야호! 😎
'개발공부 기강잡자 > Git' 카테고리의 다른 글
[Git] branch 이름 변경하기 (0) | 2023.03.21 |
---|---|
[Git - 지옥에서 온 git] 5일차 - 원격 저장소 remote repository (0) | 2022.08.11 |
[Git - 지옥에서 온 git] 4일차 - git의 원리 공부 (reset/checkout) (0) | 2022.08.09 |
[Git - 지옥에서 온 git] 4일차 - git의 원리 공부 (branch와 HEAD) (0) | 2022.08.09 |
[Git - 지옥에서 온 git] 3일차 - branch 수련 (git-scm의 Documentation 보기) (0) | 2022.08.04 |