ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Git] 브랜치 (branch) 다루기
    저장소/git 2019. 12. 8. 19:37

    앞에서 커맨드를 사용해 저장소 생성, 커밋, 푸쉬하는 법을 다뤘습니다. 여기서는 브랜치 생성, 머지하는 방법을 설명합니다.

    브랜치 확인

    명령어를 통해 현재 어떤 브랜치가 있고 활성화된 브랜치가 무엇인지 확인할 수 있습니다.

    $ git branch=
    
    * master
    (END)


    현재 master 브랜치만 존재합니다. *가 붙어있는 브랜치가 현재 활성화된 브랜치라고 볼 수 있습니다.


    옵션 -v를 추가하면 브랜치마다 마지막 커밋 메시지를 확인할 수 있습니다.

    $ git branch -v
    
    * master 48fc51f [ahead 1] test2
    (END)


    원격 저장소의 브랜치를 확인하려면 -r 옵션을 추가하면 됩니다.

    $ git branch -r
    
      origin/HEAD -> origin/master
      origin/master
    (END)


    또한 현재 활성화된 브랜치를 기준으로 머지가 된 브랜치인지 아닌지 확인할 수 있습니다. 이 예를 들기 위해, test라는 브랜치에서 별도의 작업 후 커밋까지 완료를 했습니다.

    $ git branch --merged
    
    * master
    (END)


    test 브랜치에서의 작업 내용이 현재 master 브랜치에 머지가 되지 않아서 리스트에 나오지 않습니다. 위 명령어와 반대로 머지가 되지 않은 리스트 조회는 아래와 같이 요청합니다.

     $ git branch --no-merged
    
     test
    (END)


    위 test 브랜치는 머지가 되지 않은 목록으로 조회가 가능합니다.

    브랜치 삭제

    현재 활성화된 브랜치를 제외하고 삭제를 진행할 수 있습니다.

    $ git branch
    
    * master
      test
      test1
    (END)
    
    $ git branch -d test1
    
    Deleted branch test1 (was 48fc51f).
    
    $ git branch
    
    * master
      test
    (END)


    test1은 현재 활성화된 브랜치와 코드가 동일하므로 삭제가 되지만 test 브랜치는 master브랜치와 머지가 되지 않아 해당 명령어로 삭제를 진행하면 에러 메시지를 출력합니다.

    $ git branch -d test
    
    error: The branch 'test' is not fully merged.
    If you are sure you want to delete it, run 'git branch -D test'.


    위 설명처럼 강제로 삭제하려면 -D 옵션을 사용해야 합니다.

    $ git branch -D test
    
    Deleted branch test (was 3d1be1a).

    브랜치 생성

    브랜치 생성 방법은 2가지가 있습니다.


    브랜치를 생성한 다음, 생성한 브랜치로 이동하는 방법은 아래와 같습니다.

    $ git branch test
    $ git checkout test
    
    Switched to branch 'test'


    checkout 의 옵션인 -b를 사용해 생성 후, 바로 이동하도록 할 수 있습니다.

    $ git checkout -b test1
    
    Switched to a new branch 'test1'

    브랜치 머지하기

    git merge

    머지란 다른 브랜치의 변경점을 현재 활성화된 브랜치에 합치는 의미입니다. 만약 활성화된 브랜치에 다른 브랜치를 머지하고 싶으면 아래와 같이 진행합니다.

    $ git merge test
    
    Updating de1f0ad..be3a368
    Fast-forward
     test.txt | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)


    만약 머지를 하기 전, 변경사항을 확인하고 싶으면 아래와 같이 진행합니다.

    $ git merge master test
    
    diff --git a/test.txt b/test.txt
    index 7d3340a..4439738 100644
    --- a/test.txt
    +++ b/test.txt
    @@ -1,2 +1 @@
     머지 테ㅡ트
    -test2에서 test1을 <S-F6마스터에서:
    (END)


    master 브랜치에서 test 브랜치를 머지하면 test2에서 test1을 <S-F6마스터에서:  문장이 제거된다는 의미입니다.


    머지가 완료되면 원격 저장소에 아래와 같이 반영합니다.

    $ git push origin master
    
    Counting objects: 12, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (9/9), done.
    Writing objects: 100% (12/12), 1.02 KiB | 523.00 KiB/s, done.
    Total 12 (delta 0), reused 0 (delta 0)
    To https://github.com/brownbears1/test.git
       6acb1a3..3262bf7  master -> master

    git rebase

    rebase를 사용하여 두 브랜치를 합칠 수 있습니다. rebase는 merge와 다르게 한 줄로만 커밋 메시지를 출력할 수 있습니다. 또한 master 브랜치에 test1 브랜치를 합친다 하면 아래와 같은 순서로 진행해야 합니다. 

    $ git checkout test1
    $ git rebase master
    
    First, rewinding head to replay your work on top of it...
    Applying: rebase 테스트
    
    $ git checkout master
    $ git rebase test1
    
    First, rewinding head to replay your work on top of it...
    Fast-forwarded master to test1.


    rebase는 말 그대로 base 브랜치를 재구축하는 형태입니다. 위에서 test 브랜치를 활성화하고 rebase master를 진행하면 'master 브랜치를 바탕으로 현재 브랜치를 재구축' 이라는 의미입니다. 


    merge와 rebase의 차이점

    $ git log --graph


    위 명령으로 브랜치의 커밋이나 머지를 그래프로 확인할 수 있습니다. 

    아래는 merge 후 출력한 이미지 입니다.

    master에서 test브랜치가 생성된 후, 'meerge test'라는 커밋 메시지로 커밋이 되었습니다. 이후 master 브랜치로 머지가 된 것을 확인할 수 있습니다. 여기서 보다시피 브랜치의 파생된 내역을 전부 확인할 수 있습니다.


    반면 rebase를 진행하면 아래와 같이 보입니다.


    rebase를 진행하면 브랜치의 base를 재구축하여 하나로 합치므로 브랜치의 파생내역을 볼 수 없습니다. 

    위는 test1 브랜치에서 master 브랜치로 rebase한 다음, master에서 머지를 한 결과입니다. test1 브랜치에서 rebase를 한 시점에서 test1 브랜치가 master의 최신 커밋을 기반으로 재구축했기 때문에 위와 같은 순서를 보여줍니다. 이후, master 브랜치에서 test1브랜치를 merge 명령어로 합친다 해도, test1 브랜치의 base가 동일하기 때문에 1개의 라인으로 커밋 메시지를 확인할 수 있습니다.

    댓글