본문 바로가기
공부/Git & GitHub

[Git&GitHub] 서로 다른 브랜치 병합하는 방법 (충돌 해결)

by 웅대 2023. 3. 16.
728x90
반응형

두 명이서 협업을 하는데 한 명은 A 기능, 다른 한 명은 B 기능을 개발한다고 하자.

 

그런데 충돌을 피하기 위해 A 기능이 다 개발되고 커밋된 내용을 받아서 B 기능 개발을 시작한다면 협업의 의미가 없을 것이다.

 

그래서 브랜치를 사용한다.

 

현재 둘은 main 브랜치에 존재하고 같은 코드를 가지고 있다.

 

이 상황에서 협업을 시작할 때 A 기능을 개발하는 브랜치와 B 기능을 개발하는 브랜치로 나누는 것이다.

 

이 각각의 브랜치는 서로 독립적이고 같은 뿌리로부터 분리되었다.

 

그림으로 나타내면 아래와 같다.

 

 

이후 각각의 기능이 개발이 되고나면 다시 main 브랜치로 합치는 과정을 브랜치 병합이라고 한다.

 

만약 두 개발자가 서로 수정한 코드가 하나도 겹치지 않는다면 깔끔하게 병합이 가능할 것이다.

 

그러나 실제로는 두 개발자가 같은 파일을 수정하는 경우도 존재할 것이다.

 

이러한 경우 병합할 경우 충돌이 발생하게 되는데 이를 해결하는 과정을 포스팅해보려 한다.

 

깔끔하게 볼 수 있도록 소스트리를 사용할 예정이다.

 

혹시 커밋, 푸쉬, 레포지토리 생성과 같은 기능을 모른다면 아래 포스팅을 참고하면 좋을 것 같다.

https://growth-coder.tistory.com/129

 

위 포스팅을 참고해서 우선 깃허브에 레포지토리를 생성한다.

 

그 다음 branch practice라는 폴더 안에 main.txt 파일을 만들었다.

우선 깃허브 레포지토리와 연결하여 커밋을 해야한다.

 

소스트리의 create를 눌러서 위에서 만든 폴더를 검색하 로컬 저장소를 생성한다.

그 다음 main.txt 파일을 staging area에 올린다.

커밋 메시지를 작성하고 커밋을 한다.

이제 원격 저장소와 연결할 차례이다. 우측 상단에 있는 원격 버튼을 클릭한다.

 

추가를 누른다.

 

이름과 레포지토리 주소를 입력하고 확인을 누른다.

 

좌측 상단의 push를 누른다.

 

잘 푸쉬되었는지 확인한다.

 

뻗어나가는 그래프 모양을 확인하기 쉽게 2개의 커밋을 더 추가하였다.

가장 최신 커밋에 위치해있는 상황이고 이 상황에서 두 개발자가 서로 다른 기능인 A와 B 기능 개발을 각각 실시한다.

 

우선 브랜치를 나눈다. 소스트리의 상단을 보면 브랜치 버튼이 있다.

 

브랜치 버튼을 누르고 새 브랜치 이름을 정해서 A 브랜치, B 브랜치 두 개를 생성한다.

참고로 두 브랜치 모두 main 브랜치에서 생성해야 하므로 브랜치를 생성하는 위치가 main 브랜치인 것을 반드시 확인한다.

 

좌측 브랜치에서 동그라미가 있는 곳이 현재 위치한 브랜치이다.

 

원하는 브랜치를 더블 클릭하면 해당 브랜치로 이동할 수 있다.

 

이제 main, A-branch, B-branch 모두 같은 곳을 가리키고 있다.

A-branch로 이동해서 A.txt 파일을 생성하고 main.txt의 내용 "A가 변경함"으로 바꾼다.

커밋을 하고 B-branch 로 이동해서 B.txt 파일을 생성하고 main.txt의 내용을 "B가 변경함"으로 바꾼다.

 

그래프를 보면 가지가 뻗어나가듯 두 가지 분기점이 생긴 것을 볼 수 있다.

이제 서로 개발이 끝나면 이 두 브랜치를 main으로 합쳐야 한다.

 

우선 A를 main 브랜치에 병합하기 위해 우선 main 브랜치로 이동한다.

 

누가 누구에게 병합될 것인지를 자세히 보고 이동한다.

 

main 브랜치가 살아남아야하므로 main 브랜치로 이동한다.

 

이동 후 A 브랜치를 우클릭하여 병합을 선택한다.

병합에 성공했다. main 브랜치와 A-branch가 같은 곳을 가리키고 있다.

이렇게 충돌이 발생하지 않는 병합을 fast-forward라고 한다.

 

이제 B-branch를 main 브랜치로 병합해야하는데 둘은 서로 다른 분기에 존재하고 내용이 다른 파일이 존재하기 때문에 충돌이 발생한다.

 

main 브랜치에 위치한 것을 확인하고 B-branch를 병합하면 충돌이 발생했다는 알림이 뜬다.

닫기를 누르면 어느 파일에서 충돌이 발생했는지 알려준다. main.txt의 내용이 서로 다른 것을 확인했다.

여러 옵션들 중 하나를 선택하라고 한다.

 

B-branch의 내용을 선택하고싶다면 수신 변경 사항 수락을 누른다.

 

이렇게 충돌을 해결했다면 아래처럼 커밋하지 않은 변경사항을 볼 수 있고 충돌이 발생했던 main.txt 파일이 아직 staging area에 올라가지 않은 모습을 확인할 수 있다.

main.txt 파일을 수정하여 충돌을 해결했으므로 다시 staging area에 올리고 커밋한다면 제대로 동작할 것이다.

 

병합에 성공했다 A-branch와 B-branch가 합쳐지고 다시 main 브랜치만 남은 모습을 확인할 수 있다.

728x90
반응형

댓글