Semantic diff
A pure rename shows up in a line diff as an entire file deleted and an entire file added. That is technically true and completely useless.
Above every file diff, Gitcito shows a What changed strip: both versions of the file are parsed with tree-sitter — real syntax trees, not regular expressions — and their declarations are matched up.

| Verdict | Example |
|---|---|
| Renamed | startServer → bootServer |
| Signature | open(path) → open(path, mode) |
| Added / Removed | a new function; a deleted one |
| Moved | same code, 40 lines further down |
| Changed | same name and signature, different body |
Renames and signature changes sort first — they are what a reviewer must not miss. Click a row to jump to that symbol in the diff.
What it can parse
TypeScript, TSX, JavaScript, Python, Go, Rust, Java, C, C++, C#, Ruby, PHP, Swift, Kotlin, Scala, Lua, Bash and Zig.
A file whose language has no grammar simply keeps its normal line diff — the strip does not appear at all. Same for files over 400 KB.
Honest limits
- A rename whose body also changed is reported as a rename and says so.
- Two one-line functions that happen to look alike are not paired: below a size threshold the match has to be near-exact, so you get a clean removed + added instead of a fictional rename.
- Symbols that only drift a few lines because something above them grew are not reported as "moved" — that would bury the real moves.
See also: Diff viewer · What changed since