TECH 으로 돌아가기
TECH HACKER NEWS 2026.11.03 09:38 7분 읽기 26 READS

줄 단위 diff가 답답했다면? Rust로 만든 콘텐츠 인식 Git difftool, OmniDiff

줄 단위 diff가 답답했다면? Rust로 만든 콘텐츠 인식 Git difftool, OmniDiff
SOURCE IMAGE · HACKER NEWS
줄 단위 diff가 답답했다면? Rust로 만든 콘텐츠 인식 Git difftool, OmniDiff

리뷰하다 보면 diff가 과장할 때가 있죠

코드 리뷰를 하다 보면 이런 경험 한 번씩 해보셨을 거예요. 로직은 분명 한 줄 바뀌었는데, diff에는 수십 줄이 빨갛고 초록색으로 도배돼 있는 상황이요. 들여쓰기를 한 단계 바꿨거나, 포매터를 돌렸거나, JSON의 키 순서가 바뀌었을 때 특히 그래요. 이번에 공개된 OmniDiff는 바로 이런 불편함을 겨냥한 오픈소스 도구예요. Rust로 만들었고 Git의 difftool에 붙여 쓰는 방식이에요. 스스로를 '빠르고 콘텐츠를 인식하는(content aware)' diff 도구라고 소개하고 있어요.

기본 diff는 왜 답답할까

먼저 diff가 어떻게 동작하는지부터 볼게요. git diff는 기본적으로 Myers 알고리즘을 써요. 두 파일을 '줄의 나열'로 보고, 줄을 가장 적게 추가하고 삭제해서 한쪽을 다른 쪽으로 바꾸는 방법을 찾는 알고리즘이에요. 빠르고 어디에나 쓸 수 있지만, 코드의 '의미'는 전혀 모른다는 한계가 있어요.

// 변경 전
if (user) {
save(user);
}

// 변경 후: 바깥에 조건 하나 씌웠을 뿐인데
if (isLoggedIn) {
if (user) {
save(user);
}
}

사람이 보기엔 '바깥에 if 하나 씌웠네'가 전부예요. 그런데 줄 단위 diff는 들여쓰기가 바뀐 줄을 전부 '삭제 후 추가'로 표시해요. 이게 몇백 줄짜리 함수라면 리뷰어는 진짜 변경을 찾느라 고생하게 되죠.

콘텐츠 인식 diff는 이 문제를 '파일 내용을 이해하고 비교하자'는 방식으로 풀어요. 먼저 파일이 어떤 언어나 형식인지 파악해요. 그다음 단순한 글자 줄이 아니라 구조나 의미 단위로 변경을 보여주려는 거예요. OmniDiff가 정확히 어떤 형식을 지원하고 어떤 방식으로 비교하는지는 GitHub 저장소의 README에서 확인해보세요.

git difftool로 붙여 쓰는 법

여기서 헷갈리기 쉬운 게 git diff와 git difftool의 차이예요. git diff는 결과를 터미널에 텍스트로 뿌려줘요. 반면 git difftool은 비교 작업을 외부 프로그램에 넘기고, 그 프로그램 화면으로 보여줘요. 그래서 평소 Git 습관은 그대로 두고, 필요할 때만 좋은 도구로 열어볼 수 있어요. 설정은 대략 아래처럼 하면 돼요. 실행 인자는 README에 맞춰 바꿔주세요.

# ~/.gitconfig
[diff]
tool = omnidiff
[difftool "omnidiff"]
cmd = omnidiff "$LOCAL" "$REMOTE"
[difftool]
prompt = false

$LOCAL과 $REMOTE는 비교할 두 버전의 임시 파일 경로를 Git이 넘겨주는 변수예요. 이렇게 설정해두면 평소 쓰던 git diff HEAD~1을 git difftool HEAD~1로 바꾸기만 하면 돼요. 여러 파일을 한 번에 보고 싶다면 --dir-diff 옵션도 쓸 만해요.

비슷한 도구들과 비교하면

diff 도구는 생각보다 선택지가 많은 분야예요. difftastic은 구조적 diff의 대표 주자예요. tree-sitter라는 파서로 코드를 구문 트리로 만든 다음 비교해요. delta는 git diff 출력을 문법 강조와 좌우 분할 화면으로 보기 좋게 바꿔주는 페이저(pager)예요. 둘 다 Rust로 만들어졌다는 점도 눈에 띄어요. GUI 쪽으로는 Meld, Beyond Compare, 그리고 JetBrains나 VS Code에 들어 있는 diff 뷰어가 있고요.

Rust로 만든 CLI 도구가 계속 나오는 데는 이유가 있어요. C에 가까운 속도를 내면서도 메모리 안전하고, 단일 바이너리로 배포하기 쉽거든요. ripgrep, bat, fd 같은 도구가 기존 유닉스 명령어를 대체해온 흐름이 있는데, OmniDiff도 그 연장선에 있다고 볼 수 있어요. 이 분야에서 승부를 가르는 건 결국 두 가지예요. 얼마나 빠른지, 그리고 얼마나 다양한 콘텐츠를 똑똑하게 이해하는지요.

한국 개발자에게 주는 시사점

이 도구의 가장 큰 장점은 도입 부담이 거의 없다는 거예요. 개인 .gitconfig만 바꾸면 되니까 팀 저장소나 CI에는 아무 영향이 없어요. 대규모 리팩터링 PR을 리뷰할 때나 포매터를 처음 적용한 커밋을 확인할 때 써보시길 추천해요. 서버 설정용 JSON이나 YAML을 비교할 때도 유용할 거예요. 주의할 점도 두 가지 있어요. GitHub나 GitLab 웹 화면의 PR diff에는 적용되지 않고 로컬에서만 쓸 수 있어요. 그리고 막 공개된 프로젝트라서, 대형 저장소나 특이한 파일에서는 직접 검증해보는 게 좋아요.

마무리

한 줄 정리: OmniDiff는 '줄'이 아니라 '내용'을 보고 비교하려는 Rust 기반 difftool이에요. 개인 설정만 바꾸면 바로 써볼 수 있어요.

여러분은 리뷰할 때 어떤 diff 도구를 쓰세요? 기본 git diff로 충분하다는 쪽인지, difftastic이나 delta를 쓰고 계신지 경험을 공유해주세요!


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://github.com/ivankovic/omnidiff
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...