workflow
- Branch와 원격 저장소를 이용해 협업을 하는 두 가지 방법
- 원격 저장소 소유권이 있는 경우 -> Shared repository model
- 원격 저장소 소유권이 없는 경우 -> Fork & Pull model
Shared repository model
- 원격 저장소가 자신의 소유이거나 Collaborator로 등록되어 있는 경우
- master 브랜치에 직접 개발하는 것이 아니라, 기능별로 브랜치를 따로 만들어 개발
- Pull Request를 사용하여 팀원 간 변경 내용에 대한 소통 진행
- 소유권이 있는 원격 저장소를 로컬 저장소로 clone 받기

- 사용자는 자신이 작업할 기능에 대한 브랜치를 생성하고, 그 안에서 기능을 구현

- 기능 구현이 완료되면, 원격 저장소에 해당 브랜치를 Push

- 원격 저장소에 각 기능의 브랜치가 반영됨

- Pull Request를 통해 브랜치를 master에 반영해달라는 요청을 보냄

- 병합이 완료된 브랜치는 불필요하므로 원격 저장소에서 삭제

- 원격 저장소에서 병합이 완료되면, 사용자는 로컬에서 master 브랜치로 switch

- 병합으로 인해 변경된 원격 저장소의 master 내용을 로컬에 Pull

- 원격 저장소 master의 내용을 받았으므로, 기존 로컬 브랜치 삭제 (한 사이클 종료)

- 새 기능 추가를 위해 새로운 브랜치를 생성하며 지금까지의 과정을 반복

Fork & Pull model
- 오픈소스 프로젝트와 같이, 자신의 소유가 아닌 원격 저장소인 경우
- 원본 원격 저장소를 그대로 내 원격 저장소에 복제 (이러한 행위를 Fork라고 함)
- 기능 완성 후 복제한 내 원격 저장소에 Push
- 이후 Pull Request를 통해 원본 원격 저장소에 반영될 수 있도록 요청함
- 소유권이 없는 원격 저장소를 fork를 통해 내 원격 저장소로 복제

- fork 이후, 복제된 내 원격 저장소를 로컬 저장소에 clone

- 이후에 로컬 저장소와 원본 원격 저장소를 동기화 하기 위해 연결

- 사용자는 자신이 작업할 기능에 대한 브랜치를 생성하고, 그 안에서 기능을 구현

- 기능 구현이 완료되면, 복제 원격 저장소(origin)에 해당 브랜치를 Push

- 복제 원격 저장소(origin)에 브랜치가 반영됨

- Pull Request를 통해 origin의 브랜치를 upstream에 반영해달라는 요청을 보냄

- upstream에 브랜치가 병합되면 origin의 브랜치는 삭제

- 이후 사용자는 로컬에서 master 브랜치로 switch

- 병합으로 인해 변경된 upstream의 master 내용을 로컬에 Pull

- upstream의 master 내용을 받았으므로, 기존 로컬 브랜치 삭제(한 사이클 종료)

- 새로운 기능 추가를 위해 새로운 브랜치를 생성하며 위 과정을 반복
