여러분은 Git을 사용하다가 현재 브랜치에서 다른 브랜치를 머지해본 적 있나요?
현재 브랜치에서 다른 브랜치를 머지할 때 아무 문제없이 잘 끝날 때도 있지만 어떤 경우에는 conflict(충돌)를 만나기도 합니다.
conflict가 정확히 뭘까요? conflict는 두 브랜치의 동일한 파일에 상반된 내용이 있다는 뜻입니다. 이럴 때는 Git이 두 가지 중에서 어떤 내용을 머지의 결과로 해야할지 모르기 때문에 사용자가 결정해줘야 하는데요. 그래서 Git이 conflict를 발생시키는 겁니다.
Git 초보자들은 conflict를 만나면 당황해서 어쩔줄 몰라합니다. 개발자라면 conflict를 어떻게 처리해야할지 몰라 허둥지둥댔던 경험, 한번쯤은 있으시죠?
하지만 방법만 제대로 알면 conflict를 해결하는 것은 전혀 어렵지 않습니다.
conflict가 발생했을 때 여러분이 취할 수 있는 방법은 크게 2가지입니다.
첫 번째, 일단은 머지 작업을 취소하고 원래 상태로 돌아온다.
두 번째, conflict(충돌)를 해결하고 머지를 완료한다.
각각 어떻게 할 수 있는지 차례대로 보여드릴게요.
자, 아래 그림을 볼까요?
지금 master 브랜치, premium 브랜치가 있는 상황이고 공통 커밋(435c 커밋)이후로 각 브랜치에서
master 브랜치 - A type commit
premium 브랜치 - B type commit
이렇게 서로 다른 커밋을 했습니다.
지금 HEAD가 master를 가리키고 있으니까 저는 master 브랜치에 있는 건데요. 이 상태에서
git merge premium
커맨드를 실행해서 master 브랜치에 premium 브랜치를 머지하겠습니다.
실행했더니 아래 그림과 같이 conflict가 발생했습니다. sample이라는 파일에서 conflict가 났다는 걸 알 수 있네요.
자, 이 상황에서 취할 수 있는 대응 방법 1번! 일단 머지를 취소하는 방법입니다. 머지 취소는 간단합니다.
git merge —abort
를 실행하면 됩니다. 여기서 abort는 버리다, 취소하다라는 뜻인데요. 실행하면
위 그림처럼 마치 아무 일도 없었다는 듯이 모든 것이 머지하기 이전의 원상태로 돌아옵니다.
자, 이제 대응 방법 2번을 배워볼게요. 다시 머지를 하겠습니다.
이번에는 이 conflict를 해결해보겠습니다. 여기서 잠깐 추가로 팁을 드리자면, conflict가 발생한 파일들은 위 그림처럼 머지할 때의 출력 결과로 확인할 수도 있지만,
git status
커맨드로도 확인할 수 있습니다. git status를 실행해보면
Unmerged paths 영역에 conflict가 발생한 sample 파일의 이름이 보입니다. conflict가 여러 파일에서 발생하면 해당 파일들의 이름이 모두 이 영역에 보이게 됩니다.
자, conflict가 발생한 sample 파일을 Sublime Text라고 하는 텍스트 에디터로 열어볼게요.
Conflict가 발생한 지점이 보입니다.
지금 <<<<<<≤ HEAD 부터 ======= 까지가
- HEAD가 가리키던(그래서 HEAD 표시가 있는 겁니다)
- master 브랜치가 가리키던
- 최신 커밋에서의 sample 파일의 내용
이고,
======= 부터 >>>>>>> premium 까지가
premium 브랜치가 가리키던
최신 커밋에서의 sample 파일의 내용
입니다.
여기서 할 수 있는 선택은 다양합니다.
(1) Good morning!을 선택(Good morning! 텍스트만 남기고 나머지 부분 다 삭제)
(2) Good Afternoon~을 선택(Good Afternoon~ 텍스트만 남기고 나머지 부분 다 삭제)
(3) 아예 충돌이 발생한 전체 부분 삭제하고 머지의 결과로 원하는 새로운 내용 입력
저는 (3)번의 선택을 할게요.
충돌 부분 전체를 삭제하고, Good Bye~라고 입력할게요. 그 다음 sample 파일을 저장하고, 터미널 화면으로 돌아갈게요.
그 다음에는
git add sample
git commit -m '커밋 메시지'
로 늘 하던대로 커밋을 하면 됩니다. 아래 그림처럼요.
이렇게 하면 머지가 정상적으로 마무리됩니다. 머지를 해결하는 거 별로 어렵지 않죠?
그런데 방금은 파일 하나에서만 conflict가 발생했는데요. 만약 여러 파일에서 conflict가 발생했다면 어떻게 해야할까요?
만약 conflict가 여러 파일에서 발생한 경우에는
(1) conflict가 발생한 모든 파일들을 열어서 방금 한 것처럼 머지의 결과로 원하는 모습대로 그 내용을 수정해주고
(2) 터미널에서 git add . 를 실행해서 수정사항이 발생한 모든 파일을 staging area에 올려주면 됩니다.
(3) 그리고 git commit으로 커밋을 하면 되죠.
머지를 할 때 conflict를 해결하는 것은 Git 사용법에서 핵심 중의 핵심입니다. 앞으로 conflict가 발생해도 침착하게 해결할 수 있겠죠?
코드잇 멤버십 유저가 아니라면, 여기서 확인하세요 :)
코드잇 멤버십 유저라면, 여기서 자세히 확인하세요 :)
코드잇 Git 토픽 > 'Git에서 커밋 다루기' > 'merge할 때 conflict가 발생할 수도 있어요!' 영상