포스트

Git hunk이란 — diff 덩어리와 부분 스테이징(git add -p)

hunk는 diff에서 @@로 구분되는 연속 변경 덩어리다. 이 단위를 알면 한 파일에 뒤섞인 여러 변경을 git add -p로 골라 커밋을 깔끔하게 나눌 수 있다. 개념과 CLI 흐름을 정리하고, 에디터(gitsigns) 쪽은 별도 글로 잇는다.

Git hunk이란 — diff 덩어리와 부분 스테이징(git add -p)

git add -p나 gitsigns를 쓰다 보면 “hunk”라는 말이 계속 나온다. 커밋을 깔끔하게 나누는 기술의 최소 단위라 알아둘 값이 있다.

hunk = diff의 한 덩어리

hunk는 파일 안에서 연속적으로 바뀐 부분의 한 묶음이다. git diff 출력에서 @@ -10,7 +10,9 @@ 같은 줄로 시작하는 각 구간이 하나의 hunk다.

1
2
3
4
5
@@ -10,7 +10,9 @@ def handler():
     x = load()
-    return x
+    y = transform(x)
+    return y

@@ -10,7 +10,9 @@는 “원본 10번째 줄부터 7줄, 새 버전 10번째 줄부터 9줄 구간”이라는 좌표다. 한 파일에서 10번째 줄 근처와 200번째 줄 근처를 각각 고쳤다면, 떨어진 두 변경은 보통 별개의 hunk로 나뉜다.

왜 중요한가 — 부분 스테이징

한 파일에 성격이 다른 변경이 섞였을 때(버그 수정 + 리팩터링), 파일 전체를 git add 하면 한 커밋에 뭉친다. hunk 단위로 고르면 논리적으로 나눠 커밋할 수 있다.

1
git add -p        # (= git add --patch) hunk 단위로 물어보며 스테이징

각 hunk마다 프롬프트가 뜬다. 자주 쓰는 응답:

동작
y이 hunk를 stage
n건너뜀
shunk를 더 잘게 쪼갬(split)
ehunk를 직접 편집해 일부 줄만 stage
q종료

s로도 안 나뉘는 인접 변경은 e로 diff를 직접 편집해 원하는 줄만 남긴다. git reset -p, git checkout -p, git stash -p도 같은 hunk 단위로 동작한다.

커밋을 깔끔하게 나누는 습관

  • 작업하다 보면 한 파일에 여러 의도가 섞이기 마련이다. 커밋 전에 git add -p로 훑으면 의도별로 분리된다.
  • 리뷰어 입장에서 “한 커밋 = 한 의도”가 읽기 쉽다. hunk 단위 스테이징이 그 규율을 만든다.

에디터에서 — gitsigns

CLI의 git add -p를 Neovim에서 그대로 하는 게 gitsigns다. ]h/[h로 hunk 사이를 이동하고, 커서가 있는 hunk만 :Gitsigns stage_hunk(LazyVim은 <leader>ghs)로 스테이징한다. Visual 모드로 일부 줄만 선택해 hunk보다 더 잘게 고를 수도 있다.

LazyVim의 gitsigns 키맵·동선 상세는 LazyVim Git 플러그인 정리 참고.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.