[Git - 지옥에서 온 git] 4일차 - git의 원리 공부 (merge/conflit/3-way merge)

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 을 붙어 파일을 가리키게 됨

원래는 {object_id} 0 {파일명}

 

  • 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 명령어에 대한 이해가 쉬워지는 것 같다.

오늘도 한발자국 성장함 야호! 😎