[Git] rebase를 활용한 협업 예시와 사용 이유
rebase를 활용한 협업 예시
1. main에서 프로젝트 세팅을 마치고 브랜치 A, B, C를 생성한다.
2. 브랜치 A, B, C가 기능 개발을 시작한다.
3. A가 기능1 개발을 완료한다.
4. main에서 A를 merge한다.
현재 main에는 기능1이 포함되어있다.
5. B가 기능2 개발을 완료한다.
현재 B의 베이스(base)는 main의 "프로젝트 세팅" 커밋이다.
따라서 B브랜치는 기능1을 포함하고 있지 않다.
6. B를 기능1을 포함한 상태로 만들기 위해 base를 main브랜치("Merge 기능1")로 리베이스(rebase)한다.
현재 B에는 기능1,2 가 포함되어있다.
7. main에서 B를 merge한다.
현재 main에는 기능1,2가 포함되어있다.
8. C가 기능3 개발을 완료한다.
현재 C의 베이스(base)는 main의 "프로젝트 세팅" 커밋이다.
따라서 C브랜치는 기능1,2 을 포함하고 있지 않다.
9. C를 기능1,2을 포함한 상태로 만들기 위해 base를 main브랜치("Merge 기능2")로 리베이스(rebase)한다.
현재 C에는 기능1,2,3 이 포함되어있다.
10. main에서 C를 merge한다.
현재 main에는 기능1,2,3이 포함되어있다.
11. A가 기능1,2,3을 포함한 상태로 기능4 개발을 시작하려고한다.
A를 기능1,2,3을 포함한 상태로 만들기 위해 main브랜치("Merge 기능3")로 리베이스(rebase)한다.
현재 A의 base는 main브랜치("Merge 기능3") 이다.
12. A가 기능4 개발을 시작한다.
13. A가 기능4 개발을 완료한다.
현재 A의 베이스(base)는 main브랜치("Merge 기능3") 이다.
따라서 A브랜치는 기능1,2,3과 기능4 를 포함하고 있다.
14. main에서 A를 merge한다.
현재 main에는 기능1,2,3,4가 포함되어있다.
15. 위 과정을 반복한다.
rebase를 활용하지 않은 협업 예시
1. main에서 프로젝트 세팅을 마치고 브랜치 A, B, C를 생성한다.
2. 브랜치 A, B, C가 기능 개발을 시작한다.
3. A가 기능1 개발을 완료한다.
4. main에서 A를 merge한다.
현재 main에는 기능1이 포함되어있다.
여기까지는 동일하게 진행된다.
3. B가 기능2 개발을 완료한다.
현재 B에는 기능1이 포함되어있지않다.
4. main에서 B를 merge한다.
현재 main에는 기능1,2 가 포함되어있다.
5. C가 기능3 개발을 완료한다.
현재 B에는 기능1,2가 포함되어있지않다.
6. main에서 C를 merge한다.
현재 main에는 기능1,2,3 이 포함되어있다.
현재 시점에서 아래와 같은 문제점을 발견할 수 있다.
1. 모든 히스토리에 팀원 수만큼의 branch가 존재한다.
2. 특정 기능이 어떤 커밋들을 통해 만들어진 기능인지 파악하기 어렵다.
3. 위 문제점들로 인해 오류가 발생했을 때 오류 분석이 어려워진다.
4. 브랜치가 너무 더럽다.
계속 개발을 이어나가보자.
7. A가 기능1,2,3을 포함한 상태로 기능4 개발을 시작하려고한다.
현재 A의 base는 main("프로젝트 세팅")이다.
즉, A는 기능2,3 을 포함하고 있지 않기 때문에 A브랜치를 삭제한다.
main의 커밋("Merge 기능3")으로 checkout 한다.
해당 커밋에서 새로운 A브랜치를 생성한다.
현재 A는 기능1,2,3을 포함한다.
8. A가 기능4 개발을 시작한다.
8. A가 기능4 개발을 완료한다.
9. main에서 A를 merge한다.
현재 A는 기능1,2,3,4를 포함한다.
10. 위 과정을 반복한다
rebase를 사용하는 이유와 결론
위에서 rebase를 활용하지 않은 협업 예시를 통해 아래와 같은 문제점을 발견했다.
1. 모든 히스토리에 팀원 수만큼의 branch가 존재한다.
2. 특정 기능이 어떤 커밋들을 통해 만들어진 기능인지 파악하기 어렵다.
3. 위 문제점들로 인해 오류가 발생했을 때 오류 분석이 어려워진다.
4. 브랜치가 너무 더럽다.
만약 팀원이 20명이라면...? 끔찍하다..
따라서 협업을 진행할 때에는 꼭 rebase를 사용해 깔끔한 git flow를 만들어나가는 것을 추천한다.