Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

Git이 cherry-pick이 비었다고 하나요? 건너뛰기 전에 인덱스를 확인하세요

커밋할 차이가 없다고 작업 트리가 깨끗하거나 수정이 전달된 것은 아닙니다. 임시 Git 실험 6개로 skip, keep, drop을 고르기 전 확인할 항목을 살펴봅니다.

Git 인덱스와 작업 트리의 차이를 구분하는 원본 도식
원본 개념 일러스트: cached diff가 비어도 스테이징하지 않은 편집은 남을 수 있으므로 둘 다 확인합니다. Watch at Ease

빈 cherry-pick은 변경이 이미 반영됐거나, 의도적으로 만든 빈 표시 커밋을 골랐거나, 충돌 해결 후 스테이징된 차이가 없는 경우일 수 있습니다. 메시지만으로 구분할 수 없습니다.

Git 2.51.1 실험에서는 필요한 편집이 아직 스테이징되지 않았는데도 이 메시지가 나왔습니다. 커밋할 내용과 작업 트리를 구분한 뒤 현재 변경을 건너뛸지 기록할지 결정하세요.

작업 상태와 두 차이를 함께 읽기

git status, git --version, git diff --cached, git diff를 실행하세요. cached diff는 커밋할 내용과 HEAD를, 일반 diff는 작업 트리와 인덱스를 비교합니다. 추적하지 않는 파일도 확인하세요. cached diff가 비어도 일반 diff의 차이가 없어지지 않습니다.

status가 cherry-pick 중인지 rebase 중인지 확인하세요. rebase는 커밋을 재적용하며 내부에서 cherry-pick 표현을 표시할 수 있습니다. 실제 작업에 해당하는 명령을 사용하고, 상태 파일을 삭제하거나 reset --hard로 메시지를 없애지 마세요.

커밋할 변경이 빈 이유 확인

일반적인 단일 부모 커밋은 git show COMMIT으로 읽고 변경, 대상 브랜치, 의도한 해결 결과를 비교하세요. 이미 있는 내용이나 충돌을 전부 대상 버전으로 해결한 결과 모두 스테이징 차이가 없을 수 있지만 의도가 같다는 증거는 아닙니다. 병합 커밋은 주선 부모를 신중하게 선택해야 합니다.

Tower 튜토리얼은 전체 스냅샷을 복사하는 대신 커밋의 차이를 적용한다고 설명합니다. 충돌 처리에서도 해결한 파일을 스테이징한 뒤 계속하도록 안내합니다. 필요한 결과가 작업 트리에만 있다면 검토 후 정확한 경로를 스테이징하고 cached diff를 다시 확인하세요.

현재 상태에 맞는 정책 선택

멈춘 cherry-pick에서 --skip은 현재 커밋을 건너뛰고 나머지를 계속합니다. 그 커밋할 내용을 버리는 것이 의도일 때만 사용하세요. 빈 역사 표시가 필요하다면 인덱스를 먼저 확인하고 안내된 git commit --allow-empty를 실행한 뒤 status에 따라 남은 순서를 계속하세요.

새로 시작할 때 --empty=drop은 나중에 중복된 변경을 처리하며, --empty=keep은 이를 유지하고 --allow-empty도 포함합니다. --allow-empty만 사용하면 처음부터 빈 커밋만 유지하며 모든 중복 pick을 받아들이지 않습니다. 반대로 --empty=drop만으로 처음부터 빈 표시를 허용하지 않습니다. 오래된 Git은 설치된 도움말부터 확인하세요.

임시 실험 6개에서 확인한 결과

Git 2.51.1로 각각 임시 저장소를 만들었으며 원격과 사용자 저장소는 사용하지 않았습니다. 이미 적용된 비어 있지 않은 패치에서 drop은 HEAD 이동 없이 성공했고 keep은 빈 커밋을 만들었으며 --allow-empty만 사용하면 멈췄습니다. 처음부터 빈 커밋도 --empty=drop에서 멈췄습니다. 이는 이미 문서화된 차이를 확인한 결과입니다.

두 커밋 순서에서는 중복된 첫 커밋을 건너뛰자 뒤 파일이 적용되고 CHERRY_PICK_HEAD가 사라졌습니다. 충돌 실험에서는 대상 버전을 스테이징한 뒤 필요한 편집을 스테이징하지 않은 채 남겼습니다. --continue는 빈 pick을 알렸고 --skip은 성공했지만 편집을 스테이징하지 않은 상태로 보존했을 뿐 커밋으로 전달하지 않았습니다. 한 합성 사례이며 모든 skip이 임의의 로컬 편집을 보존한다는 보장은 아닙니다.

경고 소멸보다 실제 전달 검증

선택한 동작 후 status, 관련 log, 두 diff를 다시 읽으세요. 결과 파일에 의도한 수정이 있는지 확인하고 의미 있는 테스트를 실행하며 남은 순서가 끝났는지 확인하세요. 깨끗한 트리, 빈 표시, 명령 성공은 서로 다른 질문에 답합니다. 경고가 사라졌다는 이유만으로 push하지 마세요.

현재 매뉴얼과 갱신된 커뮤니티 답변은 keep/drop/stop을 이미 설명합니다. 추가한 내용은 빈 메시지 아래 스테이징하지 않은 해결 결과를 드러내는 실제 두 diff 감사입니다. 과거 Fork GUI 보고는 2022년에 닫혔고 2026년 재발 댓글은 버전을 제시하지 않았습니다. 정성적 수요 근거일 뿐 모든 현재 Fork 버전이 고장났다는 뜻은 아닙니다.

처음부터 빈 커밋과 중복 변경 정책의 원본 도식
원본 개념 일러스트: 빈 원인에 따라 규칙이 달라지므로 상태와 실제 버전을 확인합니다. Watch at Ease