ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Git - 5. Branch
    STUDY/Git & Github 2021. 1. 6. 14:40

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

     

    Git에 대해 공부하다 보면, Branch에 대해 한번쯤은 들어본 적이 있을 것 입니다. Branch는 Git을 강력한 버전 관리 도구로 만들어주는 동시에, 꽤나 우리를 골치 아프게 하는 친구입니다. 하지만 Git을 사용하기 위해선 반드시 알아야 하는 것이기도 하죠. 그래서 이번에는 Branch에 대해 알아보도록 하겠습니다.

     

    Branch

    아래의 그림은 Branch를 설명하는 그림입니다. 쉽게 말하면, 다들 한번쯤 레포트를 작성하면서, final_report.docx, final_report_2.docx, final_fianl_report.docx.... 이런 식으로 수정한 과제를 이름을 다르게 해서 저장해본 적이 있으실 겁니다. ㅎㅎ 이것도 버전 관리를 하는 것이라고 할 수 있습니다. 우리가 최종의 최종, 진짜최종으로 이름을 바꿔가며 버전 관리를 하는 것을,  Git의 Branch는 조금 더 고급스럽게, 간편하게 버전관리를 하는 방법이라고 생각하면 됩니다.

     

    아래의 그림을 보면, 처음에 흰 동그라미에서 중간에 초록색과 파란색으로 경로가 나누어지는 것을 볼 수 있습니다. 이렇게 필요에 의해 작업이 분리될때, 우리는 'Branch를 만든다' 라고 합니다. 아래 그림에서는 'Feature'라는 이름의 branch를 만든것 입니다. 기본적으로는 우리가 Git 저장소를 생성하면 기본 Branch로 Master 라는 이름의 branch를 사용하게 됩니다. 그리고 마지막에 보면, 나눠진 branch가 다시 하나로 합쳐지는 것을 볼 수 있습니다. 우리는 이것을 'Merge' 라고 합니다. 나누어진 분기를 다시 하나의 분기로 만드는 것입니다. 

     

    이러한 Branch는 어떤 경우에 사용할까요? 보통 우리의 원본 코드를 그대로 두면서 고객을 위한 추가 기능을 더하거나, 지금껏 작업한 내용을 서버에 저장하기 이전에 문제가 없는지 테스트 할 때 등의 경우에 사용합니다.

    (출처 : https://velog.io/@ggg/Git-%EA%B8%B0%EC%B4%88-%EB%8B%A4%EC%A7%80%EA%B8%B0)

     

    이제 함께 실습을 하면서 Branch에 대해 더 자세하게 알아보도록 하겠습니다. 이번에도 실습을 위해 새로운 디렉토리를 하나 만들고, git 저장소로 초기화 해줍니다. 그리고 f1.txt를 만들고, 내용은 "ab"로 하겠습니다. add과 commit도 진행해줍니다.

     

    git branch 명령어를 통해, 현재 우리의 branch를 확인할 수 있습니다. 위에서 말했듯 초기의 branch는 master입니다.  이제 새로운 branch를 추가해 보도록 합시다. git branch exp 명령어를 이용하여, "exp"라는 이름의 branch를 추가합니다. 그리고 다시 git branch를 통해 확인을 해보면, 새로운 branch인 exp가 생성되어 있는 것을 볼 수 있습니다. 지금 우리가 쓰고 있는 branch에는 '*'가 표시되어있는 것을 확인할 수 있습니다. 이번엔 master branch에서 exp branch로 이동해보도록 하겠습니다.

    git checkout exp 명령어를 이용하면 됩니다. 

     

     

    정리해보면, 

    git branch : 현재 나의 branch 확인

    git branch [branch 명] : 새로운 branch 생성 

    git checkout [branch 명] : 해당 branch로 이동 

     git branch -d [branch 명]  : 해당 branch 삭제

     

    Tip! git checkout -b exp : exp branch를 생성하면서, 바로 exp로 checkout 가능

     

    git branch 생성과 이동

     

    우리가 새로 생성한 branch "exp"를 살펴보면, "master"의 branch와 동일한 파일과, 동일한 commit log가 존재하는 것을 볼 수 있습니다. 그 이유는, branch를 새로 생성하면 현재 속해 있는 branch의 상태를 그대로 복사하여 새로운 branch를 생성하기 때문입니다. 예를 들어, exp branch에 있는 상태에서 새로운 branch를 생성하면,  현재 exp branch의 상태를 그대로 복사하여 새로운 branch를 생성합니다.

     

    exp branch

     

    현재 우리는 exp branch에 있는 상태에서, f1.txt를 "ab"에서 "abc"로 수정하고, add와 commit을 해보겠습니다. (commit message는 "2")

    exp branch에서는 새로운 커밋 버전이 생성되고, f1.txt의 내용도 바뀐 것을 확인할 수 있습니다. 하지만 master branch의 log와 f1.txt는 변하지 않은 것을 확인할 수 있습니다. 

     

    여기서 우리는 Branch의 강력한 힘을 확인할 수 있습니다. branch가 다르다면, 동일한 이름의 파일이더라도 완전히 다른 내용을 가지면서, 원본의 파일은 그대로 유지할 수 있는 것 입니다

     

    exp branch
    master branch

     

    또한 exp branch에서 새로운 파일 f2.txt를 생성하고, add, commit을 하면, 파일 탐색기에서 f1, f2.txt 파일이 보이지만, master branch로 전환하게 되면 f2.txt 파일은 파일 탐색기에서 보이지 않습니다. Branch의 기능들 놀랍지 않나요?

     

    exp branch 경우의 파일탐색기 모습(왼), master branch 경우 파일탐색기 모습(오)

     

     

    다음으로는 branch의 정보를 확인해보도록 하겠습니다. 이전에 현재 우리의 작업 디렉토리의 상태를 한번 살펴보도록 하겠습니다.

     

    master branch에서 f1.txt, 내용은 "ab", 커밋 로그는 "1"인 파일이 존재하는 상태에서, exp branch를 새로 생성하였습니다.

    exp branch에서는 f1.txt의 내용을 "abc"로 수정하고, 커밋 로그는 "2"인 버전을 생성하였습니다.  그다음에는 동일한 branch에 f2.txt파일을 새로 생성하였습니다.(내용 "a",커밋 메세지"3")

     

    지금까지의 branch 정보를 한번 살펴보도록 하겠습니다.   

    git log --branches --decorate --graph

     

    commit a5132e... (HEAD -> exp)   ==> 현재 exp branch의 최신 커밋

    commit 3279.. (master)                 ==>  현재 master branch의 최신 커밋

     

     

     

    branch의 정보 확인

    지금까지의 branch 상태로는, branch의 특징을 한눈에 보기는 어려움이 있습니다. 몇개의 파일을 더 수정하고, 추가해 보도록 하겠습니다.

    1. exp branch에서 f2.txt의 내용을 "ax"로 수정한 후, add, commit (commit message = "4")

    2. master branch에서 f3.txt의 내용을 "x"로 생성한 후, add, commit (commit message = "5")

     

    이제 다시 한번 git log --branches --decorate --graph  명령어를 통해, branch의 상태를 확인해 보겠습니다. 

    이전보다는 더 branch가 어떤 식으로 이루어지는 지 이해하기 좋으실 것이라고 생각합니다. 아래의 사진을 자세히 보면, "1" 커밋 이후에 새로운 분기가 시작된 것을 확인할 수 있습니다. 

     

     

     

    각 branch들의 차이점을 좀 더 자세하게 볼 수도 있습니다.

     

    git log master..exp : master와 exp의 차이점을 더 자세하게 보여줍니다. (master에는 없고, exp에는 있는 것들)

    git log exp..master : 반대로 exp에는 없고, master에는 있는 차이점을 보여줍니다. 

    git log -p exp..master : branch 간의 차이점을 소스코드까지 자세하게 보여줍니다. 

     

                           * git log -p exp..master 자세히 보기..     : exp에는 없고, master에는 있는 차이점

                            (개인적으로 파일간의 차이점을 보여주는 log, diff가 헷갈려서 자세하게 설명해두었습니다..)

                                        commit b337f7221fdc296a7370db2e24984ca20a702cbb (master)

                                        Author: kuku <kuku@email.com>

                                       Date:   Wed Jan 6 13:38:35 2021 +0900

                                              5

     

                                      diff --git a/f3.txt b/f3.txt

                                      new file mode 100644 

                                      index 0000000..587be6b

                                      --- /dev/null ==>exp branch에는 존재하지 않음

                                     +++ b/f3.txt ==> master branch에서 생성한 파일, f3.txt

                                     @@ -0,0 +1 @@

                                     +x ==> f3.txt의 내용은 "x"

     

    git diff master..exp  : branch 간의 차이점을 소스코드까지 자세하게 보여줍니다. 

                                   

                                 diff --git a/f1.txt b/f1.txt

                                 index 422c2b7..de98044 100644

                                 --- a/f1.txt ==> master branch의 f1.txt 내용 "ab"

                                 +++ b/f1.txt ==> exp branch의 f1.txt 내용 "abc"

                                 @@ -1,2 +1,3 @@

                                  a

                                  b

                                 +c ==> master branch에서 f1.txt는 "ab"였는데, exp branch의 f1.txt에서 "abc"로 "c"가 추가됨.

                                  

     

    git log [branch1]..[branch2]

     

    git log -p [branch1]..[branch2]

     

    이제는 이렇게 분리된 branch를 다시 합치는 방법에 대해 알아보겠습니다. 다시 branch를 합치는 것을 'Merge'라고 합니다. 

    git log --branches --graph --decorate --oneline 명령어를 통해, 우선 현재 branch 상태를 간단하게 살펴보겠습니다.

     

    merge는 헷갈리기 쉬우니 천천히 잘 이해해보시기를 바랍니다..! 

    우리가 지금 하려는 것은, 새로운 branch인 exp에서 작업하던 내용들(2,3,4)를 다시 master branch로 합치는 것 입니다. 즉, exp branch에서 작업한 2,3,4 커밋의 내용을 master를 가질 수 있도록 병합하는 것 입니다. 여기서 중요한 점은, exp branch ==> master branch로 합치기 위해서는, master branch로 checkout된 상태에서 merge를 해야한다는 것 입니다...! 어디서 어디로 합병하느냐에 따라 checkout 위치가 달라져야하는 것을 꼭 기억하셔야합니다! 

     

    * exp branch --> master branch로 Merge (exp의 내용을 master로 합치기)

     

    1. master branch로 checkout

    2. git merge exp

    3. commit message 작성(default message 사용함.)

     

    git log --branches --graph --decorate --oneline
    master branch에서 merge 진행
    merge commit message

     

    merge 한 이후의 branch 상태를 다시 한번 살펴보겠습니다. 위의 병합 전 상태와 차이점이 보이시죠! Merge 이후, git log를 통해 확인해보면, master branch에 exp에서 작업한 내용들까지 잘 합쳐진 모습을 볼 수 있습니다.

    만약, exp에도 master에서 작업한 내용을 합치고 싶다면, 반대로 exp로 checkout한 후에 동일하게 git merge master를 진행하면 됩니다. 하지만 branch 두개가 모두 동일한 내용을 갖는건 그닥 의미가 없겠죠? 하지만 한번씩 연습해보는 것이 좋다고 생각합니다!Branch 삭제. : git branch -d exp

                                                  

                                                  *   1fb04c9 (HEAD -> master) Merge branch 'exp' ==> master branch의 최신 커밋

                                                  |\                                                           exp, master 두개의 branch를 잇는 commit이 최신 

                                                  | * 81524ca (exp) 4                              commit이 된다.  *두개의 부모 커밋을 가짐!!!

                                                  | * 6e9e7c1 3                                                            부모 1 : "5" / 부모 2 : "2,3,4"

                                                  | * fcfbe6c 2

                                                  * | b337f72 5

                                                  |/  

                                                  * 3279381 1

     

    master branch에 exp에서 작업한 내용들까지 잘 합쳐진 모습

     

     

    __________________

     

    지금까지 Git의 혁신이라고 할 수 있는 Branch에 대해 알아보았습니다. 이번에도 글이 너무 길어져..Branch 충돌해결과 Stash는 다른 글로 찾아오겠습니다.

    감사합니다.

    댓글

Designed by Tistory.