ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Git - 5.1 Branch 충돌 해결
    STUDY/Git & Github 2021. 1. 6. 15:58

    #이 글은 "생활코딩" '프로젝트 관리' 강의를 기반으로 정리한 글 입니다. 

     

    이전 글에 이어 이번에는 Branch 충돌 해결에 대해 알아보도록 하겠습니다. 

     

    편의를 위해 새로운 git 저장소를 만들어 실습을 진행했습니다. ㅎㅎ

     

    우선 master branch에 master.txt 내용은 간단하게 "a"라고 적어주고, add와 commit을 해줍니다. 

    그 다음, 새로운 branch exp를 만들어, exp.txt을 만들고, 내용은 역시 "a"라고 적어준 후, add와 commit을 해줍니다.

    그리고 다시 master branch로 돌아와 exp를 merge 해줍니다. 

     

    master branch ->  master.txt
    exp branch --> exp.txt 
    master branch --> merge

     

    결과는 아래와 같습니다. Git 각각의 branch에서 새로운, 이름이 다른 파일들도 자동으로 merge 시켜줍니다. 

     

    git merge exp

     

    그렇다면, 이름이 동일하고 내용이 다른 경우에 merge는 어떻게 될까요?

    비교를 위해 우선 exp branch도 master와 동일하게 merge 시켜주겠습니다. 

    exp branch로 이동하여 common.txt 파일을 만들어줍니다. 내용은 "function a() {} "로 해주고, add와 commit을 해줍니다. 그 다음에, master branch로 이동하여 exp 를 merge 해줍니다. 

     

    그리고 이제 mater와 exp branch에 모두 동일한 common.txt 파일이 존재합니다. 이제 각각의 branch에서 common.txt 파일을 수정한 후 merge 하면 어떻게 되는지 살펴보겠습니다. 아래의 사진과 같이 common.txt 파일을 수정해줍니다.

     

    exp branch - common.txt                                                                   master branch - common.txt

    exp branch의 common.txt(왼), master branch의 common.txt(오)

    동일한 이름의 파일을 다른 위치를 수정하였습니다. 이제 다시 두 branch를 merge하면 어떻게 될까요? master branch에서 git merge exp를 실행해 봅시다. 결과는 아래와 같습니다. master에서 추가한 "function c() {}"exp에서 추가한 "function b() {}" 가 모두 common.txt 파일에 추가되어있는 것이 보이시나요??

     

    이것이 가능한 이유는, 각각의 branch에서 동일한 이름의 파일이더라도, 수정한 위치가 다르다면 git이 merge 시 자동으로 합쳐줍니다. Git의 정말 편리한 기능이죠! 

     

    common.txt 수정 후 다시 merge한 모습

     

    하지만, 각각의 브랜치에서 동일한 부분을 수정한다면, 여기서 문제가 발생하게 됩니다. 바로 Branch 충돌이 발생하게 되는 것입니다. 이러한 상황은 어떨때 발생하고, 어떻게 처리하는지 알아보겠습니다. 

     

    우선, exp branch에서도 merge를 하여 master와 exp branch를 동일한 상태로 만들어줍니다. 그 다음 아래와 같이 common.txt 파일을 수정해 봅시다. 그리고 commit을 한 후, merge를 진행해보겠습니다. 어떤 일 이 발생할까요?

     

    master branch - common.txt                                                           exp branch - common.txt 

    common.txt 수정

     

    master branch에서 git merge exp 명령어를 실행하면, 아래와 같은 오류가 발생합니다.

    충돌 (내용): common.txt에 병합 충돌

    자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.

     

    전처럼 동일한 파일의 다른 위치를 수정했을 경우에는 git이 자동으로 병합을 해주었지만, 지금처럼 동일한 파일의 동일한 위치를 수정하는 경우에는 충돌이 발생하게 됩니다. 올바르게 merge를 하기 위해서는, 우리가 직접 이 충돌 사항을 해결해주어야 합니다.  아래의 에러 메세지가 충돌이 난 파일을 친절하게 알려주고 있습니다. 우선 그 파일을 살펴보죠.

     

    branch 충돌 발생
    충돌이 발생한 common.txt

          충돌이 발생한 파일의 내용을 조금더 자세히 살펴보도록 하겠습니다.             

         

                                                  function c() {}

                                                  <<<<<<< HEAD  ===> HEAD는 현재 checkout 한 branch의 수정사항을 보여줍니다.

                                                  function a(master) {} 

                                                  =======

                                                  function a(ep) {}

                                                  >>>>>>> exp   ===> '===='에서 '>>>>exp"사이는 exp branch의 수정사항을 보여줍니다.

                                                  function b() {}

     

    우리가 할 일은, git이 보여주는 이 에러 메세지를 읽고, 충돌을 해결하는 것 입니다. 내용을 잘 살펴보면, HEAD 는 현재 checkout한 branch 즉, master branch에서 수정한 내용을 보여줍니다. 아래 '>>>>>exp'는 exp에서 수정한 내용을 보여줍니다. 이를 통해 우리는 'function a'에서 '()'안에 내용이 서로 다르기 때문에 충돌이 발생했음을 파악하고, 이를 수정해주면 됩니다.

     

    아래와 같이 'function a'의 매개변수로 master, ep를 둘다 넣는 방식으로 수정을 한 후 다시, git commit을 해주면 두번째 사진과 같이 충돌을 수정하였다는 메세지를 보여주고, 정상적으로 merge가 완료됩니다.

     

    common.txt 충돌 해결

     

    충돌 해결 후, git commit

     

     

    ________________

     

    이번에는 branch 충돌이 발생하는 경우와, 해결법에 대해 알아보았습니다.

    다음에는 Branch의 마지막 내용인 stash에 대해 알아보도록 하겠습니다.

    감사합니다. 

    댓글

Designed by Tistory.