SourceTree를 활용한 브랜치 합치기(merge)

2020. 10. 22. 01:09 형상관리/Git

앞에서 배운 branch를 통해 하나의 프로젝트에 두 가지의 다른 작업을 동시에 진행하며 Git에서 버전관리를 받는 것을 배웠다. 이번에는 앞서 예를 들었던 두 가지의 작업이 시간이 지나 모두 완성되었다고 한다. 그렇다면 이 두 개의 작업을 하나의 버전으로 만들어 서비스를 제공해야 할 것이다. 이 때 진행되던 이 두개의 작업를 하나로 합치는 것을 merge라고 한다.



<master branch의 상태>




<실험 branch의 상태>


STEP01.

합칠 branch를 checkout 한다. (다른 branch를 가져와서 원본으로 만들 branch)

※ checkout : branch를 선택하는 것. checkout 하는 branch에 따라 소스코드가 바뀐다.


STEP02.

가져올 branch를 마우스 오른쪽 클릭을 하고 "Merge 실험 into current branch"를 누른다.


STEP03.

Confirm Merge 팝업이 뜨면 "OK"를 누른다.



STEP04.

두 개의 branch를 합치는 commit이 자동으로 실행되어 하나의 버전이 생성되었다. 또한 merge를 통해 가져온 branch는 해당 branch를 마우스 오른쪽 클릭을 하고 delete "branch 명"을 이용하여 삭제 가능하다.


<merge를 통해 두 개의 branch가 자동으로 합쳐진 소스 코드 결과>


※ Merge 과정에서의 충돌(Conflict) 문제

만약 master branch와 실험 branch의 코드를 수정하여 아래와 같은 상태에 있다고 하자.

<master branch의 상태>


<실험 branch의 상태>


여기서 master branch에 실험 branch를 merge할 경우 아래와 같이 "Merge Conflicts" 메세지가 발생하게 되고 merge의 결과가 master branch의 버전 목록에 "Uncommitted changes"로 아직 commit 되지 않은 상태로 존재하게 된다.

<Merge Conflicts 메세지>


<master branch의 버전목록>


이러한 메세지의 발생 원인은 두 개의 branch의 소스코드들을 각각 수정할 때, 동일한 위치의 코드를 추가하거나 수정하였기 때문에 Git을 통한 merge 과정에서 충돌을 일으키기 때문이다. 위의 소스의 경우 두 개의 branch가 동일한 위치에 있는 4번째 줄의 System.out.println()의 내용을 수정하였기 때문에merge 과정에서 어떤 코드를 삽입해야 하는지 처리하지 못해 충돌이 발생하였다.


충돌이 발생한 후 master branch의 소스코드는 아래와 같이 두개의 branch 내용을 모두 포함하면서 사용자에게 코드의 수정을 요구한다.

<Merge  Conflict가 발생한 소스코드>


이러한 충돌의 해결 방법은


STEP01.

위와 같이 merge의 결과로 나온 소스코드를 사용자의 필요에 맞게 수정한 다음 (위의 코드는 두 개의 System.out.println() 내용이 필요하다는 가정하에 아래와 같이 수정하였다.)

<수정한 소스코드>


STEP02.

SourceTree에서 working copy의 conflict 항목에 마우스 오른쪽 클릭을 하고 아래 그림과 같이 Mark Resolved를 누른다. Mark Resolved는 confilct를 해결 했다는 것을 Git에게 알려주는 것으로 Mark Resolved를 해주지 않을 경우 위 상태에서 commit이 되지 않는다.


※ Mark Resolved 이외의 옵션

- Mark Unresolved : Mark Resolved한 것을 다시 이전의 상태로 되돌린다.

- Resovle Using 'Mine' : 자동으로 가져오는 branch의 내용을 삭제하고 현재 checkout한 branch의 내용을 merge에  사용한다.

- Resovle Using 'Theirs' : 자동으로 현재 checkout한 branch의 내용을 삭제하고 가져오는 branch의 내용을 merge에 사용한다.




STEP03.

그 결과 아래와 같이 느낌표 모양의 conflict 표시가 사라지고 index영역에 새로운 내용이 올라온다.


STEP04.

마지막으로 이 부분을 commit을 해주게 되면 자동으로 commit Message가 생성이되고 이것을 commit 해주면 conflict가 발생한 merge가  마무리 된다.

<자동 생성된 commit Message>


<conflict를 해결한 master branch>



출처: https://gangju.tistory.com/23?category=529701 [gangju 개인 블로그]