03-02 bisect · worktree · submodule
강력하지만 덜 알려진 세 도구 — 버그 이진 탐색(bisect), 다중 워크트리(worktree), 저장소 중첩(submodule).
강력하지만 덜 알려진 세 도구 — 버그 이진 탐색(bisect), 다중 워크트리(worktree), 저장소 중첩(submodule).
목표: 까다로운 상황을 우아하게 해결하는 도구 갖추기
🔍 git bisect — 버그 도입 커밋 이진 탐색
“언제부터 깨졌지?”를 log₂(N)번의 테스트로 찾는다.
graph LR
GOOD["v1.0 (정상)"] --- MID["중간 커밋들"] --- BAD["HEAD (버그)"]
MID -->|"이진 탐색"| CULPRIT["범인 커밋"]
git bisect start
git bisect bad # 현재(버그 있음)
git bisect good v1.0.0 # 정상이던 시점
# → Git이 중간 커밋으로 이동. 테스트 후:
git bisect good # 또는 git bisect bad
# 반복 → 범인 커밋 자동 특정
git bisect reset # 종료(원래 위치로)
자동화
git bisect start HEAD v1.0.0
git bisect run npm test # 테스트 스크립트로 자동 판정 ⭐
스크립트 exit code로 good(0)/bad(≠0)를 자동 판단해 끝까지 돌린다.
🌳 git worktree — 여러 브랜치 동시 체크아웃
stash 없이, 같은 저장소의 여러 브랜치를 별도 폴더에서 동시에 작업.
git worktree add ../hotfix hotfix # ../hotfix 폴더에 hotfix 브랜치
git worktree add ../review pr-123 # 리뷰용 별도 체크아웃
git worktree list # 워크트리 목록
git worktree remove ../hotfix # 정리
git worktree prune # 삭제된 워크트리 기록 정리
graph TB
REPO[".git (공유)"] --> WT1["메인 폴더: feature"]
REPO --> WT2["../hotfix: hotfix"]
REPO --> WT3["../review: pr-123"]
용도: 기능 작업 중 급한 hotfix, 빌드 돌리며 다른 브랜치 작업, PR 리뷰를 별도 폴더에서.
[!tip] worktree vs stash/clone stash보다 깔끔하고(작업 안 끊김), 별도 clone보다 효율적(
.git공유). 한 브랜치는 한 워크트리에서만 체크아웃 가능.
📦 git submodule — 저장소 안의 저장소
다른 Git 저장소를 특정 커밋에 고정해 포함한다(공유 라이브러리 등).
git submodule add <url> libs/foo # 추가
git submodule status # 상태
git clone --recursive <url> # 서브모듈까지 클론
git submodule update --init --recursive # 클론 후 내용 채우기
git submodule update --remote # 서브모듈을 원격 최신으로
.gitmodules 파일에 경로·URL이 기록된다. 부모 저장소는 서브모듈의 특정 커밋 해시를 추적한다(브랜치 아님).
graph TB
PARENT["부모 저장소"] -->|"고정 커밋"| SUB["libs/foo (별도 저장소)"]
[!warning] 서브모듈의 함정 서브모듈은 커밋을 고정하므로, 서브모듈을 바꾸면 서브모듈에서 먼저 커밋·push 후 부모에서 새 해시를 커밋해야 한다. 잊으면 동료가 “detached HEAD”나 누락을 겪는다. 단순 의존성이면 패키지 매니저나 monorepo가 더 나을 때가 많다.
📋 체크리스트
- bisect로 버그 커밋 수동 탐색
-
bisect run으로 자동 탐색 - worktree로 다중 브랜치 동시 작업
- worktree vs stash/clone 트레이드오프
- submodule 추가·업데이트·재귀 클론
- 서브모듈 커밋 고정의 함정
🔗 관련 노트
- 03-01-Git-내부-객체-모델 — 이전
- 03-03-모노레포와-대용량-관리 — 다음
- 01-05-되돌리기와-복구 — bisect와 디버깅
- Git-상세-가이드 — 고급 도구 요약
마지막 업데이트: 2026-06-02