ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • git 명령어: git branch
    소프트웨어 개발 툴 2019. 2. 1. 14:53

      지난번 포스트에서 git cherry-pick에 대하여 설명했다. cherry-pick에 대한 포스트를 작성 한 후 곰곰히 생각해보니 git에 대해 조금 더 이야기 하는 것도 나쁘지않을 것 같아 git기본부터 포스팅 해 보려고 한다. 어쩐지 순서가 뒤죽박죽이지만 개의치 않기로 하자. 오늘은 브랜치에 대해 설명 해 보도록 하겠다. 혹시 깃허브를 이용하고 깃허브 master branch, 깃허브 merge, 깃허브 checkout, 깃허브 branch 삭제등등 깃허브와 관련되어 모르는게 있어더라도 이 블로그를 통해서 배울 수 있다. 깃허브도 자체로는 깃을 사용하기 때문이다. 이 포스트에서도 깃허브 리파지토리를 사용한다. 

    들어가기 전에

    실습을 할 예정이라면 깃 리파지토리를 미리 준비하라. 만약에 실습은 하고 싶은데 깃 리파지토리는 만들고 싶지 않다면 연습용 깃헙을 사용하라. 어떻게 사용하는지 Git과 Github 튜토리얼, Github 오픈소스 프로젝트 참여하기의 Fork와 Clone부분을 참고하길 바란다. 여러분이 엉망진창으로 내 깃헙을 사용해도 괜찮다. 

    Branch

     

     브랜치란 아주 간단히 말하면 어떤 코드의 복사본이다. 위의 그림을 보자. 까만 실선은 브랜치를 나타내고 동그라미는 커밋을 나타낸다.위의 리파지토리에는 master, feature-1, feature2 이렇게 세 개의 브랜치가 존재한다. 자 여러분이 어떤 팀에 속해있고 팀원은 여러분을 포함해 두 명이라고 쳐보자. 팀장이 git repository를 만들고 *master브랜치를 만들어 올렸다. 여러분은 이제 코딩을 해야하는데 master에 있는 코드를 수정하고 저장하는 것은 위험하다. 돌아가지도 않는 코드가 섞였다가 출시되기라도 하면 낭패이기 때문이다. 따라서 여러분은 master의 복사본을 가져와서 그 복사본을 수정하고, 나중에 변경된 부분만 master로 다시 옮기고 싶을 것이다. 이 시나리오에서 복사하는 부분이 바로 branch에 해당한다.


    *master 브랜치는 보통 리파지토리를 만든 후 가장 처음 올린 코드의 브랜치 이름이다. 반드시 master일 필요는 없지만 보통 이 브랜치의 코드들은 검증된 코드이다.

    git branch 명령어

    branch 리스트

    git branch git branch --list

    git branch나 git branch --list명령어로 현재 리파지토리의 브랜치 목록을 확인 할 수 있다.

    feature-1
    feature-2
    * master
    (END)

    <위의 그림에서 설명한 리파지토리의 브랜치 목록>

    명령어를 치면 위처럼 브랜치 목록이 뜰 것이다. :q를 눌르면 빠져 나갈 수 있다. 여기서 앞에 *이 붙어있는 브랜치가 지금 현재 당신 코드의 브랜치 이름이다. 위의 출력화면에서는 현재 master 브랜치 위에 있음을 확인 할 수 있다. 

    브랜치 생성

    로컬 브랜치 생성

    이제 master에서 branch-off해보자 명령어는 다음과 같다.

    git branch <branch_name>

    git branch feature-3

    위의 명령어를 이용해 feature-3브랜치를 만들어 보자. 다시 git branch를 이용해 리스트를 확인 해 보면 branch가 생성된 것을 확인 할 수 있다.

    feature-3
    feature-2
    feature
    -1
    * master

    자 여기까지 했다면 브랜치를 만드는 데 성공 한 것이다. 이제 코딩을 시작해도 되는가? 그렇지 않다. 위를 보고 예상 할 수 있겠지만 여러분은 아직도 master브랜치에 있다. 따라서 여러분은 새로만든 브랜치로 이동해야 한다. 체크아웃을 할 때는 

    git checkout <branch_name>

    을 이용한다. 이 예제에서는 아래와 같다.

    git checkout feature-3
    Switched to branch 'feature-3'

    checkout명령어를 이용해 feature-3브랜치로 이동했다. git branch명령어를 통해 현재 브랜치가 이동되었는지 확인하자.

    * feature-3
    feature-2
    feature
    -1
    master

    그렇다면 매번 이렇게 branch-off하고 싶은 브랜치를 checkout한 후 git branch <branch_name>을 한 후 git checkout <branch_name>으로 이동해야 하는가? 아니다 더 간편한 방법이 있다. 아래처럼 checkout에 -b옵션을 이용하는 것이다. 이 명령어의 뜻은 <branch_name>을 생성 후 그 브랜치를 checkout하라는 뜻이다.

    git checkout -b <branch_name>

    git checkout -b feature-3

    현재 상황은 아래의 그림과 같다.


     


    branch off 할 브랜치(base branch라고 한다)가 현재 브랜치가 아닐 때 다음과 같은 명령어를 사용 할 수 있다.

    git checkout -b <branch_name> <base_branch_name>

    예를 들어 우리 예에서는 다음처럼 사용 할 수 있다. feature-1에서부터 feature-4를 브랜치 한 후 feature-4를 checkout하라는 뜻이다..

    git checkout -b feature-4 feature-1

    현재 상황은 이러하다.

    리모트 브랜치 생성(푸시)

    자 이제 브랜치를 생성하고 작업을 하고 커밋까지 마쳤다고 치자. 여기서 끝인가? 아니다. 여러분은 지금 여러분의 '로컬'리파지토리에 '로컬'브랜치를 만든것이기 때문에 리모트에 있는 깃 리파지토리는 새로 생긴 리파지토리의 존재를 모른다. 알게 하려면 어떻게 해야 하는가? Push하면 된다. 아래와 같이 push명령어로 upstream즉 깃 리파지토리 서버인 origin으로 해당 브랜치를 업로드 하라는 뜻이다.

    git push --set-upstream origin <branch_name>

    git push --set-upstream origin feature-3

    Total 0 (delta 0), reused 0 (delta 0) remote: remote: Create a pull request for 'feature-3' on GitHub by visiting: remote: https://github.com/fsoftwareengineer/githubtutorial/pull/new/feature-3 remote: To https://github.com/fsoftwareengineer/githubtutorial.git * [new branch] feature-3 -> feature-3 Branch 'feature-3' set up to track remote branch 'feature-3' from 'origin'.

    이렇게 하고 나면 여러분의 리모트 깃 리파지토리에 여러분의 코드를 담은 새 브랜치가 생성되었을 것이다. 

    브랜치 삭제

    로컬 브랜치 삭제

    이제 브랜치 삭제에 대해 알아보자. 아래의 명령어는 당신의 브랜치가 merge된 경우 브랜치를 삭제 해 준다. 개발을 바치고 브랜치를 정리 할 때 쓰면 좋다.

    git branch -d <branch_name>

    우리의 예제에서 나온 feature-3브랜치를 아래 명령어로 삭제했다.

    git branch -d feature-3 Deleted branch feature-3 (was 8a2b5b7).

    만약 내가 지금까지 커밋한게 머지되지 않았지만 그냥 다 필요 없고 지워버리고 싶다면 대문자 -D옵션을 사용한다.

    git branch -D <branch_name>

    우리의 예제에서 나온 feature-4브랜치를 아래 명령어로 삭제했다.

    git branch -D feature-4
    Deleted branch feature-4 (was 8a2b5b7).

    리모트 브랜치 삭제

    끝인가? 아니다!! 브랜치를 생성 할 때 마지막에 뭘 했는지 기억해라. 리모트 브랜치로 푸시하지 않았는가?! 여기서도 마찬가지이다. 여러분은 로컬 리파지토리의 로컬 브랜치를 삭제 한 것이시 실제 삭제 내용은 리모트 리파지토리에 전혀 반영되지 않았다. 리모트 리파지토리의 브랜치를 삭제하기 위해 아래의 명령어를 사용해라.

    git push origin --delete <branch_name>

    우리의 예제에서 나온 feature-3브랜치를 리모트 리파지토리에서 지워보도록 하자.

    git push origin --delete feature-3
    To https://github.com/fsoftwareengineer/githubtutorial.git
    - [deleted] feature-3

    다른 명령어들

    브랜치의 이름은 다음과 같이 수정한다.

    git branch -m <branch_name>

    리모트에 있는 브랜치도 전부 보고 싶을 때는 -a 옵션을 사용한다.

    git branch -a

    우리 예제에서는 로컬 브랜치와 리모트 브랜치가 아래처럼 출력된다.

    feature-1
    feature
    -2
    * master
    remotes
    /origin/HEAD -> origin/master
    remotes
    /origin/feature-1
    remotes
    /origin/feature-2
    remotes/origin/master

    여러분... 터미널에 질렸는가? 그렇다면 깃헙 데스크탑이나 소스트리를 사용할 수도 있다. 그리고 지금까지 했던 터미널 용어들의 대부분을 GUI위에서 클릭으로 할 수 있다. 하지만 커맨드라인 사용 방법을 알아두는것이 좋다. 보안때문에 회사에 따라서 GUI버전의 깃을 허용하는 경우도 있고 그렇지 않은 경우도 있기 때문이다.

    <소스트리 예>

    여러분은 이 포스트를 통해 로컬 리파지토리에서 브랜치 생성하는 법, 브랜치를 체크아웃 하는 법, 리모트 리파지토리로 올리는 법, 로컬 브랜치를 삭제하는 법, 리모트 리파지토리를 삭제하는 법등을 알아보았다. 제대로된 팀 개발이라면 브랜치 생성->커밋->푸시->PR->베이스 브랜치로 머지->브랜치삭제의 과정을 전부 거쳐야 한다. 우리 예제에서는 커밋(commit), PR(pull request), 머지(merge)뺴고 전부 다뤘다. 보통 현업에서 팀이 어떻게 깃을 사용하는지 알고 싶다면 이 포스트: Github 오픈소스 프로젝트 참여하기 를 읽어보도록 해라. 또 처음 브랜치를 접하는 독자들은 터미널 명령어들과 그림이 잘 매치되지 않을 수 있다. 이 블로그 또 다른 블로그를 참고하고 실습 해 보며 그래프와 자신의 브랜치들을 잘 상상해 보도록 하자. 모르는게 있거나 더 알고싶은 내용이 있다면 댓글을 남기도록 해라. 



    댓글

f.software engineer @ All Right Reserved