본문 바로가기
git

graphite 사용기

by marble25 2023. 10. 23.

약 1년간 Graphite를 사용해 보고 느낀점을 간략히 정리해보고자 한다.

웹페이지: https://graphite.dev/

소개

Graphite는 작은 단위의 pull request를 가능하게 하는 code review platform이다. Graphite cli 자체는 git 명령어를 wrapping해서 만든 cli이다.

Graphite workflow는 3가지 원칙을 통해 normal git workflow를 강화시킨다.

  1. Pull request를 작게 유지시킨다.
  2. Trunk branch와 remote branch를 잘 동기화하고, branch restack을 자주 할 수 있게 한다.
  3. 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 방식

  1. 메인에서 bug fix 브랜치 A 하나 생성 후 버그 수정
  2. 메인에서 feature 브랜치 B 하나 생성 후 피쳐 개발(커밋 a, b, c, …)
  3. 브랜치 A PR 날리고 피드백 반영, 머지
  4. 피쳐 브랜치 B에서 리베이스

Stacked Diff 방식

  1. 메인에서 바로 버그를 수정 후 PR 요청 (bug fix branch A 생성)
  2. A 브랜치 위에서 피처 개발 후 PR 요청 (feature branch B, C, D… 생성)
  3. A의 피드백 반영후 머지
  4. 브랜치 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를 통해 기본 설정을 할 수 있다.

작업

  1. main branch에서 작업한다.
  2. gt add: 작업 내용을 staging한다.
  3. 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된다.
  4. gt submit: remote branch에 submit한다. Stack에 존재하는 모든 branch에 해당하는 PR을 생성한다.
  5. PR을 리뷰 후에 머지한다. 이때, 피드백받은 내용은 gt modify 등을 이용해 수정한다.
  6. 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를 사용하면서 느꼈던 장, 단점을 생각해 보았다.

장점

  1. Rebase, Sync하는 git 작업이 너무 간편하다. gt 명령들만 잘 숙달되면 훨씬 적은 line으로 작업이 가능하다.
  2. PR 리뷰에 대한 부담이 적다. 훨씬 작은 단위의 PR이기 때문에 읽기가 편하다.

단점

  1. 너무 비싸다. Graphite beta 버전 때 무료 버전으로 모든 기능을 사용하다가, Graphite를 그만 사용하려고 하는 이유도 바로 이 이유 때문이다. 기능에 비해 가격이 너무 비싸다.
  2. PR 리뷰할 개수가 많아진다. 작은 단위 PR이다 보니 하나의 feature에 수 개에서 십수 개의 PR이 필요한 경우가 있다. PR의 양은 작지만 절대적인 개수는 많아진다.
  3. 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