참고 블로그
Feature Branch Workflow
- 기능별 브랜치를 만들어서 작업한다.
- 다수의 팀 구성원이 메인 코드 베이스(main)를 중심으로 해 안전하게 기능을 개발할 수 있다.
- Pull Request를 결합하면 팀 구성원간에 변경 내용에 대한 소통을 촉진, 코드 품질을 높일 수 있다.
- 유연성이 크고 소규모 인원의 프로젝트에서 사용할 수 있는 방법이다.
1. 중앙 원격 저장소, 내 원격 저장소, 로컬 저장소
- 중앙 원격 저장소
- 여러 명이 같은 프로젝트를 관리하는데 사용하는 그룹 계정의 중립된 원격 저장소
- GitHub 페이지에서
New organization
을 선택해서 생성한다.
Organization
의 사용자와 저장소는 팀으로 관리되고, 저장소의 권한 설정도 팀으로 관리한다.
- 자신의 원격(remote) 저장소
- remote repository
- 자신의 파일을 GitHub 전용 서버에 올려 관리할 수 있는 원격 저장소이다.
- 로컬(local) 저장소
- local repository
- 내 PC에 파일이 저장되는 개인 전용 저장소

2. 참여자는 git clone으로 로컬 저장소를 생성한다
git clone
명령어로 중앙 원격저장소를 복제하여 자신의 로컬저장소를 만들 수 있다. 프로젝트 참여자는 이 로컬 저장소에서 작업을 수행한다.
$ git clone ( repository URL ) // repository 생성
// 아래의 명령을 포함한 작업이다.
$ git init // 해당 디렉토리를 빈 git 저장소로 만듬
$ git remote add origin ( 중앙 remote repository URL )
// 현재 작업 중인 Git 저장소에 팀의 중앙 원격 저장소를 추가. 긴 서버 주소(URL) 대신 origin이라는 이름 사용.
$ git fetch origin master // 중앙원격저장소(origin)의 main 브랜치 데이터를 로컬에 가져옴.
- fetch와 pull의 차이
- fetch : 원격 저장소의 데이터를 로컬에 가져오기
- pull : 원격 저장소의 내용을 가져와 자동으로 병합 실행
- fetch는 원격 저장소의 내용을 확인만하고 싶을 때
pull은 원격 저장소의 내용을 가져와 병합하고 싶을 때
- pull = fetch + merge


3. 현재 로컬에서 작업 중인 branch 확인
- 자신이 현재 어느 브랜치에서 작업 중인지 확인해야한다.
4. 새로운 기능 개발을 위해 격리된 branch 생성
- 로컬 저장소에서 새로운 branch를 따고, 코드를 수정하고, 변경 내용 커밋
$ git checkout -b ( branch name )
- 내 로컬에서 새로운 작업을 하는 경우 main에서 그 작업에 대한 브랜치를 생성 후 이동.
5. 로컬 저장소의 새로운 기능 브랜치를 중앙 원격 저장소(remote repository)에 푸시
- 새로 만든 브랜치에 대한 기능에 대한 내용 커밋
$ git commit -a -m "~~~"
// 위의 명령어는 아래의 두 명령어를 합친 것.
$ git add ( file ) // 스테이징 영역에 file 추가
$ git commit -m "~~~" // local 작업폴더에 history 추가
- 커밋한 후 내가 작업한 내용을 포함한 브랜치(feature/~ branch)를 중앙 원격 저장소에 올림.
- 로컬 저장소의 백업 역할을 할 뿐 아니라, 다른 팀 구성원들이 나의 작업 내용과 진도를 확인할 수도 있어 좋은 습관이라 할 수 있다.
$ git push -u origin feature/login branch
// 로컬의 기능 브랜치를 중앙의 원격 저장소(origin)에 올림
-u
옵션 : 새로운 기능 브랜치와 동일한 이름으로 중앙 원격 저장소의 브랜치로 추가.
이후에는 -u
를 사용하지 않고도 기능 브랜치를 올릴 수 있음.
6. 자신의 작업물을 반영해 달라는 풀 리퀘스트 날리기
- 프로젝트 관리자(소규모 팀에서는 모두가 관리자가 될 수 있음.)에게 자신의 기여분을 중앙 원격 코드 베이스에 반영해 달라고 요청하자.
새로 만든 기능 개발용 브랜치도 중앙 저장소에 올려 팀 구성원과 개발 내용에 대한 의견(코드 리뷰) 등을 나눌 수 있다.
- main 브랜치는 손대지 않기 때문에 다른 기능 개발 브랜치 얼마든지 올릴 수 있음.
- Pull requests : main에 바로 병합하는 것이 아니라, 브랜치를 중앙 원격 저장소에 올리고 main에 병합해달라고 요청하는 것.
- GUI 도구를 이용한 풀 리퀘스트
- 1) GitHub 페이지에서
Pull requests
버튼을 이용해서 원하는 브랜치를 제출할지 정할 수 있음.
2) 기능을 구현한 branch를 프로젝트 중앙 원격 저장소의 main branch에 병합해달라고 요청.
7. 변경 내용 확인 후 중앙 원격 코드 베이스에 병합함
- 변경한 코드 내용을 확인하고 변경 내용을 중앙 원격 코드 베이스에 병합하는 작업을 한다.
- GUI 도구를 이용한 병합
- 1) GitHub 페이지에서
Pull requests
버튼을 누르고, File changed 탭에서 변경 내용 확인
2) Conversation 탭으로 이동, Confirm merge
를 하면 중앙 원격 코드 베이스에 병합된다.
3) 충돌이 일어날 경우 팀원과 합의 후 충돌 내용을 수정한 후 병합 진행.
8. 중앙 원격 저장소-내 로컬 저장소 동기화를 위해 로컬 저장소의 branch를 main branch로 이동.
9. 중앙 원격 저장소 코드 베이스에 새로운 커밋이 있다면 가져온다.
- 중앙 원격 저장소(origin)의 메인 코드 베이스가 변경되었으므로, 프로젝트 참여 개발자가 자신의 로컬 저장소를 동기화해서 최신 상태로 만들어야 한다.
git pull origin main

10. 새로운 기능 작업을 위한 새 branch 생성
- 중앙 원격 저장소와 동기화된 로컬 저장소의 main branch에서 새로운 작업에 대한 branch를 생성하여 작업 시작.

참고 블로그
Gitflow Workflow
Feature Branch Workflow
보다 복잡하지만, 대형 프로젝트에도 적용할 수 있는 좀 더 엄격한 작업 절차.
main
과 develop
두개의 메인 브랜치를 이용하는 것이 핵심.
- 이 작업개념에서도 로컬 브랜치에서 작업 후 중앙 원격 저장소에 푸시.
Feature Branch Workflow
와 대체로 비슷하지만, 추가되는 부분만 기재한다.
1. 중앙 원격 저장소, 내 원격 저장소, 로컬 저장소
2. 참여자는 git clone으로 로컬 저장소를 생성한다
3. Develop Branch 생성
- main branch를 기준으로 develop 생성
GUI 도구를 이용한 생성 (추천)
- GitHub 페이지에서 branch 버튼을 누른 후 빈 입력칸(Find or create a branch.. 라고 적혀있다.)에 branch 이름을 넣어서 새로운 브랜치를 생성할 수 있다.
- 새로 생성한
develop
branch를 디폴트로 설정해야한다.





- branch 버튼을 눌러 branch 탭으로 이동
New branch
를 이용해 간단히 신규 브랜치를 생성할 수 있다.
- branch 목록의 우측에 있는 화살표를 클릭해 default branch를 변경할 수 있다.
- develop brance를 default로 설정하는 이유
- 평소에 develop 브랜치를 기반으로 개발을 진행하기 때문에
$ git push origin feature/~
(내 로컬저장소의 feature 브랜치를 중앙 원격 저장소로 올리는 명령)을 한 후 GitHub 페이지에서 해당 feature 브랜치가 merge 될 때
중앙 원격 저장소의 'main' 브랜치가 아닌 default 설정되어 있는 develop에 병합되도록 설정하는 것.
팀 구성원 중 한 명이 자신의 repo에 빈 develop 브랜치 만들고 중앙 저장소로 푸시
$ git branch develop
$ git push -u origin develop
- GitHub 페이지에서 자신이 push한 develop 브랜치를 병합해달라는 pull request를 날림.
- 프로젝트 관리자는 해당 pull request를 병합하여 새로운 develop 브랜치를 중앙 원격 저장소에 생성.
- 방법 1과 같은 방법으로 새로 생성한 develop 브랜치를 default로 설정한다.
4. Workflow 적용할 준비 갖추기
- 팀 구성원은 중앙저장소를 복제하고, 중앙 저장소와 연결된 개발 브랜치를 만든다.
$ git checkout -b develop origin/develop
- 이제 팀 구성원 모두가 Workflow를 적용하기 위한 준비가 되었다.
5. 현재 로컬에서 작업 중인 branch 확인
- Workflow에서는 대부분의 작업이 develop branch에서 이루어진다.
6. 새로운 기능 개발을 위해 격리된 branch 생성
- 로컬 저장소에서 branch를 따고, 코드를 수정하고, 변경 내용을 커밋.
이때 main 브랜치에서 기능 개발을 위한 브랜치를 따는 것이 아닌, develop branch에서 따야한다.
$ git checkout -b ( branch name ) develop

7. 로컬 저장소의 새로운 기능 브랜치를 중앙 원격 저장소(remote repository)에 푸시
- 새로 만든 브랜치에 새로운 기능에 대한 내용을 커밋한다.
- 커밋이 완료됐다면 작업한 내용을 포함한 브랜치를 중앙 원격 저장소에 올림.
팀이 Pull request 를 이용하는 경우
- 로컬 저장소의 새로운 기능 브랜치를 중앙 원격 저장소(remote repository)에 푸시, 프로젝트 관리자에게 기여분을 반영해달라는 풀 리퀘스트를 날린다.
- 새로운 기능 개발용 브랜치도 중앙 저장소에 올려 팀 구성원들과 개발 내용에 대한 의견(코드 리뷰 등)을 나눌 수 있다.
- 변경 코드 내용을 확인하고 마지막으로 확인한 팀원 또는 프로젝트 관리자가 변경 내용을 중앙 원격 코드 베이스에 병합하는 작업을 함.

- GUI 도구를 이용한 풀 리퀘스트
- 1) GitHub 페이지에서 Pull requests 버튼을 이용해서 원하는 브랜치를 제출할지 정할 수 있음.
2) 기능을 구현한 branch를 프로젝트 중앙 원격 저장소의 main branch에 병합해달라고 요청.

- GUI 도구를 이용한 병합
- 1) GitHub 페이지에서
Pull requests
버튼을 누른 후, File changed 탭에서 변경 내용 확인
2) Conversation 탭으로 이동, Confirm merge
를 하면 중앙 원격 코드 베이스(develop branch)에 병합됨.
3) 충돌이 일어나면 팀원들과 합의해 충돌 내용을 수정한 후 병합 진행
- 위에서 develop 브랜치를 default 브랜치로 설정했기 때문에 자동으로 develop 브랜치로 병합된다.
팀이 Pull request 를 이용하지 않는 경우
- 기능 브랜치를 병합하기 전, 반드시 자신의 로컬 저장소 develop 브랜치에 중앙 원격 저장소의 변경 내용을 반영해 최신 상태로 만들어야 한다.
- 자신이 직접 새로운 기능에 병합할 때, main 브랜치에 바로 병합하지 않도록 주의.


8. 중앙 원격 저장소와 자신의 로컬 저장소 동기화를 위해 로컬 저장소의 branch를 develop 브랜치로 이동
9. 중앙 원격 저장소 코드 베이스에 새로운 커밋이 있다면 가져옴
- 중앙 원격 저장소(origin)의 메인 코드 베이스가 변경되었으므로, 프로젝트 참여 개발자가 자신의 로컬 저장소를 동기화해서 최신 상태로 만들어야 한다.
git pull origin develop
10. 새로운 기능 작업을 위한 새 branch 생성
- 중앙 저장소와 동기화된 로컬 저장소의 develop 브랜치에서 새로운 작업에 대한 브랜치를 생성하여 다른 작업 시작.
11. 배포하고, 버그 수정하기
- 배포를 위한
release branch
생성과 버그 수정을 위한 hotfix branch
의 생성은 Git으로 작업하기 - branch편
를 참고하자.
마무리
Feature Branch Workflow
Gitflow Workflow
두 방식은 결국 develop 브랜치가 있다는 것과 그렇지 않다는 차이점을 제외하면 비슷하다. 개념에 유의하며 슬기로운 git use 를 하자