Git worktree로 나눠도 충돌하는 이유: 병렬 코딩의 통합 문제

작성자

카테고리:

여러 코딩 로봇의 결과물을 검토자가 통합하고 검사하는 만화풍 장면
AI로 제작한 만화풍 창작 캐릭터 삽화입니다. 공식 마스코트·실제 제품 화면·실험 또는 벤치마크 증거가 아닙니다.

여러 AI 세션을 동시에 실행할 때 작업 폴더를 분리하면 파일이 뒤섞이는 문제를 줄일 수 있습니다. 하지만 폴더가 나뉘었다고 설계와 요구사항까지 독립적인 것은 아닙니다. 병렬 개발에서는 격리와 통합을 함께 설계해야 합니다.

worktree가 해결하는 범위

Boris Cherny가 공개한 병렬 작업 팁에서도 별도 작업 공간을 활용하는 방식이 등장합니다. Git worktree는 한 저장소의 서로 다른 작업 트리를 두고 작업하는 데 쓰입니다. Claude Code 공식 문서에도 병렬 작업과 격리 관련 안내가 있습니다.

각 작업 공간이 분리되어 있어도 같은 API의 입출력 규칙을 서로 다르게 바꾸면 병합 후 오류가 발생할 수 있습니다. 파일 충돌이 없다는 사실은 기능 충돌이 없다는 뜻이 아닙니다.

함께 실행하기 좋은 작업과 어려운 작업

작업 조합 판단 기준
독립 화면의 문구 수정 공통 구성요소 변경 여부 확인
문서 점검과 테스트 분석 읽기 작업이라 상대적으로 분리 쉬움
API 변경과 해당 화면 구현 계약을 먼저 확정해야 함
같은 데이터 구조의 동시 수정 직렬 진행 또는 명확한 소유권 필요

가상의 예약 서비스라면 도움말 수정과 로그 분석은 나눌 수 있습니다. 예약 상태 값 변경과 알림 기능 구현은 상태 정의를 합의한 뒤 시작하는 편이 낫습니다.

시작할 때 정해야 하는 것

첫째, 각 작업의 기준 브랜치와 수정 범위를 적습니다. 둘째, 공유 인터페이스를 먼저 합의합니다. 셋째, 작업별 확인 결과를 남기는 형식을 통일합니다. 넷째, 통합 순서를 정합니다.

작업이 끝나면 변경 파일 목록만 받지 말고 기대 동작, 실행한 검사, 아직 확인하지 못한 조건을 받으세요. 앞선 변경을 병합한 뒤 후속 작업의 검사를 다시 해야 하는지도 판단합니다.

세션 수를 늘리는 기준

대기 시간이 줄어드는지와 검토 시간이 늘어나는지를 함께 기록합니다. 작성은 빨라졌지만 사람이 차이를 이해하는 데 두 배의 시간이 들면 전체 흐름은 느려질 수 있습니다. 동시에 끝난 결과를 검토할 여유가 없다면 실행 수를 줄이는 것이 합리적입니다.

파일 충돌이 없는데 실행은 실패하는 작은 재현

2026년 10월 12일 편집 검증을 위해 별도 데모 저장소에서 실행했습니다. 사용자의 실제 서비스 장애나 생산성 측정 결과가 아닙니다. 환경: macOS-27.0.1-arm64-arm-64bit-Mach-O, Python 3.14.8, git version 2.54.0 (Apple Git-157).

처음에는 api.py가 status 키를 돌려주고 app.py가 그 키를 읽습니다. 두 worktree를 같은 초기 커밋에서 나눕니다. API 작업은 api.py만 바꾸고 화면 작업은 app.py만 바꾸므로 텍스트 충돌은 발생하지 않습니다.

각 작업과 통합 후 실제 확인 결과
단계 변경 실행 결과
API 작업 status 키를 state로 변경 별도 커밋 생성
화면 작업 status를 읽는 출력에 Current: 추가 분기 안에서는 Current: ready
순서대로 병합 서로 다른 두 파일 변경 두 merge 종료 코드 0
통합 실행 app.py는 이전 키를 읽음 KeyError: ‘status’, 종료 코드 1
계약 맞추기 app.py도 state를 읽도록 수정 Current: ready, 종료 코드 0

같은 현상을 재현하는 순서

새 실험 폴더에서만 실행하세요. 처음 api.py와 app.py를 만들고 초기 커밋을 남긴 뒤 다음처럼 분기합니다.

git init -b main
git add api.py app.py
git commit -m "initial demo"
git worktree add -b api-change ../api-work
git worktree add -b app-change ../app-work

Git 사용자 이름과 이메일 설정이 없는 환경은 첫 커밋 전에 해당 실험 저장소의 로컬 설정이 필요합니다. Python 3가 설치되어 있어야 합니다.

복사해서 사용할 파일 내용
파일 처음 각 분기에서 변경
api.py
def payload():
    return {"status": "ready"}
def payload():
    return {"state": "ready"}
app.py
from api import payload
print(payload()["status"])
from api import payload
print("Current:", payload()["status"])

api-work에서 api.py를 수정해 커밋하고, app-work에서 app.py를 수정해 커밋합니다. app-work에서 python3 app.py는 정상 출력됩니다. main으로 돌아와 아래를 실행하면 파일 병합은 성공하지만 통합 실행은 실패합니다.

git merge api-change
git merge app-change
python3 app.py
# KeyError: 'status'

app.py의 키를 state로 맞춘 뒤 같은 명령으로 Current: ready를 확인합니다. 이 재현이 보여주는 것은 Git의 텍스트 병합과 프로그램의 입출력 계약이 서로 다른 검사라는 점입니다. 실제 서비스의 DB·인증·동시성까지 검증한 예제는 아닙니다.

병합 전에 남길 공유 계약

변경 요청에 “응답 키 status→state / 소비 파일 app.py / 통합 후 Current: ready 출력”처럼 생산자·소비자·완료 기준을 함께 적으세요. 각 분기에서 통과한 검사와 통합 후 필요한 검사를 구분하면 원인을 좁히기 쉽습니다.

공식 근거: Git worktree 문서. 여러 작업 트리는 저장소를 공유하면서 작업 트리별 HEAD와 index를 관리합니다. 문서 확인일: 2026-10-12.

자주 묻는 질문

worktree는 저장소 복사와 같나요? 별도 작업 공간을 제공하지만 Git 저장소와 연결되어 관리됩니다. 환경 설정과 외부 서비스까지 자동으로 분리되는 것은 아닙니다.

테스트 데이터베이스도 분리해야 하나요? 병렬 작업이 같은 데이터를 수정한다면 별도 데이터나 격리 전략이 필요합니다. 파일만 나눠서는 해결되지 않습니다.

병합 충돌이 없으면 끝인가요? 함께 실행했을 때의 사용자 동작을 확인해야 합니다. 특히 API·스키마·환경 변수 변경은 통합 시 다시 살펴보세요.

참고 자료

자료 확인일: 2026년 9월 28일. 기존 도구 소개는 공개 문서 기준입니다. 2026-10-12에 추가한 Git·Python 데모만 별도 환경에서 직접 실행했습니다. AI 도구 설치나 성능 실험은 하지 않았습니다.