Pro git - 5.1
Updated:
Pro git - 분산 환경에서의 워크플로
0. 분산 환경에서의 워크플로
- 분산 환경에서 Git을 프로젝트 기여자 또는 관리자로서 작업물을 프로젝트에 어떻게 포함시킬지와 수 많은 개발자가 수행한 일을 취합하고 프로젝트를 운영하는 방법을 배운다.
- 중앙집중형 버전 관리 시스템과는 달리 Git은 분산형이다.
- 중앙집중형 버전 관리 시스템에서 각 개발자는 중앙 저장소를 중심으로 하는 한 노드일 뿐이다.
- 하지만, Git에서는 각 개발자의 저장소가 하나의 노드이기도 하고 중앙 저장소 같은 역할도 할 수 있다.
- 즉, 모든 개발자는 다른 개발자의 저장소에 일한 내용을 전송하거나, 다른 개발자들이 참여할 수 있도록 자신이 운영하는 저장소 위치를 공개할 수도 있다.
1. 중앙집중식 워크플로
- 중앙집중식 시스템에서는 보통 중앙집중식 협업 모델이라는 한 가지 방식밖에 없다.
-
중앙 저장소는 딱 하나 있고 변경 사항은 모두 이 중앙 저장소에 집중된다.
- 개발자는 이 중앙 저장소를 중심으로 작업한다
-
중앙집중식에서 개발자 두 명이 중앙저장소를 Clone 하고 각자 수정하는 상황을 생각해보자.
-
한 개발자가 자신이 한 일을 커밋하고 나서 아무 문제 없이 서버에 Push 한다.
-
그러면 다른 개발자는 자신의 일을 커밋하고 Push 하기 전에 첫 번째 개발자가 한 일을 먼저 Merge 해야 한다.
-
Merge를 해야 첫 번째 개발자가 작업한 내용을 덮어쓰지 않는다.
-
이런 개념은 Subversion과 같은 중앙집중식 버전 관리 시스템에서 사용하는 방식이고 Git에서도 당연히 이런 워크플로를 사용할 수 있다.
-
팀이 작거나 이미 중앙집중식에 적응한 상황이라면 이 워크플로에 따라 Git을 도입하여 사용할 수 있다.
-
중앙 저장소를 하나 만들고 개발자 모두에게 Push 권한을 부여한다.
-
모두에게 Push 권한을 부여해도 Git은 한 개발자가 다른 개발자의 작업 내용을 덮어쓰도록 허용하지 않는다.
-
Git이 제공하는 브랜치 관리 모델을 사용하면 수백명의 개발자가 한 프로젝트 안에서 다양한 브랜치를 만들어서 함께 작업하는 것도 쉽다.
1.1 예시
- John과 Jessica가 동시에 같은 부분을 수정하는 상황을 생각해보자.
- John이 먼저 작업을 끝내고 수정한 내용을 서버로 Push 한다.
- Jessica도 마찬가지로 작업을 끝내고 수정한 내용을 서버로 Push 하려 하지만 서버가 바로 받아주지 않는다.
- 서버에는 John이 수정한 내용이 추가되었기 때문에 Push 하기 전에 Fetch로 받아서 Merge 한 후 Push 할 수 있다.
2. Integration-Manager 워크플로
- Git을 사용하면 리모트 저장소를 여러 개 운영할 수 있다.
- 다른 개발자는 읽기만 가능하고 자신은 쓰기도 가능한 공개 저장소를 만드는 워크플로도 된다.
- 보통 프로젝트를 대표하는 공식 저장소가 있다.
- 기여자는 우선 공식 저장소를 하나 Clone 하고 수정하고 나서 자신의 저장소에 Push 한다.
- 그 다음에 프로젝트 Integration-Manager에게 새 저장소에서 Pull 하라고 요청한다.
- 그러면 그 Integration-Manager는 기여자의 저장소를 리모트 저장소로 등록하고, 로컬에서 기여물을 테스트하고, 프로젝트 메인 브랜치에 Merge 하고, 그 내용을 다시 프로젝트 메인 저장소에 Push 한다.
- GitHub나 GitLab 같은 Hub 사이트를 통해 주로 사용하는 방식이다.
- 프로젝트를 Fork 하고 수정사항을 반영하여 다시 모두에게 공개하기 좋은 구조로 돼 있다.
- 장점은 기여자와 Integration-Manager가 각자의 사정에 맞춰 프로젝트를 유지할 수 있다는 점이다.
- 기여자는 자신의 저장소와 브랜치에서 수정 작업을 계속해 나갈 수 있고 수정사항이 프로젝트에 반영되도록 기다릴 필요가 없다.
- 관리자는 여유를 가지고 기여자가 Push 해 놓은 커밋을 적절한 시점에 Merge 한다.
2.1 과정
- 프로젝트 Integration-Manager는 프로젝트 메인 저장소에 Push를 한다.
- 프로젝트 기여자는 메인 저장소를 Clone 하고 수정한다.
- 기여자는 자신의 저장소에 Push 하고 Integration-Manager가 접근할 수 있도록 공개해 놓는다.
- 기여자는 Integration-Manager에게 변경사항을 적용해 줄 것을 이메일로 요청한다.
- Integration-Manager는 기여자의 저장소를 리모트 저장소로 등록하고 수정사항을 Merge 하여 테스트한다.
- Integration-Manager는 Merge 한 사항을 메인 저장소에 Push 한다.
3. Dictator and Lieutenants 워크플로
- 이 방식은 저장소를 여러개 운영하는 방식을 변형한 구조이다.
- 보통 수백 명의 개발자가 참여하는 아주 큰 프로젝트를 운영할 때 이 방식을 사용한다.
- Linux 커널 프로젝트가 대표적이다.
- 여러 명의 Integration-Manager가 저장소에서 자신이 맡은 부분만을 담당하는데 이들을 Lieutenants 라고 부른다.
-
모든 Lieutenant는 최종 관리자 아래에 있으며 이 최종 관리자를 Benevolent Dictator 라고 부른다.
- Benevolent Dictator는 Lieutenant의 저장소를 가져와 공식 저장소에 Push 하고 모든 프로젝트 참여자는 이 공식 저장소에서 반드시 Pull 해야 한다.
- 깊은 계층 구조를 가지는 환경이나 규모가 큰 프로젝트에서는 매우 쓸모 있다.
- 프로젝트 리더가 모든 코드를 통합하기 전에 코드를 부분부분 통합하도록 여러 명의 Lieutenant에게 위임한다.
3.1 과정
- 개발자는 코드를 수정하고
master
브랜치를 기준으로 자신의 토픽 브랜치를 Rebase 한다. 여기서master
브랜치란 공식 저장소의 브랜치를 말한다. - Lieutenant들은 개발자들의 수정사항을 자신이 관리하는
master
브랜치에 Merge 한다. - Dictator는 Lieutenant의
master
브랜치를 자신의master
브랜치로 Merge 한다. - Dictator는 자신의
master
브랜치를 Push 하며 다른 모든 개발자는 Dictator의master
브랜치를 기준으로 Rebase 한다.