저번 시간에는 Merge와 충돌이 무엇인지, 그리고 어떤 상황에서 충돌이 발생하는지 배워 보았다.
그러면 이번에는 실제로 Merge 작업을 수행하면서 충돌을 발생시켜 보고, 해당 충돌을 어떤 식으로 해결하는지 소스트리를 이용하여 실습하여 보자.
소스트리를 이용하여 충돌 발생 시키기
우선 충돌을 유발하기 위하여 Branch를 나누어 주겠다.
나는 GitTest에서 ConflictTest라는 Branch 를 만들어 주었다.
그리고 해당 Branch에서 ReadMe.md 파일에 충돌 유발용 1이라는 텍스트를 추가하여 주었다.
이후 Commit과 Push를 진행하여 원격저장소로 수정사항을 올린다.
참고로 화면 하단에 ~에 바뀐 내용 즉시 푸시를 누르면 굳이 Push를 누르지 않아도 Commit과 동시에 Push를 진행하여 준다.
정상적으로 처리가 되었다면 master Branch로 돌아가서 다시한번 ReadMe.md 파일을 열어본다.
master에서는 아직 우리가 적은 충돌 유발용 1이라는 텍스트를 적기 전이므로 파일을 열어보면 빈 파일이 열리는 것을 확인 할 수 있다.
그러면 충돌을 발생시키기 위해 해당 파일에 충돌 유발!! 이라는 텍스트를 입력하고 다시한번 Commit 후 Push를 진행한다.
Branch를 헷갈리지 않도록 조심한다.
정상적으로 Commit이 생성되었다면 다음과 같이 히스토리가 나타날 것이다.
두 Commit에는 충돌을 발생 시킬 코드(같은 파일의 변동사항)가 남아있다.
그러면 이제 충돌을 발생시키기 위하여 master와 ConflictTest를 병합하여 준다.
병합은 master를 Base로 하며 ConflictTest의 Commit을 우클릭 하여 병합이라는 버튼을 클릭한다.
그러면 다음과 같은 메시지가 나타나게 된다.
실제 Merge를 하기 전에 병합 충돌을 감지하고 충돌 해결 작업을 진행하라고 소스트리가 요청하는 것이다.
실제로 히스토리를 보면 커밋하지 않은 변경사항이란 것이 나타나고 스테이지에 올라가지 않은 파일에 충돌이 된 코드가 보인다.
이전에 설명한 것처럼, Base(Head)와 병합하려는 ConflictTest Branch의 코드가 동시에 떠있는 것을 볼 수 있다.
실제 파일을 열어보면 실제 파일도 저렇게 변경되어 있는 것을 볼 수 있다.
그럼 병합을 해결하기 위해서는 어떻게 해야 하는가?
여기서부터는 Git이 무엇을 수정할 지 알수 없기 때문에 개발자가 직접 해당 코드를 수정하고 다시 Commit을 진행해 주어야 한다.
충돌 해결하기
말은 거창하지만 결국 충돌을 해결한다는 것은 개발자가 코드를 정리하여 다시 짠다는 말과 같다.
대신, 서로 다른 양쪽의 충돌된 코드를 나누어 보여주고 개발자가 선택할 수 있도록 하는것이 Git이 해주는 최대의 역할이라고 생각하면 된다.
그럼 지금부터 충돌을 해결해 보자.
간단한 경우라면 두 Branch중 실제로 사용할 부분만 남기고 다 지워도 되지만 만일 두 Branch의 기능이 섞여야 한다면 그때는 적절하게 개발자가 조정하여 코드를 다시 짜주어야한다.
예를 들어서 우리는 현재 "충돌유발!!" 이라는 텍스트와 "충돌 유발용 1"이라는 텍스트가 충돌하는 상황이니 이 둘을 적절히 섞어서 "충돌 유발용 1 - 충돌 유발 해결!!!"이라는 텍스트로 바꿔야 한다고 가정한다.
그럼 실제로 해당 텍스트를 바꾸어 보겠다.
지금이야 예시로 아주 간단한 텍스트지만 나중에 100줄이 넘는 코드끼리 충돌한다고 생각하면 이 자체로도 상당히 까다로운 작업이 된다.
변경을 완료하면 해당 내용을 다시 한번 Commit 해준다.
커밋 메시지를 보면 Git에서 자동으로 충돌에 대한 내용을 간단하게 기록해 주는 것을 볼 수 있다.
이대로 Commit을 진행해도 상관 없고 원하는 Commit 메시지 내용으로 변경해도 상관없다.
Commit이 완료되면 아까 Commit되지 않은 변경사항 부분이 정상적으로 병합 Commit으로 된 것을 확인 할 수 있다.
'Git' 카테고리의 다른 글
Git - Pull Request 사용해보기 (0) | 2024.01.03 |
---|---|
Git - Fork : 저장소 복제하기 (1) | 2024.01.02 |
Git - Merge와 Conflict (0) | 2023.12.29 |
GIT - Branch 나누기 (2) | 2023.12.29 |
GIT - 소스트리 이용하기 (1) | 2023.12.28 |