[코드잇] Git에서 conflict(충돌) 해결하기

코드잇 / 조회수 : 7865

여러분은 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 토픽 > 'Git에서 커밋 다루기' > 'merge할 때 conflict가 발생할 수도 있어요!' 영상

기업문화 엿볼 때, 더팀스

로그인

/