시맨틱 diff
이름만 바꾼 변경은 줄 단위 diff에서 파일 하나가 통째로 지워지고 파일 하나가 통째로 추가된 것처럼 보여요. 기술적으로는 맞는 말이지만, 아무 쓸모가 없죠.
Gitcito는 모든 파일 diff 위에 무엇이 바뀌었나 띠를 보여 줘요. 파일의 두 버전을 tree-sitter 로 파싱하고 — 정규식이 아니라 진짜 구문 트리예요 — 그 선언들을 서로 짝지어요.

| 판정 | 예 |
|---|---|
| 이름 변경 | startServer → bootServer |
| 시그니처 | open(path) → open(path, mode) |
| 추가됨 / 제거됨 | 새로 생긴 함수, 지워진 함수 |
| 이동됨 | 같은 코드가 40줄 아래로 |
| 변경됨 | 이름과 시그니처는 그대로, 본문이 다름 |
이름 변경과 시그니처 변경이 먼저 정렬돼요. 리뷰어가 절대 놓쳐서는 안 되는 것들이니까요. 행을 클릭하면 diff 안의 그 심벌로 이동해요.
파싱할 수 있는 것
TypeScript, TSX, JavaScript, Python, Go, Rust, Java, C, C++, C#, Ruby, PHP, Swift, Kotlin, Scala, Lua, Bash, Zig.
문법이 없는 언어의 파일은 그냥 평소의 줄 단위 diff를 유지해요 — 띠가 아예 나타나지 않아요. 400 KB 가 넘는 파일도 마찬가지예요.
솔직한 한계
- 본문까지 함께 바뀐 이름 변경은 이름 변경으로 보고하고, 그 사실도 함께 알려 줘요.
- 우연히 비슷해 보이는 한 줄짜리 함수 둘은 짝지어지지 않아요. 일정 크기 아래에서는 거의 정확히 일치해야만 짝이 되기 때문에, 지어낸 이름 변경 대신 깔끔한 제거 + 추가를 보게 돼요.
- 위쪽에 무언가가 늘어나는 바람에 몇 줄 밀린 심벌은 "이동됨"으로 보고하지 않아요. 그러면 진짜 이동이 묻혀 버릴 테니까요.