SourceTree를 활용한 브랜치 합치기(merge)
앞에서 배운 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 개인 블로그]
'형상관리 > Git' 카테고리의 다른 글
SourceTree, GitHub를 활용한 로컬 저장소로 프로젝트 가져오기(clone) (0) | 2020.10.22 |
---|---|
SourceTree, GitHub를 활용한 원격 저장소에 프로젝트 동기화(push)(2) (0) | 2020.10.22 |
SourceTree, GitHub를 활용한 원격 저장소에 프로젝트 동기화(push)(1) (0) | 2020.10.22 |
SourceTree, GitHub를 활용한 원격 저장소 만들기 (0) | 2020.10.22 |
SourceTree를 활용한 브랜치 만들기(branch) (0) | 2020.10.22 |
SourceTree를 활용한 commit 후 수정사항 되돌리기(revert) (0) | 2020.10.22 |
SourceTree를 활용한 commit 후 수정사항 되돌리기(reset) (0) | 2020.10.22 |
SourceTree를 활용한 commit 전 수정사항 취소하기(discard) (0) | 2020.10.22 |