- GOV.UK 작업 중 나온 Dan Carley의 “Convert template to US-ASCII to fix error” 커밋은 작은 코드 변경도 상세한 커밋 메시지를 통해 코드베이스의 장기 문서가 될 수 있음을 보여줌
- 좋은 메시지는 무엇을 바꿨는지보다 왜 바꿨는지를 남기며, 이 사례는
bundle exec rake실행 시 발생한invalid byte sequence in US-ASCII오류와 재현 조건을 구체적으로 기록함 - 오류 문자열과 조사 과정이 함께 남아 있어, 나중에 같은 문제를 만난 사람이
git log --grep이나 GitHub 커밋 검색으로 이전 해결 기록을 찾을 수 있음 - 메시지에는
find -exec,file --mime,iconv같은 Unix 도구 사용 과정도 포함돼 리뷰어와 이후 독자가 문제 해결 흐름을 따라갈 수 있음 - 모든 커밋이 이 정도로 길 필요는 없지만, 맥락·조사 과정·감정까지 남긴 메시지는 팀의 공유된 코드베이스 이해와 신뢰를 쌓는 데 도움이 됨
작은 변경을 장기 문서로 만든 커밋
- Git 커밋 메시지는 잘 쓰면 코드베이스의 생애 동안 유지되는 강력한 문서화 도구가 될 수 있음
- 사례로 든 커밋은 Government Digital Service에서 GOV.UK를 작업하던 시기의 변경임
- 작성자는 Dan Carley이고, 제목은 “Convert template to US-ASCII to fix error”임
- GDS의 공개 개발 방식 덕분에 이런 조직 내부 사례도 외부에서 공유할 수 있음
길이보다 중요한 맥락
- 이 커밋은 코드 변경량에 비해 메시지가 길지만, 핵심 가치는 길이 자체가 아니라 유용한 맥락에 있음
- 같은 변경이 다른 곳에서는
change whitespace,fix bug처럼 짧게 남았을 수도 있음 - Dan은 주변 동료와 이후 독자가 문제의 원인과 해결 과정을 이해할 수 있도록 상세한 기록을 남김
바뀐 내용보다 왜 바뀌었는지
- 좋은 커밋 메시지는 바뀐 내용뿐 아니라 왜 바뀌었는지를 설명함
- 이 커밋은 feature branch에서
/etc/nginx/router_routes.conf내용과 맞추는 테스트를 추가한 뒤, 실행 방식에 따라 결과가 달랐다는 점을 기록함bundle exec rake spec또는bundle exec rspec modules/router/spec로 실행하면 정상 동작함bundle exec rake로 실행하면 각should블록이 실패함- 오류는
ArgumentError: invalid byte sequence in US-ASCII임
- 이런 설명이 없었다면 어떤 도구에서 어떤 파싱 오류가 났는지 추측해야 했을 가능성이 큼
- 원래 작업 맥락은 사람이 잊거나, 팀을 옮기거나, 조직을 떠나면서 쉽게 사라질 수 있음
검색 가능한 오류 기록
- 커밋 메시지 초반에는 변경의 계기가 된 오류 메시지가 그대로 들어 있음
- 같은 오류를 만난 사람은 다음 방식으로 코드베이스에서 이전 기록을 찾을 수 있음
git log --grep "invalid byte sequence"- GitHub commit search
- 검색 결과상 여러 사람이 이 오류를 검색했고, 누가 먼저 문제를 만났는지와 어떤 조치를 했는지도 확인할 수 있었음
문제 해결 과정을 이야기로 남김
- 메시지는 문제가 어떻게 보였는지, 어떤 순서로 조사했는지, 결국 어떻게 고쳤는지를 따라갈 수 있게 구성됨
- 예시로
.with_content(//)matcher를 제거하면 오류가 사라졌고, spec 파일에는 이상한 문자가 없었으며, 같은 인터프리터에서 Puppet을 require하면 재현할 수 있었다는 내용이 포함됨 - 커밋 메시지는 특정 파일·함수·코드 한 줄이 아니라 변경 자체를 문서화하므로, 코드베이스가 거쳐 온 여정을 기록하기 좋은 위치임
팀 지식을 넓히는 부수 효과
- Dan은 조사 단계마다 실행한 명령을 기록했고, 이는 팀 안에서 지식을 가볍게 퍼뜨리는 방식이 될 수 있음
- 독자는 커밋 메시지만으로도 Unix 도구 사용법을 배울 수 있음
find에-exec인자를 전달해 찾은 각 파일에 명령을 실행할 수 있음- 명령 끝에
\+를 붙이면 파일마다 한 번씩 실행하는 대신 여러 파일명을 하나의file명령에 전달함 file --mime은 파일의 MIME 타입을 알려줌iconv라는 도구가 존재함
- 변경을 리뷰하는 사람뿐 아니라 나중에 이 커밋을 찾는 사람도 같은 정보를 얻음
- 충분한 시간과 커밋이 쌓이면 이런 메시지는 팀의 지식 증폭 장치가 될 수 있음
공감과 신뢰를 쌓는 기록
- 커밋 마지막에는 “Now the tests work! One hour of my life I won't get back..”이라는 문장이 있음
- 이 문장은 한 시간 동안 교묘한 버그를 추적한 개발자의 좌절과 해결했을 때의 만족감을 전함
- 단기 해킹이나 프로토타입 코드가 프로덕션에 들어가 뿌리내린 경우에도, 이런 메시지는 모든 변경 뒤에 당시 정보 안에서 최선의 결정을 내린 사람이 있었다는 점을 떠올리게 함
모든 커밋이 길 필요는 없음
- 이 사례는 극단적인 예이며, 특히 이 정도 크기의 모든 커밋에 같은 수준의 상세함을 기대할 필요는 없음
- 그래도 변경 뒤의 맥락을 설명하고, 다른 사람이 배우게 하며, 팀의 코드베이스에 대한 공동 정신 모델에 기여하는 좋은 예임
- 좋은 커밋 메시지와 변경 구조화 도구에 관심이 있다면 다음 자료를 볼 수 있음
- Telling stories through your commits by Joel Chippindale
- A branch in time by Tekin Süleyman