한 파일의 여러 곳을 수정했는데 그 중 변경사항의 일부만 커밋에 반영하고 싶은 상황이라 가정해봅시다. 직접 파일을 수정한 뒤 커밋해도 괜찮지만 그런 상황에서 유용한 명령어가 있습니다.
git add --patch
이 명령어를 실행하면 코드를 일정한 덩어리(hunk)로 쪼개고, 각 덩어리마다 반영여부를 확인하며 staging을 진행합니다.
사실, --patch는 add뿐만 아니라 여러 명령에서 활용할 수 있는 옵션이며 더 나아가 --interactive(대화형) 인터페이스의 일부이기도 합니다. 선택지가 많아 복잡해보이지만 실제로 자주 사용하는 명령은 얼마 없습니다. 코드를 보며 한 번 살펴봅시다.
임의의 세 줄에 수정개소를 추가했습니다.
터미널에서 git add -p .명령을 실행해보면 다음과 같은 화면이 출력됩니다.
git이 이전 commit과 현재 Working Directory를 비교하여 삭제된 줄을 빨간색으로, 추가된 줄을 초록색으로 표시했습니다.
그리고 선택지를 제시하며 이 hunk를 어떻게 처리할 건지 묻고 있네요. (엔터 키나 기타 여백의 변동이 있으면 실제 바뀐 코드보다 큰 덩어리를 표시하기도 합니다.)
그런데 저는 두 번째 변경사항만 적용하고 싶은데 모든 수정개소가 한 덩어리로 표시되었습니다. 이럴 때는 제시된 선택지 중 [y,n,q,a,d,s,e] s를 눌러봅시다.
처음에 제시한 것보다 더 작은 hunk로 분할해서 다시 묻고 있습니다. s가 hunk를 보다 작은 조각으로 쪼개라는 명령이기 때문입니다. 이제 이 hunk를 반영하려면 y, 반영하지 않으려면 n을 누르며 계속 진행하면 add명령을 완료할 수 있습니다.
제 경우에는 안타깝게도 수정개소 2번과 3번을 더 이상 나누지 못했습니다. 변경사항을 쪼개려면 일정 이상의 공간적인 여백이 있어야 하기 때문입니다.
add 명령이 완료되고 나면 Index에 반영된 사항과 실제 Working Directory의 코드가 다르므로 이렇게 파일의 staged 상태가 나뉘게 됩니다. 당장 반영하려는 변경사항은 커밋하고, 아직 Working Directory에 남겨둔 사항은 원하는 작업을 마친 뒤 별도로 commit해줍시다.