300x250

 

목차

     

    연구를 하다보면 필연적으로 협업을 하게 되는데, git을 활용하면 main branch를 나누어 팀원들이 각자 branch를 파서 맡은 부분을 구현하고, main에 merge하는 것(합치는 것)이 안전하다. (개발을 할 때에는 issue를 다루기 위해 사용하기도 하는데, 이는 gitflow를 다루 때 자세히 알아보기로 한다.)

    이번 포스팅에서는 브랜치를 만들고, 로컬에서 기본 브랜치를 설정 및 변경하는 방법을 알아보려 한다.

     

     

     

     

    Git branch 주요 명령어

     

    git branch

    이 명령어는 다양한 옵션을 통해 branch 생성, 제거, 상태 확인 등을 할 수 있는 명령어이다. (remote repository 브랜치의 생성은 경우 github에서 'new branch'를 눌러 더 직관적으로 할 수 있다.)

    아무 옵션을 주지 않으면 '-l'이 생략된 것으로, 로컬의 branch 정보(remote repository의 branch 정보가 아님에 유의하자!)를 보여준다.

     

    Fig 1. git branch result

     

    옵션에 따른 다양한 명령어를 살펴보자.

     

    -v

    git branch -v

    로컬 branch들의 마지막 커밋 내역을 보여준다.

     

    -r

    git branch -r

    Remote repository의 branch 정보를 보여준다.

     

    -a (★★★)

    git branch -a

    Local, remote repository의 모든 branch 정보를 보여준다.

    Local branch는 이름만, remote branch는 'remotes/origin/...'와 같은 형식으로 표시된다.

     

    Merge된 branch, merge되지 않은 branch 표시

    git branch --merged
    git branch --no-merged

    merge된(--merged)/merge되지 않은(-no-merged) 브랜치를 표시한다.

     

     

     

     

     

     

    브랜치 생성, 이동, 이름 변경

     

    git branch [로컬브랜치명]
    git push origin [리모트브랜치명]

    '로컬브랜치명'에 해당하는 새로운 branch를 로컬에 생성한다. Remote branch는 push 명령어로 생성할 수 있다.

     

    git checkout [로컬브랜치명]
    git checkout -b [로컬브랜치명]
    git checkout -b [로컬브랜치명] [리모트브랜치명]

    가장 기본적으로, (이미 생성된) '로컬브랜치명' 브랜치로 이동한다.

    -b 옵션을 줄 경우, 생성과 동시에 해당 branch로 이동한다.

    '리모트브랜치명'도 입력해줄 경우, remote repository의 해당 브랜치와 연결된 '로컬브랜치명' 브랜치를 로컬에 생성하고, 이동한다.

     

    예를 들어, A, B 컴퓨터에서 main 브랜치로만 작업을 하다가, A 컴퓨터에서 'ex'라는 branch를 새로 만들고, 이와 연결된 'example'이라는 remote branch를 생성했다고 하자. 즉, A 컴퓨터에서의 local branch는 'main', 'ex'이고, remote branch는 'main', 'example'이다. 이때, B 컴퓨터에서는 git branch -a 명령어를 쳐보면 'ex'라는 로컬 브랜치는 물론, 'example'이라는 remote branch도 뜨지 않는다.

    여기서 B 컴퓨터도 A 컴퓨터와 같은 환경이 되기 위해서는, git remote update로 remote branch 상황을 업데이트 해준 후, git checkout -b ex remotes/origin/example 명령어를 실행하면 A 컴퓨터와 같은 세팅이 된다. (remote branch -a로 확인해보면, 정확한 remote branch의 이름에는 "remotes/origin/"이 들어간다.)

     

    git branch -m [변경할 브랜치명] [변경될 브랜치명]

    로컬의 '변경할 브랜치명' 브랜치를 '변경될 브랜치명' 브랜치로 이름을 변경한다.

    옵션으로 -M을 사용할 경우, 기존에 동일한 이름의 branch가 있어도 덮어쓴다.

     

    현재 브랜치에서 commit하지 않은 변경 사항을 새로운 branch로 옮겨 작업하고 싶을 때가 있다. 그럴 때는 아래와 같이 stash 명령어를 사용한다. stash는 마무리하지 않은 작업을 스택에 잠시 저장하는 명령어이다. 완료하지 않은 일을 commit하지 않고 나중에 stash pop 명령어로 꺼내올 수 있는데, 이를 이용하여 다른 브랜치로 변경 사항을 옮길 수 있다.

    git stash --include-untracked
    git checkout -b [다른 로컬 브랜치]
    git stash pop

    --include-untracked는 track되지 않은 파일, 즉 새로 생성된 파일까지 모두 스택에 저장하는 옵션이다. 옵션을 주지 않으면 새 파일은 옮겨지지 않고 수정된 파일만 저장된다.

    checkout으로 '다른 로컬 브랜치'를 생성한 후 이동하며, 그곳에서 stash pop을 통해 스택에 저장된 변경 사항을 불러온다. 기존 로컬 브랜치에는 변경 사항이 사라지게 된다.

     

     

     

    브랜치 삭제

     

    git branch -d [로컬브랜치명]
    git push origin -d [리모트브랜치명]

    로컬 브랜치 혹은 리모트 브랜치를 삭제한다. 로컬 브랜치의 경우, 아직 commit merge를 하지 않았다면 삭제되지 않는데, 이때 -D 옵션으로 강제 삭제할 수 있다.

     

     

     

     

     

     

    Remote와 local branch 연결

     

    로컬의 branch와 remote repository의 branch의 연결과 관련된 명령어를 알아보자.

     

    git fetch origin

    원격 저장소(origin)의 변경 사항을 확인한다. 사실 git pull 명령어는 git fetch와 git merge가 합쳐진 명령어이다. 즉 변경 사항(최신 데이터)을 복사하여 로컬 git에 가져온다.

    원격 저장소에 변경 사항이 존재하는 상황에서 pull을 바로 실행할 경우, 현재 브랜치와 작업 복사본의 파일이 변경되는 동시에 새로 작업한 내용은 손실될 수 있다. 따라서 fetch로 변경 사항을 먼저 확인한 후에 pull을 실행하자.

     

    git branch -u origin/[리모트브랜치명] [로컬브랜치명]
    git branch --set-upstream-to origin/[리모트브랜치명]

    로컬의 '로컬브랜치명' 브랜치(혹은 현재 로컬 브랜치)가 'origin' remote repository의 '리모트브랜치명' 브랜치를 트래킹하도록 설정한다. 쉽게 말해 local 브랜치를 remote 브랜치와 연결해주는 과정이다.

     

    예를 들어, local에서 새로운 branch "test_branch"를 생성하고, 같은 이름의 branch를 remote에도 생성한 후, 연결하려면 아래의 순서대로 명령어를 입력한다.

    git checkout -b test_branch # 로컬 브랜치 "test_branch" 생성 후 해당 브랜치로 이동
    git push origin test_branch # 리모트 브랜치 "test_branch" 생성
    git branch --set-upstream-to origin/test_branch # 현재 브랜치("test_branch")를 리모트 브랜치 "test_branch"와 연결

     

    결과 예시는 다음과 같다.

    Fig 2. Result of the connection between local branch and remote branch

     

     

     

     

    브랜치 병합

     

    브랜치의 내용을 서로 병합하고싶은 경우가 있다. (local에서 병합 후 remote에는 내용이 변경된 branch에서 push만 해주면 되므로, 로컬에서의 병합만 다루도록 한다.)

    일반적으로는 다른 branch들에서 작업한 내용을 main에 병합하는 경우가 많다. 예를 들어,

    git checkout main # 병합 "받을" branch로 이동
    git merge ex # 작업한 branch

    와 같이, main branch에 작업한 내용을 옮기는 경우가 많다. push해주면 remote branch에도 적용된다.

     

    728x90
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기