티스토리 뷰

Git 정리

Git 정리(6) - 충돌 해결

sh9404 2020. 2. 19. 18:50

Git을 사용할때 우리를 가장 힘들게 하는 그 것! 우리가 Git 사용하기 너무 어렵다고 하는 바로 그 이유!

오늘은 머지를 했을 때 충돌 해결 방법에 대해 알아보려고 합니다.

우선 저는 Sourcetree 라는 GUI툴 대신 계속 터미널에서 명령어로 Git을 사용하는 법을 다루고 있는데요, 앞서 포스팅 했던 내용들이 원리와 본질은 같고, 단지 각종 명령을 명령어로 입력해서 실행하느냐, 버튼을 눌러서 실행하느냐의 차이이기 때문에 Sourcetree를 사용하고 계셔도 글을 읽어보시면 많은 도움이 될 거라고 생각합니다! (아 참고로 나중에 Sourcetree 내용도 다룰 예정입니다.)

우선 충돌을 해결하는 방법을 알기 이전에 충돌이 왜 나는지부터 알아야 겠죠?

 

이유는 단순 합니다! 두 브랜치에 A라는 파일이 있다고 가정했을 때, 두명의 사람이 각각의 브랜치에서 A라는 파일의 두번째 라인의 코드를 수정했다고 생각해 봅시다. 그 다음 머지를 실행하면 컴퓨터는 어떤 코드를 선택해야하는지 선택할 수 없게됩니다. 그래서 사용자한테 어떤 코드를 선택할 것인지 알려달라고 하기 위해 '충돌'을 일으키는 것이죠. (한 마디로 우리를 괴롭게 하기 위해 충돌이 발생하는건 아니라는 겁니다 ㅎㅎ)

참고로, 저는 ios개발을 공부 했었기에, ios에서 일어나는 충돌에 대해 잠깐 얘기해 보자면, ios앱 같은 경우 머지 할 때, storyboard 충돌도 많이 발생하게 되는데요. storyboard는 xcode 상에서는 뷰 형태로 보이지만, 내부를 보면 xml이라는 코드로 짜여 있기때문에 같이 stroyboard를 수정하다보면 충돌이 불가피하게 발생하게 됩니다.

우선 설명을 드리기 위해서는 임의로 충돌상황을 만들어야 하기 때문에, gitpractice라는 폴더를 하나 만들고 여기에 master 브랜치와 feature 브랜치를 새로 만들겠습니다.

 

처음 master 브랜치에서 vim file1.txt 를 통해 새로운 텍스트 파일을 만든 후 function a() 라고 적습니다.

이후 git add file1.txtgit commit -m "1" 을 해준 후 새로운 브랜치 feature를 만들기 위해

git branch feature를 합니다. (여기까지는 앞서 다 배운 내용이므로 이미지 생략하겠습니다.)

 

git checkout feature 를 통해 feature 브랜치로 이동하신 후 file1.txt의 function a()라 적혀있는 부분을 function b() 로 바꿉니다. 이후 git add 와 commit을 해줍니다.

git add file1.txt

git commit -m "2"

 

git checkout master를 통해 다시 master 브랜치로 이동하신 후, file1.txt의 function a()라 적혀있는 부분을 function c()로 바꿉니다. 그리고나서 git commit -am "3"

featue 브랜치 내용

 

master 브랜치 내용

 

그럼 각각의 브랜치에서 file1.txt의 같은 라인을 서로 다르게 수정하게 된건데요.

머지했을 때 다들 어떻게 될지 예상 되시죠? ㅜㅜ

한번 머지를 해봅시다! (저희는 현재 master브랜치 이므로 master 브랜치에 feature 브랜치를 합치게 됩니다.)

머지 명령어는 git merge '브랜치명' 입니다. 저희는 다른 브랜치명이 feature이기 때문에

git merge feature 라 입력하시면 됩니다.

머지를 하면 하단의 그림과 같이 CONFLICT 메시지가 뜨고 머지가 이뤄지지 않습니다.

 

vim file1.txt 를 통해 파일을 열어보면 파일에 우리가 적은적 없던 글씨가 적혀 있을 겁니다. ㅎㅎ

한번 열어볼까요?



<<<<<<< ======= >>>>>>> 등의 이상한 기호와 아까 저희가 각 브랜치에서 적었던 function b()와 function c()가 있네요? 위에서 설명 드렸듯이, git이 어떤 코드를 써야하는지 모르기에 사용자가 지정해달라고 충돌을 일으킨 겁니다.

 

HEAD란 이전에도 설명 드렸듯이, 현재 속해있는 브랜치를 말합니다. 저희는 지금 master브랜치에 있죠?

즉, ========== 기준으로 위의 내용이 master 브랜치, 아래의 내용이 feature 브랜치 입니다.

 

<<<<<<<< HEAD (현재 속해있는 브랜치 수정사항)

function c() (충돌이 난 부분 표시)

==============

function b() (충돌이 난 부분 표시)

>>>>>>>>>feature (feature 브랜치의 수정사항)

 

만약 두개의 함수 b,c를 둘다 사용 하겠다! 하시면 저 <<<<<>>>>>>>>feature 를 삭제하고 두가지 내용을 남겨주시면 되고, 둘 중 하나를 사용하겠다! (예를들면 function c()를 사용하겠다!)

하면 저기서 function c()의 내용만 남겨주시면 됩니다.

이렇게요

case1. 두 가지 함수 다 사용

function c()

function b()

 

case2. 둘 중 하나 선택

function c()

 

이렇게 충돌을 해결 하셨으면, 다시 git add 를 해주고 git commit 을 해주면 끝나게 됩니다.

모르면 어렵지만 알면 정말 편하고 쉬운 git!

 

우리가 git을 Local 컴퓨터에서만 사용하려고 배우는게 아니잖아요 !?

다음 포스팅부터는 Github을 사용하는 방법에 대해 배워보도록 하겠습니다!

'Git 정리' 카테고리의 다른 글

Git 정리(7) - Github  (0) 2020.02.20
Git 원리소개(2)  (0) 2020.02.20
Git 정리(5) - stash  (0) 2020.02.18
Git 정리(4) - Merge  (0) 2020.02.18
Git 정리(3) - branch  (0) 2020.02.17
댓글
링크
최근에 올라온 글
최근에 달린 댓글