[git] 효율적인 협업을 위한 Git-Flow 이해하기 (사용하는 branch 와 repository 구성)

지수토리·2022년 1월 14일
14

Git

목록 보기
3/3

👨‍👩‍👧‍👦 git flow 란?

➡️ 협업시 브랜치들의 효율적 관리를 위한 브랜치 관리 전략 또는 방법론

🌳 git repository

원격 저장소 (remote repository)

Upstream Repository : 개발자들이 공유하는 저장소로 최신 소스코드가 저장되어 있는 원격 저장소
Origin Repository : Upstream Repository를 Fork한 원격 개인 저장소

로컬 저장소 (local repository)

Local Repository : 내 컴퓨터에 저장되어 있는 개인 저장소

🍆 사용하는 브랜치(branch)

Git-flow에는 5가지 종류의 브랜치가 있다.

master, develop ➡️ 항상 유지되는 메인 브랜치들
feature, release, hotfix ➡️ 일정 기간 동안만 유지되는 보조 브랜치들

⚪️ master : 제품으로 출시될 수 있는 브랜치

tag를 이용해서 버전을 기록한다.
X . 0 : 프로젝트 추가
1 . X : 기능 추가

⚪️ develop : 다음 출시 버전을 개발하는 브랜치

master에서부터 시작된 🍆
상시로 버그를 수정한 커밋들이 추가됨.
어느 시점에 반영이 됐는지 보기 위해서 merge + rebase 를 이용해서 git flow를 예쁘게 본다.

⚪️ feature : 기능을 개발하는 브랜치

develop 에서 갈라져 나온 🍆
git flow를 깔끔하게 보기 위해 origin develop의 갈라나온 시점을 잘 관리해 주어야 한다.
git pull --rebase origin devlop 을 이용해서 제일 마지막에 반영된 develop에서 branch가 갈라 나온 것 처럼 보이게 한다.
작업이 완료되었다면, feature 브랜치는 develop 브랜치로 merge 됨.

⚪️ release : 이번 출시 버전을 준비하는 브랜치

develop 에서 갈라져 나온 🍆
배포 직전에 QA 수정하고, QA를 진행하면서 발생한 버그들은 release 브랜치에 수정됨.
QA 받고 나면 develop과 master에 push한다.
작업이 완료되었다면, release 브랜치를 master와 develop 브랜치로 merge 함.

⚪️ hotfix : 출시 버전에서 발생한 버그를 수정 하는 브랜치

hotfix 에서 수정하고 나면 develop과 master에 push한다.

출처 : 우아한 형제들 기술 블로그

👩‍💻 git flow 작업 방법

1. 개발자는 로컬 저장소를 만든다.

1️⃣ 첫번째 방법: git clone

// 중앙 원격 저장소(remote repository)를 복제
> git clone[중앙 remote repository URL]

2️⃣ 두번째 방법: init -> remote add -> fetch/pull

// 현재 디렉토리를 빈 Git 저장소로 만들기
> git init
// 현재 작업 중인 Git 저장소에 팀의 중앙 원격 저장소(origin)를 추가하기
> git remote add origin [중앙 remote repository URL]
// 중앙 원격 저장소(origin)의 master 브랜치 데이터를 로컬에 가져오기만 하는 작업
> git fetch origin master

✅ fetch와 pull의 차이
fetch : 원격 저장소의 데이터를 로컬에 가져오기만 하는 작업
pull : 원격 저장소의 데이터를 가져와 자동으로 병합까지 하는 작업

2. 로컬 저장소에 devlop 브랜치를 만들어 작업하기

  1. 팀원 중 한명이 로컬 저장소에 빈 develop 브랜치를 만들고, 중앙 저장소로 push하고,

    // develop 브랜치 만들기
    git branch develop
    // 중앙 저장소로 push
    git push -u origin develop

    Github 페이지에서 Pull Request를 함.
    (자신이 push한 develop branch를 병합해달라는 요청)

  1. 프로젝트 관리자는 해당 pull request를 merge 하고,
    develop branch를 default branch로 설정함.

  2. 이제, 팀원들은 작업할 브랜치 만들어 작업하면 됨.
    ex) login 기능을 추가할 브랜치면 [내가 만든 브랜치명]을 feature/login 으로 하면 된다.

    git branch [내가 만든 브랜치명] develop
     git checkout [내가 만든 브랜치명]
    // 위의 두 명령을 합하면
     git checkout -b [내가 만든 브랜치명] develop

3. 개인 작업이 끝나면 develop 브랜치에 병합하기

1️⃣ 첫번쨰 방법: pull request를 이용

  1. 작업한 내용을 push
// 변경된 모든 파일을 스테이징 영역에 추가
> git add . 
// 또는 특정 파일만 스테이징 영역에 추가하기 
> git add [내가 수정한 파일명]

// 커밋하여 로컬 저장소에 변경된 사항들을 저장한다.
> git commit -m "적절한 커밋메세지 적으면 됨" 

//  원격 저장소에 push 한다. 
> git push origin [내가 만든 브랜치명] branch
  1. 깃헙에서 프로젝트 관리자에게 pull request를 보낸다.

  2. 이후, 프로젝트 관리자가 merge 한다.

2️⃣ 두번째 방법: 내가 직접 merge

// 로컬 저장소의 develop 브랜치에 중앙 원격 저장소의 최신 내용을 가져옴 (반드시 !!!) 
// 참고로 pull 하면 원격 저장소의 데이터를 가져와 자동으로 병합까지 가능 !
> git pull origin develop

// [내가 만든 브랜치명] 브랜치를 develop branch에 병합
> git merge [내가 만든 브랜치명] branch

// 로컬 저장소의 develop 브랜치를 중앙 원격 저장소에 push 함.
> git push

4. develop 브랜치에서 배포 준비가 끝나면 release 브랜치로 분할하기 (QA 시작)

출시 담당자는 QA를 시작하기 위해 먼저 release 브랜치를 생성하고, push하여 release 브랜치를 공유한다.

// develp 브랜치로부터 release 브랜치(release-1.0.0)를 생성
> git checkout -b release-1.0.0 develop

release-1.0.0 브랜치를 upstream에 push합니다.
(release-1.0.0)] > git push upstream release-1.0.0

5. release 브랜치에서 디버깅하고 문제가 없으면 master와 develop 브랜치에 합치기

// release 브랜치를 최신 상태로 갱신
(release-1.0.0)]> git pull origin release-1.0.0

// release 브랜치를 develop 브랜치에 merge 
(release-1.0.0)]> git checkout develop
(develop)]> git pull origin develop
(develop)]> git merge --no--ff release-1.0.0

// develop 브랜치를 origin에 push
(develop)]> git push origin develop

6. master 브랜치 배포하기

마지막으로 master 브랜치에서 버전 태그를 달아줍니다.

//master 브랜치로 이동
(develop)]> git checkout master

// 1.0.0 태그를 추가합니다.
(master)]> git tag 1.0.0

// master 브랜치와 1.0.0 태그를 origin에 push 합니다.
(master)]$ git push origin master 1.0.0

7. 만약 배포 버전에서 문제가 생겨 급하게 수정해야 하면 hotfix 브랜치를 만들어 작업하기

새로운 브랜치를 생성하고, 작업 위치로 이동

> git checkout -b hotfix-1.2.1 master

작업하기

8. hotfix에서 버그픽스가 끝나면 master와 develop에 합친다.

master에 합치기

// master 브랜치로 이동
> git checkout master

// 'master' 브랜치에 hotfix-1.2.1 브랜치 내용 병합
> git merge --no-ff hotfix-1.2.1

// 병합한 커밋에 새로운 버전 이름으로 태그를 부여
> git tag -a 1.2.1

// 'master' 브랜치를 중앙 원격 저장소(origin)에 올림
> git push origin master

develop에 합치기

// develop 브랜치로 이동
> git checkout develop

// 'develop' 브랜치에 hotfix-1.2.1 브랜치 내용 병합
> git merge --no-ff hotfix-1.2.1

// 'develop' 브랜치를 중앙 원격 저장소(origin)에 올림
> git push origin develop

참고한 자료 : https://woovictory.github.io/2019/01/23/Etc-Git-Flow-2/

1개의 댓글

comment-user-thumbnail
2022년 4월 24일

코테 문제 막히는게 있어서 도움 받아볼수 있을까요? ㅎ

답글 달기