본문 바로가기
IT

리눅스 기초 #23] 틀린 그림 찾기의 달인: diff와 patch로 코드의 변화 추적하기

by sunyjiny 2026. 2. 2.
반응형

리눅스 기초 시리즈의 23번째 시간입니다! 지난 시간에는 터미널에서 데이터를 엑셀처럼 다루는 sed와 awk를 배웠습니다. 오늘은 개발자의 일상에서 가장 많이 발생하는 상황 중 하나인 **"뭐가 바뀐 거지?"**라는 질문에 답을 주는 명령어를 소개하려 합니다.

코드를 수정하다 보면 어제는 잘 돌아가던 코드가 오늘 갑자기 에러를 뿜어낼 때가 있습니다. "어제랑 오늘 소스 코드가 뭐가 다르지?"라고 눈을 부릅뜨고 찾아보지만, 쉼표 하나, 오타 하나는 쉽게 눈에 띄지 않죠. 오늘은 터미널계의 '틀린 그림 찾기' 전문가, **diff**와 patch 활용기를 공유합니다.


1. 나의 경험담: "소스 코드 미세 오타, 범인은 쉼표였다"

제 블로그 sunyjini.com에 올릴 Flutter 예제 코드를 수정하던 중이었습니다. 분명히 한 줄만 고친 것 같은데, 갑자기 빌드 에러가 났죠. Ctrl+Z를 눌러 되돌리기를 반복하다가 결국 어느 부분이 문제인지 더 꼬여버렸습니다.

평소 같으면 두 파일을 나란히 띄워놓고 눈으로 비교했겠지만, 이미 수백 줄이 넘어가는 코드라 불가능에 가까웠습니다. 그때 터미널에 **diff**를 입력했습니다. 단 1초 만에 제가 실수로 지워버린 세미콜론(;) 위치를 정확히 짚어주더군요. 눈으로 10분을 헤매던 일을 명령어 한 줄이 해결해 준 순간이었습니다.


2. diff: "두 파일의 차이점을 낱낱이 밝혀라"

**diff (Difference)**는 두 개의 텍스트 파일을 비교하여 다른 부분을 출력해 주는 명령어입니다. 단순히 "다르다"라고 말하는 게 아니라, 어느 줄에 어떤 내용이 추가되거나 삭제되었는지 상세히 알려줍니다.

실험 코드: 두 파일 비교하기

Bash
 
# 1. 원본 파일(old.txt) 생성
echo -e "Apple\nBanana\nCherry" > old.txt

# 2. 수정된 파일(new.txt) 생성 (Banana 삭제, Durian 추가)
echo -e "Apple\nCherry\nDurian" > new.txt

# 3. 두 파일 비교
diff old.txt new.txt

결과 해석:

  • 2d1: 2번째 줄(Banana)이 삭제(delete)됨.
  • 3a4: 원본 3번째 줄 다음에 새로운 4번째 줄(Durian)이 추가(add)됨.
  • <: 첫 번째 파일(old)에만 있는 내용.
  • >: 두 번째 파일(new)에만 있는 내용.

💡 유용한 옵션: -u (Unified format)

실무에서는 -u 옵션을 더 많이 씁니다. +와 - 기호로 차이점을 보여주어 깃허브(GitHub)의 커밋 내역처럼 훨씬 읽기 편합니다.


3. patch: "차이점만 모아 한 번에 업데이트하기"

diff가 차이점을 찾는 도구라면, **patch**는 그 차이점(diff 결과)을 가져와서 파일에 적용하는 도구입니다.

수정된 전체 파일을 보내는 대신, **'바뀐 부분 리스트(Patch 파일)'**만 보내서 상대방의 파일을 업데이트하게 할 수 있죠. 용량이 아주 큰 파일을 다룰 때 매우 효율적입니다.

실험 코드: 패치 파일 만들고 적용하기

Bash
 
# 1. 차이점만 모은 패치 파일(.patch) 생성
diff -u old.txt new.txt > changes.patch

# 2. 패치 적용하기 (old.txt를 new.txt와 똑같이 만듦)
patch old.txt < changes.patch

# 3. 확인
cat old.txt

(▲ Action: 이제 old.txt는 new.txt와 완벽히 동일해졌습니다. "전체 파일을 다시 보내줘"라고 말할 필요 없이, "이 패치 파일만 실행해"라고 말하면 끝나는 것이죠.)


4. diff vs IDE 비교 도구

VS Code나 IntelliJ 같은 에디터에도 훌륭한 비교 도구가 있지만, 터미널 명령어를 써야 하는 이유는 명확합니다.

구분 터미널 diff GUI 비교 도구 (VS Code 등)
속도 매우 빠름, 대용량 파일에 강함 무거운 파일을 열 때 버벅일 수 있음
자동화 쉘 스크립트에 넣어 자동화 가능 사람의 클릭이 필요함
환경 SSH 접속 등 GUI가 없는 서버에서 필수 윈도우/데스크탑 환경 전용
협업 패치 파일만 공유하여 가볍게 소통 전체 소스 코드를 다시 공유해야 함

5. 마치며: Git의 조상님을 만나다

사실 우리가 매일 쓰는 **Git(깃)**의 핵심 원리가 바로 이 diff와 patch입니다. 깃은 파일 전체를 저장하는 게 아니라, 이 '차이점(Delta)'들을 체계적으로 관리하는 거대한 시스템이죠.

오늘 배운 명령어를 이해했다면, 여러분은 이제 깃이 내부적으로 어떻게 작동하는지 그 원천 기술을 마스터하신 셈입니다. 이제 소스 코드가 꼬여도 당황하지 마세요. diff가 여러분의 든든한 조력자가 되어줄 것입니다.

오늘의 인사이트: "비교는 성장의 적이지만, 디버깅의 가장 큰 무기다. 차이점을 아는 것이 해결의 시작이다."


리눅스 기초 23번째 이야기를 마칩니다. 이제 우리는 파일의 변화까지 추적할 수 있게 되었습니다. 다음 시간에는 리눅스 시스템의 시간을 관리하고 예약된 작업을 수행하는 **'자동화의 심장, crontab'**에 대해 다뤄보겠습니다. 24시간 잠들지 않는 서버를 만드는 비결이죠!

오늘 배운 diff 결과가 너무 복잡해 보이시나요? 다음 포스팅에서 diff 결과를 예쁘게 컬러로 보여주는 colordiff 팁을 살짝 알려드릴까요?

반응형