여러 사람이 동일한 소스코드를 기반으로 서로 다른 작업을 할 때에는 각각 서로 다른 버전의 코드가 만들어 질 수 밖에 없습니다. 이런 경우, 여러 개발자가 동시에 서로 다른 작업을 할 수 있게 만들어 주는 기능이 바로 '브랜치(Branch)' 입니다.
협업을 하는 상황 뿐만 아니라, 기존의 소스 코드를 해치지 않으면서 다른 작업을 시도해보고 싶을 때에도 이 브랜치 기능을 활용할 수 있습니다.
feature 브랜치를 만들어서 원하는 기능을 구현할 수 있습니다. 그리고 feature 브랜치에서 완성한 코드를 기존 소스 코드에 반영해도 문제가 없다면, 그 때 병합(merge) 할 수 있습니다.
브랜치 기능을 활용하면, 코드를 통째로 복사한 후 원래 코드가 변경될 우려 없이 독립적으로 개발할 수 있습니다.
다시 말해, 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있습니다.
master 또는 main 이라는 이름을 가진 통합 브랜치에 뿌리를 두고, 각각의 브랜치가 갈라져 나오고 있는 모습입니다.
이렇게 나누어진 브랜치에서는 각자 독립적인 작업 영역(저장소) 안에서 마음대로 소스코드를 변경할 수 있습니다. 분리된 작업 영역(브랜치)에서 변경된 내용들은 다른 브랜치와 병합(Merge)함으로써 다시 새로운 하나의 브랜치로 모을 수 있습니다.
아래 그림을 통해, 브랜치를 사용하여 동시에 여러 작업을 진행할 때의 작업 흐름을 한 눈에 파악할 수 있습니다.
여러 명이 동시에 작업할 때 먼저 통합 브랜치에서 자신의 전용 브랜치를 만듦 -> 독립적으로 작업을 진행한 후 그 결과를 하나로 모아 나감 -> 브랜치로 작업의 내용들이 모두 기록됨 -> 문제가 생겼을 때 원인이 되는 작업을 찾아내거나 그에 따른 대책을 세우기 쉬움
통합 브랜치 (Integration Branch)
배포될 소스 코드가 기록되는 브랜치. Github Repository를 생성하게 되면 기본적으로 main 브랜치가 생깁니다. (기존 Repository의 경우 master로 되어 있는 곳도 많습니다.)
해당 프로젝트의 모든 기능이 정상적으로 작동하는 상태의 소스코드가 담겨 있습니다.
피처 브랜치 (Feature Branch)
기능 추가, 버그 수정과 같이 단위 작업을 위한 브랜치.
통합 브랜치로부터 만들어내며, 피처 브랜치에서 하나의 작업이 완료가 되면 다시 통합 브랜치에 병합하는 방식으로 진행된다. 토픽 브랜치라고도 합니다.
브랜치 명령어 모음
새로운 브랜치 생성:
git branch 새로운 브랜치 이름
새로운 브랜치 생성 후 해당 브랜치로 전환:
git switch -c 새로운 브랜치 이름
git checkout -b 새로운 브랜치 이름
브랜치 목록 확인
git branch
브랜치 목록과 각 브랜치의 최근 커밋 확인
git branch -v
브랜치 삭제
git branch -d 삭제할 브랜치 이름
git branch -D 해당 명령어는 병합하지 않은 브랜치를 강제 삭제하는 방법입니다.
브랜치 전환
git switch 브랜치 이름
git checkout 브랜치 이름
브랜치 병합
master 브랜치로 dev 브랜치를 병합할 때 (master <- dev)
git checkout master
get merge dev
로그에 모든 브랜치를 그래프로 표현
git log --branches --graph --decorate
아직 commit 하지 않은 작업을 스택에 임시로 저장
git stash
프로젝트 workflow
프로젝트를 위해 git을 활용하려면 어떻게 해야 할까요?
Fork, Clone
팀원들과 함께 나누어 작업을 하기 위해서 각자의 Remote Repository로 Fork를 하도록 하겠습니다. 그리고 Local에서 작업하기 위해서 git clone 명령어로 Repository를 Local에 가지고 왔습니다.
기본적인 개발을 진행하는 과정에서는 main 브랜치가 아닌 dev 브랜치를 하나 만들어서 작업을 하는 경우가 많습니다. dev 브랜치를 만들어서 해당 브랜치로 이동해 보겠습니다.
여기서 HEAD는 현재 위치의 커밋을 가리킵니다. 즉 현재 작업중인 커밋입니다.
git checkout -b dev 명령어를 통해서 dev 브랜치를 생성했습니다. (git switch -c dev 명령어도 가능)
Remote Repository에도 생성한 브랜치를 반영하기 위해서는 git push origin dev 명령어를 입력해 주셔야 합니다.
브랜치가 잘 생성되었는지 확인하고 싶다. 생성한 브랜치의 목록과 내가 현재 dev 브랜치에 있는 것이 맞는지 확인해 볼 방법은 없을까요? 바로 git branch 명령어를 통해 확인할 수 있습니다.
팀 프로젝트에 들어가기 앞서 회의를 통해 하나의 기능을 구현할 때는 'feture/기능이름'이라는 브랜치를 만들어서 작업하기로 정했습니다. 로그인 기능을 구현하기 위해서 feature/login 이라는 브랜치를 생성해 보도록 하겠습니다.
git checkout -b feature/login
git switch -c feature/login
feature/login 브랜치를 생성하고 feature/login 브랜치로 이동
소셜로그인 기능을 추가하고 싶을 때 이미 만들어 놓은 로그인 코드를 건드리지 않고 새로운 브랜치를 하나 더 만들어서 작업할 때:
git checkout -b feature/login-oauth
feature/login-oauth 브랜치를 생성하고 feature/login-oauth 브랜치로 이동
feature/login-oauth에 있는 코드를 feature/login 브랜치로 병합(merge) 할 수 있는 방법:
먼저 git checkout(switch) feature/login 명령어를 통해 feature/login 브랜치로 이동한다.
git checkout feature/login (git switch feature/login) 명령어를 입력했습니다. merge하기 위해서는 먼저 병합이 될 브랜치로 이동을 해야 합니다.
현재 위치가 feature/login 인 상태에서 git merge feature/login-oauth 명령어를 입력하세요.
git merge 병합할 브랜치 이름
feature/login-oauth 브랜치가 머지되기 전 feature/login 브랜치에 추가적인 커밋이 없으므로, 브랜치가 분기될 필요가 없습니다. 그러므로 자동적으로 fast-forward 방식으로 병합이 이뤄집니다.
fast-forward 방식이란 별도의 커밋을 생성하지 않고 feature/login 브랜치가 가리키는 커밋을 feature/login-oauth가 생성한 커밋으로 바꾸는 작업을 말합니다.
만일, feature/login 브랜치에 별도의 커밋이 있었다면, fast-forward가 아닌 merge commit 방식으로 병합되었을 것입니다. 이는 각 브랜치가 줄기처럼 분기한 후, 병합의 모양새를 가집니다.
git merge feature/login-oauth 명령어를 입력해 해당 브랜치를 현재 위치한 브랜치로 병합(merge) 할 수 있습니다.
merge:
변경 내용의 이력이 모두 그대로 남아 있기 때문에 이력이 복잡해 집니다.
rebase:
말 그대로 branch base를 이동시킨다는 뜻으로, 머지처럼 브랜치 통합을 목적으로 하지만, 특정 시점으로 브랜치가 가리키는 곳을 변경하는 기능을 합니다.
그림에서 보이는 것과 같이 feature/login 브랜치에서 git rebase main feature/login 명령어를 입력하면 main의 가장 최신 커밋으로 브랜치가 가리키는 곳이 변경됩니다. (main의 다른 커밋에서 충돌이 없을 경우)
git push origin feature/login
Remote Repository로 업로드하기
로컬의 작업한 내용을 Remote Repository에 업로드하기 위해서는 push를 해야 합니다.
로컬의 변경 사항을 Remote Repository로 업로드 하기
git push origin feature/login 명령어를 입력해 해당 브랜치를 Remote Repository로 업로드할 수 있습니다.
Pull Request:
내가 Push한 변경 사항에 대해서 다른 사람들에게 알리는 것
feature/login 브랜치의 변경 사항을 다른 팀원들과 함께 코드 리뷰를 하고 dev 브랜치에 적용하고 싶습니다. Github의 Pull Request 기능을 활용해 dev 브랜치로의 반영을 요청할 수 있습니다. 리뷰가 끝난 코드는 브라우저에서도 dev 브랜치로 merge 할 수 있습니다.
간단하게 PR 내용을 입력한 후 Create pull request 버튼을 클릭한다.