ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • git에서 브랜치(branch) 따고 머지(merge)해보기
    초급 개발자 이야기/노하우 쌓아가기 2014. 11. 7. 03:01

    이 카테고리에는 더 이상 글이 올라오지 않습니다.


    별도의 개발 블로그를 열어 개발에 관련된 이야기는 블로그를 분리하였습니다.

    만약 더 많은 개발 이야기가 보고 싶으시다면 아래 링크로 이동해 주세요.


    link : Digital Blue Eye's dev-ops

    #######################################################################################################



    개발을 하다보면 항상 떨어질래야 떨어질 수 없는 기술(or 서비스??)이 하나 있는데 바로 VCS(Version Control System)입니다.


    소스의 변경 내역을 서버와 로컬에 저장하고 있어 언제든지 버전을 되돌리거나 다른 사람이 작업한 소스를 합치거나 할 수 있죠.


    학교 다닐때만 해도 그냥 소스 작성하고 압축해서 그때 그때 백업하고는 했는데 이제 개발 8년차... VCS와는 떨어질래야 떨어질 수 없는 몸이 되었습니다.


    저희 회사는 현재 SVN이라는 VCS를 사용하고 있습니다만... 최근에는 git에도 많은 흥미를 가지고 있습니다. (가장 최근의 프로젝트는 git을 이용했구요.)


    그러던 중.... 오늘 페북에 git에서(정확히는 github에서) branch와 merge를 어케하냐는 한 후배님의 질문이 올라왔습니다.


    그.래.서.


    저도 머리속에 있는걸 정리해 볼겸 백만년만의 포스팅을 준비했습니다.




    후배님의 요청도 있고하니 요즘 개발자들 사이의 hot!!!한 트랜드인 github에서 간단히 branch를 만들고 merge를 해보겠습니다.






    아래의 내용은 git에서의 branch 생성, master와 branch의 merge, branch 간의 merge에 대한 내용만 다루고 있습니다.


    git은 기본적으로 local repository와 remote repository로 나뉘며, 개발 소스의 commit은 local repository에 반영되며, push라는 명령을 이용해 remote repository로 적용한다는 git의 가장 기본 개념은 중요하게 숙지하고 있어야 합니다.


    그외의 git의 다른 명령, 기능, 개념에 대해서는 다루지 않습니다.... (라고 쓰고 나도 잘 모른다라고 읽는다;;;)


    그러면 이제 github에 접속해서 새로운 repository를 하나 만듭시다.

    github에 로그인하시고 어딘가 찾아보면 "create repository"라는 버튼이 있습니다. (무책임;;;)







    저는 MBTest (뭔가 맘에 안드는 이름이지만... Merge and Branch Test의 약자로...) 라는 이름의 Repository를 하나 만들었습니다.





    자... 그림이 좀 깨져서 나오기는 하는데.... repository가 만들어졌습니다.

    이제 branch를 만들고 merge를 해볼껀데... 우선 우측의 여러가지 메뉴 중에 우리가 지금부터 하는 과정을 그래피컬하고 이쁘게 살펴 볼수 있는 아주 좋은 기능을 github에서 제공하고 있습니다.


    우측 메뉴 중 "Graphs"를 선택하고 아래의 화면처럼 "Network" 탭을 선택합니다.







    그러면 요렇게!!! 점이 하나 찍혀 있습니다;;;

    이 화면은 앞으로 여러가지 history들(파일 추가, branch 생성, merge 등등)이 시간 흐름에 따라 선으로 이쁘장하게 출력됩니다.



    1. 소스 clone 받기


    그럼 이제 소스를 로컬에 받아 봅시다!!!


    git bash를 열고..... (툴은 알아서 설치;;;;)

    아래처럼 명령을 입력해서 repository를 clone 받습니다.


    $ git clone https://github.com/kr-zephyr/MBTest.git
    
    Cloning into 'MBTest'...
    remote: Counting objects: 3, done.
    remote: Compressing objects: 100% (2/2), done.
    remote: Total 3 (delta 0), reused 0 (delta 0)
    Unpacking objects: 100% (3/3), done.
    Checking connectivity... done.
    


    그리고 윈도우 탐색기든 OSX 파인더든 열어서 MBTest라는 경로에 파일을 하나 추가합니다.



    $ ls
    
    README.md	master1.png 
    


    저는 master1.png 라는 파일을 하나 추가했습니다.



    2. repository에 소스 추가하기


    파일을 local repository에 add -> commit 하고 remote repository로 push 합니다.



    $ git add master1.png
    
    $ git commit master1.png
    
    [master b0fd2f1] master에 첫번째 파일을 commit 합니다.
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 master1.png
    
    $ git push
    
    warning: push.default is unset; its implicit value is changing in
    Git 2.0 from 'matching' to 'simple'. To squelch this message
    and maintain the current behavior after the default changes, use:
    
      git config --global push.default matching
    
    To squelch this message and adopt the new behavior now, use:
    
      git config --global push.default simple
    
    When push.default is set to 'matching', git will push local branches
    to the remote branches that already exist with the same name.
    
    In Git 2.0, Git will default to the more conservative 'simple'
    behavior, which only pushes the current branch to the corresponding
    remote branch that 'git pull' uses to update the current branch.
    
    See 'git help config' and search for 'push.default' for further information.
    (the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
    'current' instead of 'simple' if you sometimes use older versions of Git)
    
    Counting objects: 4, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (3/3), 1.18 MiB | 257.00 KiB/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To https://github.com/kr-zephyr/MBTest.git
       82a3ebc..b0fd2f1  master -> master 
    


    빨간색은 입력된 명령어 입니다.

    메시지가 많이 나오지만 일단 무시....

    github의 network에 들어가 보면....






    요렇게 파일이 추가된 것을 확인할 수 있습니다.




    3. branch 만들기


    이제 본격적으로 branch를 만들어 봅시다.

    branch는 총 2개를 만들 것이며, 각각 다른 파일을 올릴 겁니다.



    $ git branch mbtest1
    


    간단하게 위의 명령어로 local에는 mbtest1이라는 branch가 만들어졌습니다.

    요 녀석을 이제 remote에 push 합니다.



    $ git push origin mbtest1
    
    Total 0 (delta 0), reused 0 (delta 0)
    To https://github.com/kr-zephyr/MBTest.git
     * [new branch]      mbtest1 -> mbtest1
    


    branch를 push할 때는 origin {branch명} 으로 push해야 합니다.





    github의 network을 보면.... 이렇게 mbtest1이라는 branch가 master의 소스를 기반으로 추가된 것을 볼 수 있습니다.

    이제 mbtest1에 파일을 추가할 겁니다.


    우선 작업 영역을 mbtest1으로 변경합니다.

    작업 영역은 checkout이란 명령으로 변경할 수 있습니다.


    $ git checkout mbtest1
    
    $ ls
    
    README.md	master1.png
    
    $ ls
    
    README.md	master1.png	mbtest1-1.png
    


    mbtest1-1.png라는 파일을 추가했습니다. master에서 master1.png를 추가한 것처럼 add -> commit을 거쳐 push 합니다.



    $ git add mbtest1-1.png
    
    $ git commit mbtest1-1.png
    
    [mbtest1 4a735a1] mbtest1 branch에 파일을 하나 추가합니다.
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 mbtest1-1.png
    
    $ git push
    
    warning: push.default is unset; its implicit value is changing in
       ...
    Counting objects: 3, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (2/2), 341 bytes | 0 bytes/s, done.
    Total 2 (delta 0), reused 0 (delta 0)
    To https://github.com/kr-zephyr/MBTest.git
       b0fd2f1..4a735a1  mbtest1 -> mbtest1
    




    자.... 또 network을 구경하러 가봅니다.




    위에서 master와 같은 라인에 있던 mbtest1이 우측으로 이동했습니다!!!

    좌측은 history 상에서 예전 것, 우측은 최신 것으로 보시면 됩니다.

    시간이 흐름에 따라 push가 늘어가면 우측으로 계속 선이 늘어날 것이며, 다수의 branch를 운영 중인 경우 가장 우측에 위치한 branch가 가장 최근에 수정된 것으로 판단하면 됩니다.


    이제 master를 기반으로 branch를 하나 더 만들어 볼겁니다.



    $ git checkout master
    
    Switched to branch 'master'
    Your branch is up-to-date with 'origin/master'.
    
    $ ls
    
    README.md	master1.png
    
    $ git branch mbtest2
    
    $ git push origin mbtest2
    
    Total 0 (delta 0), reused 0 (delta 0)
    To https://github.com/kr-zephyr/MBTest.git
     * [new branch]      mbtest2 -> mbtest2
    
    $ git checkout mbtest2
    
    Switched to branch 'mbtest2'
    
    $ ls
    
    README.md	master1.png
    
    $ ls
    
    README.md	master1.png	mbtest2-1.png
    
    $ git add mbtest2-1.png
    
    $ git commit mbtest2-1.png
    
    [mbtest2 748ed23] mbtest2 branch에 파일을 하나 추가합니다.
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 mbtest2-1.png
    
    $ git push
    
    warning: push.default is unset; its implicit value is changing in
       ...
    Counting objects: 4, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (2/2), done. 
    Writing objects: 100% (2/2), 285 bytes | 0 bytes/s, done.
    Total 2 (delta 1), reused 0 (delta 0)
    To https://github.com/kr-zephyr/MBTest.git
       b0fd2f1..748ed23  mbtest2 -> mbtest2
    


    후하..... 뭔가 많이 한거 같죠?

    위에 branch1하고 동일한 작업을 한 겁니다.

    자세한 내용은 아래와 같습니다.


    master로 작업 영역을 변경한다.

    mbtest2 branch를 만든다.

    push한다.

    파일을 하나 추가한다.

    local에 add -> commit한 후 remote에 push한다.


    이제 또......




    network을 보면 요렇게 mbtest2 branch가 생성되고 파일이 추가되어서 history가 가장 우측으로 이동한 것을 볼 수 있습니다.


    branch는 요렇게 만드시면 됩니다.........




    4. merge 해보기


    이제 merge를 해보죠.


    merge의 기본 개념은....


    지금 사용하고 있는 작업 영역에 다른 branch를 합친다.

    merge된 작업 영역은 merge해온 작업 영역의 모든 변경사항을 가진다.


    입니다.


    즉, master 생성 이후에 mbtest1의 변경사항이 있었고, master에 mbtest1을 merge한다면 mbtest1의 모든 변경사항을 master도 가지게 된다 입니다.


    우선은 master에 mbtest1 branch를 합쳐볼껀데요.


    그러기 위해서는 master로 작업 영역을 이동해야 합니다.



    $ git checkout master
    
    Switched to branch 'master'
    Your branch is up-to-date with 'origin/master'.
    


    그리고 아래처럼 merge 명령을 줍니다.



    $ git merge mbtest1
    
    Updating b0fd2f1..4a735a1
    Fast-forward
     mbtest1-1.png | Bin 0 -> 1239257 bytes
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 mbtest1-1.png 
    
    $ git push
       ...
    


    remote에 push까지 한 후.... 또또또 network을 보면....






    요렇게~ master가 mbtest1 위치까지 이동한 것을 볼 수 있습니다.


    다음은 branch 간의 merge를 해봅니다.

    저는 mbtest2에 mbtest1을 합쳐 볼겁니다.


    아래처럼 다시 mbtest1으로 작업 영역을 변경한 후에....


    $ git checkout mbtest1
    
    Switched to branch 'mbtest1'
    


    그리고 저~~어~~~어~~~~기 위에 파일 추가한 것 처럼 파일을 하나 추가하고 local에 add -> commit, remote에 push 합니다.

    (자세한 명령어는 생략한다! -> 귀찮아서 그러는거 아니예요;;;)




    결과는 요렇습니다. 당연히 가장 최근에 수정된 mbtest1이 가장 우측으로 이동합니다.


    이제 mbtest2에 mbtest1을 합치기 위해 mbtest2로 작업 영역을 변경합니다.


    $ git checkout mbtest2
    
    Switched to branch 'mbtest2'
    


    그리고 merge 명령을 합니다.



    $ git merge mbtest1
    
    Merge made by the 'recursive' strategy.
     mbtest1-1.png | Bin 0 -> 1239257 bytes
     mbtest1-2.png | Bin 0 -> 1239257 bytes
     2 files changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 mbtest1-1.png
     create mode 100644 mbtest1-2.png
     
    $ git push
    



    network를 보면....



    요렇게!! mbtest1에서 mbtest2로 연결선이 생긴걸 볼 수 있습니다.

    아까 master에 mbtest1을 merge할 때는 이런 선이 없었는데 생겼죠??

    master는 가장 기본이 되는 소스이기 때문에 merge에 따른 연결선이 표현되지 않습니다. 하지만 branch 간의 merge는 이렇게 연결선으로 표현되고 있습니다. (git client 툴에 따라서 master에도 연결선이 표현되는 툴들이 있습니다. 위 그래프는 github에 한해서라는 것 기억하세요.)


    이제 mbtest2는 mbtest1의 모든 변경 사항을 가지게 됩니다.

    각각 mbtest1과 mbtest2에 변경사항이 발생되면.....





    요렇게 서로 각자의 길을 가게 되죠.



    5. 끝!


    이것으로 git에서 브랜치(branch) 따고 머지(merge)해보기(날림 버전)를 마무리 합니다;;;;;

    이 포스팅은 향후에 보강.......(될지도 모르고 안)될지도 모릅니다. :)


    혹시 궁금하신 내용이 있으시면..... 책 찾아보세ㅇ........ pro git이라는 좋은 무료 전자책도 있.......

    댓글

Designed by Tistory.