본문 바로가기
카테고리 없음

git merge conflict가 발생하면 어떻게 하고 계시나요?

by 노아론 2021. 11. 21.

git merge 과정에서 conflict이 발생할 때 새로 커밋을 추가하여 해결하고 계시진 않나요?
이 글에선 상황 별 사례를 통해 git merge 명령의 옵션을 통한 보다 깔끔한 버전 히스토리를 남기는 방법에 대해서 다룹니다

 

Git 버전 관리를 하며 여러 브랜치를 관리하다보면 merge 명령을 통해 브랜치의 내용을 내가 보고 있는 브랜치로 병합해야 하는 경우가 생긴다.

그러나 다른 사람이 나와 같은 코드를 수정하고 해당 브랜치를 merge하고자 할 때, 버전 히스토리가 다르거나 이외의 이유로 충돌이 발생하는 경우가 생기곤 한다.

이번 글에서는 git merge를 할 때 merge의 옵션을 이용해 conflict가 발생했을 때 간단하게 커밋 메세지를 남기는 방법에 대해서 다뤄본다.

우선 git conflict가 발생하는 사례를 만들어보고자 동물의 울음소리를 정의하는 json을 생성해본다.
master 브랜치에서 아래 내용으로 고양이에 대한 울음소리를 추가하고 커밋을 한다.

 

이어서 feature/dog_and_horse_sound 브랜치를 생성하고
말에 대한 울음소리로 "neigh"를, 개에 대한 울음소리로 "woof"를 추가하여 커밋을 한다.

 

master 브랜치에서는 개에 대한 울음소리를 "bark"로 양에 대한 울음소리는 "baa" 로 정의하여 커밋을 한다.

 

지금까지 작업한 상태를 커밋 로그 그래프로 확인해보면 아래와 같이 구성되어있다.

 

이 상황에서 master 브랜치를 checkout 한 상태에서 feature/dog_and_horse_sound 브랜치를 병합하면 어떻게 될까?

아마도 개에 대한 코드가 masterfeature/dog_and_horse_sound 브랜치에 모두 새롭게 정의되었으니 conflict가 발생하게 될 것이다.
그럼 직접 충돌나는 내용을 확인해보자

 

git merge feature/dog_and_horse_sound
예상했던 바와 같이 아래처럼 충돌이 났음을 확인하였다.

 

이렇게 충돌이 난 상황에서 어떻게 해결하는가?

충돌이 발생한 코드 수정을 한 뒤에

git add .

git commit -m "메세지"

이렇게 해결하진 않는가?

 

위와 같이 진행하면 merge를 하였는데 무언가 merge 내용의 커밋 메세지가 아닌 내가 입력한 메세지가 남아서 찜찜한 기분이 남는다

 

이때 merge의 continue 옵션을 사용하면 merge 커밋 메세지를 남겨 깔끔하게 처리할 수 있다.

 

다음과 같이 Merge branch 'feature/dog_and_horse_sound' 메세지가 남아 master 브랜치의 히스토리만 보고도 어떤 브랜치에서 병합을 했는지 빠르게 파악할 수 있다


git merge 명령의 옵션은 굉장히 많다.

전부 다루고 기억하기에는 옵션들이 너무 많기도 하여서 continue 외에 추가적으로 내가 자주 사용하는 옵션인 abort에 대해서도 간략히 다뤄본다.

 

우선 merge conflict가 발생하는 상황을 재현하기 위해서 git merge —continue 를 하기 전인 상황으로 돌아왔다.

 

git merge feature/dog_and_horse_sound 로 브랜치를 병합하면 충돌이 나서 코드를 정리해야 하는 상황이 생긴다.

 

이전으로 돌아가고 싶다면 변경된 이력의 파일을 하나씩 Undo하여서 충돌이 나기 전의 상황으로 돌아갈 수 있지만,
git merge —abort 를 하면 너무나도 쉽고 빠르게 충돌 이전의 상황으로 돌아갈 수 있다.

 

이것으로 merge 명령의 continue와 abort 옵션에 대한 설명을 마친다.

 

이번 글에서 진행한 내용은 아래 github 저장소에서 확인할 수 있다
https://github.com/roharon/tech-blog_git-command-use-case

앞으로는 git merge 와 rebase 등 여러가지 유용한 명령에 대해 실제 개발 시의 사용 사례를 쉽게 푸는 글을 연재하고자 한다

다음 글에서는 git rebase 명령을 이용해 내가 작업중인 브랜치에 release된 내용을 반영해 최신화하는 방법에 대해서 다뤄본다.

댓글