2024. 6. 30. 18:58ㆍ오픈소스SW
git branch --merged 명령어를 사용하면 현재 브랜치에 병합된 브랜치들의 목록을 보여준다. main,show_board,mark_board브랜치가 병합되었으며 현재 HEAD Pointer는 mark_board를 가리키고 있다.
git checkout -b check_win 명령어를 사용하여 check_win 브랜치를 생성함과 동시에 현재 작업 브랜치로 설정한다.
python 코드에 check_win 기능을 추가한 후 코드를 실행시키면 check_win동작이 실행하는 것을 확인할 수 있다.
check_win 커밋메시지로 커밋한 후 커밋 히스토리를 시각화하면 c3와 동일한 방식으로 나타난다.
위의 그림에서 C5는 switch player 기능을 추가하기 위한 기능이고 mark_board 브랜치와 연결되어 있으므로 checkout mark_board명령어를 통해 mark_board 브랜치로 돌아가준다. 커밋 히스토리를 보면 HEAD는 최근의 check_win이 아닌 mark_board를 가리키고 있는 것을 확인할 수 있다. 그 다음 python코드에 switch_player기능을 추가시킨 후에 코드를 실행시켜보면 O와X가 교차하며 게임이 진행되는 점을 확인할 수 있다.
여기서 주의할 점은 check_win 브랜치와 mark_board브랜치가 병합되지 않았기 때문에 O플레이어가 빙고를 완성해도 player - won!이라는 문구는 뜨지 않을 것이다.
git branch --merged라는 명령어를 통해 병합된 브랜치를 확인해본 결과 check_win은 mark_board와 병합되지 않았다. 그러므로 check_win기능은 두 브랜치를 병합한 후에 적용될 것이다.
mark_board의 새로운 기능인 switch_player 기능을 커밋메시지와 함께 커밋한 후 커밋 히스토리를 확인해보면 check_win옆에 빨간 줄이 그어져 있는 것을 확인할 수 있다.
이는 Divergent history(분기된 히스토리)이며, 두 개 이상의 브랜치에서 동시에 발생한 다른 방향으로의 커밋 히스토리이다.
위의 그림과 같이 C5와 C4가 시간적 순서대로 연결되지 않고 동시에 C3를 가리키고 있다. 이를 Divergent history라고 한다. 즉 c2b9e는 C5이고 , 87ab2가 C4와 같다.
다시 mark_board로 돌아가기 위해 checkout f14f를 해준다. f14f는 c3 주소의 앞에 4자리이다.
그 다음 check_draw 브랜치를 생성한 후에 check_draw기능을 python파일에 만든 후 코드를 실행하면 draw기능이 실행되는 점을 확인할 수 있다.
그 다음에 draw_check 커밋 메시지로 커밋한 후 히스토리를 보면 C4,C5,C6가 Divergent histroy임을 알 수 있다.
main으로 돌아와서 병합되지 않은 브랜치들을 확인한 결과 check_draw , check_win, mark_board, show_board가 병합되지 않았음을 확인할 수 있다.
git merge show_board 명령어를 통해 show_board 브랜치를 main브랜치에 병합시킨다.
그 다음 mark_board로 돌아가서 mark_board 기준으로 병합되지 않은 브랜치들은 check_draw , check_win 이 있다.
check_win을 병합하려니까 이런 에러 메시지가 나온다.
에러 메시지를 보면 git commit 명령어를 사용하여 병합을 완료하라고 나와있다.
그래서 merge 커밋 메시지로 커밋을 하면 C4가 병합된다.
내가 생각할 때 mark_board와 check_win사이에 병합시켜줄 브랜치가 하나 필요했던 것 같다.
위와 동일한 방식으로 C6를 병합해준다.
병합을 끝낸 후 python 코드를 보면 병합충돌이 일어났다는 표시의 <<<<< ===== >>>>> 표시를 확인할 수 있다. 이는 병합 전의 check_win과 check_draw의 위치가 동일하므로 충돌이 일어난 것인데, 순서를 조정시켜주면 된다. 그 다음 표시를 지워준다.
여기까지 C1과 C2를 병합하였고, C3~C6를 병합하였다. 마지막으로 이제 C3와 C1을 병합하면 모든 브랜치들이 병합된다.
모든 커밋들이 병합되었음을 확인할 수 있다.
깃에는 두 가지 병합 방법이 있다.
(1) Fast_Forward Merge
- 두 브랜치가 앞뒤로 직접적으로 연결되어 있는 경우에 발생한다. 다시말해, 기준 브랜치가 병합할 브랜치의 직전 커밋의 상위 버전일 때 발생한다.
(2) Three Way Merge
- 세 개의 버전(기준 브랜치, 병합할 브랜치, 공통 조상)을 기반으로 병합한다. Git은 이 세 개의 버전을 비교하여 변경사항을 결합하고 충돌을 해결한다.
여기서 Fast Forward Merge는 C1 , C2 , C3가 병합될 때 사용되었던 방식이고, Three Way Merge는 C5, C4, C6가 병합될 때 사용되었던 방식이다.
'오픈소스SW' 카테고리의 다른 글
Git-Remote(2) (0) | 2024.07.01 |
---|---|
Git-Remote(1) (0) | 2024.07.01 |
Git-Branching(2) (0) | 2024.06.30 |
Git-Branching (1) (0) | 2024.06.30 |
Git Basics(2) (0) | 2024.06.26 |