이 글의 대부분의 내용은 우아한 형제들 Gif-flow 글에서 참고했음을 밝힙니다.

 

우린 Git-flow를 사용하고 있어요 | 우아한형제들 기술블로그

{{item.name}} 안녕하세요. 우아한형제들 배민프론트개발팀에서 안드로이드 앱 개발을 하고 있는 나동호입니다. 오늘은 저희 안드로이드 파트에서 사용하고 있는 Git 브랜치 전략을 소개하려고 합

techblog.woowahan.com


Git flow

 

Git-Flow는 각각 feature가 독립적이면서 연속적으로 개발 될 수 있도록 하는 전략 중에 하나입니다.

 

Git flow를 이보다 잘 설명할 수 있을까

Git-flow에는 5가지 종류의 브랜치가 존재합니다. 항상 유지되는 메인 브랜치들(master, develop)과 일정 기간 동안만 유지되는 보조 브랜치들(feature, release, hotfix)이 있습니다.

  • master : 제품으로 출시될 수 있는 브랜치
  • develop : 다음 출시 버전을 개발하는 브랜치
  • feature : 기능을 개발하는 브랜치
  • release : 이번 출시 버전을 준비하는 브랜치
  • hotfix : 출시 버전에서 발생한 버그를 수정 하는 브랜치

git에서는 git flow 명령어를 제공하기도 합니다. git flow 전략을 그대로 명령어로 만든 형태입니다.

 

git-flow cheatsheet

 

danielkummer.github.io

 

action은 init, start, finish, publish, pull이 있고 아래는 주로 사용하게 되는 feature branch 관리 코드 예시입니다.

# 브랜치 추가
# feature/FeatureName 브랜치가 develop를 base로 생성됩니다.
$ git flow feature start [FeatureName]

# 브랜치 종료
# feature/FeatureName 브랜치가 develop로 merge되고 그 후 삭제됩니다.
$ git flow feature finish [FeatureName]

# 그 외 publish와 pull도 있습니다.

 

git flow를 위한 상황별 git 명령어들

 

하지만, 우리는 정해진 기능만 사용할 수가 없습니다. 기능 구현을 위해 일부 기능이 필요하거나, 개발하다가 코드가 충돌하거나 등등의 다양한 상황이 생기기 때문이죠.

 

몇 가지 상황별로 명령어를 모아 준비해봤습니다.

 

1. develop 브랜치에서 feature 브랜치를 생성

$ git switch develop
$ git pull origin develop
$ git checkout -b feature/user –track develop

생성 후에 소스코드 수정을 해서 변경사항을 commit 해줍니다.

 

 

2. 불필요하게 나눠진 커밋 합치기

 

아래와 같이 3개의 커밋(first commit, second commit, third commit)을 했다.

 

 

3개의 커밋을 1개의 커밋으로 합치고 싶은데 어떻게 해야할까?

이 때 git rebase를 사용하면 되는데, 명령어는 아래와 같습니다.

 

git rebase -i HEAD~3

 

 

그러고 나서, second commit, third commit 앞에 pick이라고 되어 있는 부분을 squash라고 수정한 뒤,

 

 

저장하고 빠져 나오면 아래와 같은 화면이 나옵니다.

 

 

제일 윗 줄에 새로 추가할 커밋 메시지를 작성해줍니다.

주의) 그 아래에 있는 first commit, second commit, third commit을 그대로 놔두면 커밋 메시지에 같이 찍히게 됩니다.

 

 

그리고 git log를 통해 합쳐진 내용을 확인하면 커밋이 잘 합쳐진 것을 확인할 수 있습니다.

git log


이미지 출처: DevNote

 

 

3. develop 변경사항을 feature로 가져와서 push 하기

 

작업을 할 때 브랜치의 수명은 되도록 짧게 가져가는 게 좋지만, feature 브랜치에서 기능을 완료하는데 해야 할 작업들이 많아서 오래 걸리는 경우 들이 있습니다. 그러다 보면 develop에 추가된 기능들이 필요한 경우가 종종 생기게 됩니다. 그럴 때는 feature 브랜치에 develop의 변경사항들을 가져와야 합니다.

# feature/user 브랜치에 develop 브랜치를 merge 합니다.
$ git switch feature/user
$ git merge –no-ff develop

# develop의 변경사항이 merge된 feature/user를 origin에 push 합니다.
$ git push origin feature/user

 

4. 앱 출시

 

발생하는 버그들을 모두 수정했다면 이젠 출시를 준비할 때입니다. release 브랜치를 master 브랜치와 develop 브랜치에 merge하고 마지막으로 master 브랜치에서 버전 태그를 달아줍니다.

  1. release 브랜치를 최신 상태로 갱신합니다.
    (release-1.0.0)]$ git pull upstream release-1.0.0​
  2. release 브랜치를 develop 브랜치에 merge 합니다.
    (release-1.0.0)]$ git checkout develop
    (develop)]$ git pull upstream develop
    (develop)]$ git merge –no-ff release-1.0.0​
  3. develop 브랜치를 upstream에 push 합니다.
    (develop)]$ git push upstream develop​
  4. release 브랜치를 master 브랜치에 merge 합니다.
    (develop)]$ git checkout master
    (master)]$ git pull upstream master
    (master)]$ git merge –no-ff release-1.0.0​
  5. 1.0.0 태그를 추가합니다.
    (master)]$ git tag 1.0.0​
  6. master 브랜치와 1.0.0 태그를 upstream에 push 합니다.
    (master)]$ git push upstream master 1.0.0​

 

+ Recent posts