약 1년간 Graphite를 사용해 보고 느낀점을 간략히 정리해보고자 한다.
웹페이지: https://graphite.dev/
소개
Graphite는 작은 단위의 pull request를 가능하게 하는 code review platform이다. Graphite cli 자체는 git 명령어를 wrapping해서 만든 cli이다.
Graphite workflow는 3가지 원칙을 통해 normal git workflow를 강화시킨다.
- Pull request를 작게 유지시킨다.
- Trunk branch와 remote branch를 잘 동기화하고, branch restack을 자주 할 수 있게 한다.
- Branch별로 하나의 커밋을 유지한다.
이미 많은 개발자들은 큰 change를 여러 개의 commit sequence로 나누는 방법을 취해왔다. 여기다 더해 Graphite는 큰 change를 pull request의 sequence로 나누는 방법을 취한다.
Feature Branch vs Stack
Trunk branch는 자주 변경된다.
Feature branch 방식의 경우 코드를 작성하고, 코드 리뷰를 받는 동안 많은 merge conflict가 발생하고, 긴 review cycle을 필요로 한다. 코드 PR의 경우 리뷰어에게 엄청난 부담을 안겨준다.
Stack하고 trunk하는 방식의 개발은, 작은 모듈 단위의 PR을 가능하게 하고, 리뷰 타임을 줄일 수 있다.
워크플로우
Case 1. 버그 수정 및 기능 구현
기존 PR 방식
- 메인에서 bug fix 브랜치 A 하나 생성 후 버그 수정
- 메인에서 feature 브랜치 B 하나 생성 후 피쳐 개발(커밋 a, b, c, …)
- 브랜치 A PR 날리고 피드백 반영, 머지
- 피쳐 브랜치 B에서 리베이스
Stacked Diff 방식
- 메인에서 바로 버그를 수정 후 PR 요청 (bug fix branch A 생성)
- A 브랜치 위에서 피처 개발 후 PR 요청 (feature branch B, C, D… 생성)
- A의 피드백 반영후 머지
- 브랜치 B, C, D 모두 자동으로 rebase된다.
사용해보기
설치
https://graphite.dev/docs/install-the-cli
brew나 npm install로 설치할 수 있다.
brew
# Install Graphite from Homebrew.
brew install withgraphite/tap/graphite
gt --version
npm
# Install Graphite from npm.
npm install -g @withgraphite/graphite-cli@stable
gt --version
gt config를 통해 기본 설정을 할 수 있다.
작업
- main branch에서 작업한다.
- gt add: 작업 내용을 staging한다.
- gt create <branch_name> -m “<commit message>”: commit과 함께 branch를 생성한다.
- gt modify: gt create 후에 발생한 change들을 현재 commit에 덮어쓴다. 이때, 상위의 stack들은 restack된다.
- gt modify --commit: gt create 후에 발생한 change들을 새 commit에 쓴다. 이때, 상위의 stack들은 restack된다.
- gt submit: remote branch에 submit한다. Stack에 존재하는 모든 branch에 해당하는 PR을 생성한다.
- PR을 리뷰 후에 머지한다. 이때, 피드백받은 내용은 gt modify 등을 이용해 수정한다.
- gt sync: remote repository의 내용을 동기화한다.
- main의 변경점들을 pull한다.
- trunk로 머지된 로컬 브랜치들을 삭제할지 물어본다.
- 아직 머지되지 않은 upstack branch를 main으로 restack한다. conflict가 있다면, 해결해야 한다.
관리
- gt log: stack의 branch들을 보여준다.
- > gt log ◉ pp--06-14-part_3 (current) │ 8 seconds ago │ │ 95338df - part 3 │ ◯ pp--06-14-part_2 │ 8 seconds ago │ │ 95610c6 - part 2 │ ◯ pp--06-14-part_1 │ 27 seconds ago │ │ 48cd85e - part 1 │ ◯ main │ 5 weeks ago │
- gt checkout: 다른 branch로 이동한다.
- gt track: gt command로 생성하지 않은 브랜치를 graphite의 관리 하에 둔다.
- [주의] vanilla git command를 사용해서 git rebase를 진행하면, branch와 children은 untrack될 수도 있다.
대시보드
Graphite를 사용하면 stack들을 한번에 머지할 수 있다. CI Process를 진행할지 등을 선택해서 머지할 수 있다.
요금
가격은 비교적 비싼 편이다. Team에서 사용하려면 유저마다 한 달에 $30씩 필요하다.
Free 요금제로도 조금 써 봤는데 organization에 최대 10개의 stack이라 stack을 remote 저장소에 push하면 결제하라고 하면서 제대로 동작하지 않는다.
장단점
약 1년간 우리 팀에서 Graphite를 사용하면서 느꼈던 장, 단점을 생각해 보았다.
장점
- Rebase, Sync하는 git 작업이 너무 간편하다. gt 명령들만 잘 숙달되면 훨씬 적은 line으로 작업이 가능하다.
- PR 리뷰에 대한 부담이 적다. 훨씬 작은 단위의 PR이기 때문에 읽기가 편하다.
단점
- 너무 비싸다. Graphite beta 버전 때 무료 버전으로 모든 기능을 사용하다가, Graphite를 그만 사용하려고 하는 이유도 바로 이 이유 때문이다. 기능에 비해 가격이 너무 비싸다.
- PR 리뷰할 개수가 많아진다. 작은 단위 PR이다 보니 하나의 feature에 수 개에서 십수 개의 PR이 필요한 경우가 있다. PR의 양은 작지만 절대적인 개수는 많아진다.
- gt 명령어랑 익숙해지는데 시간이 좀 걸린다. 익숙해지면 다시 git 명령어로 돌아오기 어렵다.
적고나니 장점보다 단점이 많아 보이긴 하지만 쓰면서 굉장히 만족도가 컸던 툴이다. 하지만 가격적인 요인으로 이제는 Graphite를 떠나보내려 한다.
'git' 카테고리의 다른 글
git flow vs github flow (0) | 2024.01.27 |
---|---|
[후기] Sapling 써보기 (0) | 2023.11.05 |
[TIL] Git Server (0) | 2022.05.15 |
Git 내부 동작 방식 알아보기 (0) | 2022.05.07 |