티스토리 뷰

반응형

Hello!

 

여러 개발자와 함께 개발을 하다보면, 어떤 경우에는 같은 위치의 코드를 동시에 수정하게 되고 이를 같은 브랜치로 반영할 때에 충돌이 발생하게 됩니다. 이럴 때에는 해당 코드의 충돌을 수정해줘야 성공적으로 push 또는 merge를 할 수 있는데요. 한번 해당 상황을 만들어 sourcetree에서는 어떻게 충돌을 해결할 수 있는지 살펴보겠습니다 ㅇ3ㅇ

 

conflict 상황 만들기

저는 main, alpha, beta 브랜치를 따로 생성하여 충돌이 발생하는 상황을 만들어보았습니다. 동일한 commit에서 두 브랜치 alpha, beta 브랜치를 생성합니다. 그리고 alpha 브랜치에서 수정된 변화들을 먼저 main 브랜치로 merge를 하고, main 브랜치를 beta 브랜치로 merge 하며 conflict를 발생시켰습니다.

 

main 브랜치

public enum OffDay {
    Mon,
    Tue
}

 

alpha 브랜치, alpha 브랜치가 merge된 main 브랜치

public enum OffDay {
    Mon,
    Tue,
    Wed // alpha
}

beta 브랜치

public enum OffDay {
    Mon,
    Tue,
    Thu // beta
}

 

 

conflict 해결하기

 

충돌 만들기

히스토리를 확인을 먼저 해보겠습니다. 현재 alpha 브랜치에 한 커밋이 생성되었고 이미 main 브랜치에 merge 되었음(노란색,빨간색)을 확인할 수 있습니다. 그리고 beta 브랜치에도 하나의 커밋이 생성(파란색)되었다는 것을 확인할 수 있습니다.

 

그리고 main 브랜치를 최신으로 pull 한 다음 beta 브랜치로 merge 해보겠습니다. 충돌이 발생하겠죠?

Sourcetree에서 다른 브랜치(main)를 현재 브랜치(beta)로 merge 하는 법은, 현재 브랜치 checkout 후에 merge하고 싶은 브랜치 우클릭 후에 <Merge '다른브랜치' into 'checkout 브랜치'>를 선택해주시면 됩니다.

 

 

충돌 해결하기

 

쨘!! 충돌이 발생습니다.

친절하게 Sourcetree에서는 '충돌 해결' 밑의 메뉴를 사용해달라고 안내도 해주네요. 그리고 충돌이 발생한 파일들은 Sourcetree 파일 상태에서 ⚠️ 로 표시되어 있습니다.

 

 

 

해당 파일에서는 현재 브랜치의 파일 상태 (<<<<<HEAD)  그리고 타 브랜치 (>>>>>>main)으로 표시되어 있습니다. 이러한 충돌을 원하는 방식으로 수정을 해줍니다. 저는 충돌이 발생한 파일들을 확인하고, 제가 사용하는 editor에서 직접 수정을 해줍니다. main 브랜치 변경 내용을 위에, 그리고  현재 브랜치 수정 내용을 아래로 배치하며 두 수정사항을 모두 반영하겠습니다.

2. 충돌 파일 수정 전과 수정 후

두 브랜치의 한 브랜치의 변경 사항만 살려도 되거나, 살리고 싶을 때는 충돌 해결하기 > '내것' or '저장소' 를 사용하여 해결하기 옵션을 사용해 줍니다. '내것'을 이용해 해결 옵션을 선택 할 경우, 내 브랜치의 변경사항만 반영되게 되고 타 브랜치의 수정사항은 폐기됩니다. 반대로  '저장소'것을 사용하여 해결 할 경우에, 충돌이 발생한 코드에 내 브랜치의 수정사항은 폐기되고, 다른 브랜치의 변경사항반 반영되게 됩니다.

 

위의 스크린샷을 통해, '저장소' 것을 사용하여 해결 옵션을 선택할 경우. 내 브랜치의 beta 변경사항은 제거되고, alpha 브랜치의 변경사항만이 남게 되는것을 확인할 수 있습니다.

 

처음부터 다시 수정하고 싶을 땐

conflict를 수정하다 다시 처음 충돌 상황부터 다시 시작하고 싶을 땐, 충돌 해결하기 > 병합 재시작 옵션을 사용하면 깔끔하게 새롭게 수정을 시작할 수 있습니다.

 

선택 사항

파일 수정 후 ⚠️로 표시되어있는 충돌된 해당 파일 우클릭 > 충돌 해결하기 > 해결된 것으로 표시를 하게 되면 ⚠️표시가 사라지게 됩니다. 충돌된 파일이 많은 경우에는 어떤 파일들의 충돌이 해결되었고 아닌지 판단하여 수정 하기 좋겠죠?

 

 

완료하기

이제 충돌을 완료하기 위해 커밋 버튼을 클릭해줍니다. 이 커밋 내용은 수정할 수 없습니다. 이전의 merge commit의 연장선으로 충돌만 해결하는 것이기 때문에 '커밋' 버튼을 눌러줍니다. 또는 터미널에서 'git commit'을 입력해주어도 됩니다.

커밋이 정상적으로 이루어졌습니다. 바로 push를 해주고 github에서 한번 살펴볼까요?

beta 브랜치에는 아래와 같이 2개의 커밋이 생성되었습니다. 그리고 alpha와 beta의 변경사항이 모두 반영이 되어있네요!! 

그리고 각각의 커밋을 살펴보면 아래와 같습니다. 딱 alpha의 변경사항이 이쁘게 merge 되었네요.

 

충돌 해결 성공!!!!

 

 

 

Hope this helps :-)

반응형
반응형