◎ Commit Message 규칙이 필요한 이유!
- 과거 코드에 대한 코드 추적
- 이슈 사항 처리 상황
- 팀원들간의 커뮤니케이션
◎ 좋은 Commit Message를 작성하기 위한 규칙들
- 제목과 본문을 빈 행으로 구분하기
- 제목을 50글자 이내로 제한하기
- 제목의 첫 글자는 대문자로 작성하기
- 제목의 끝에는 마침표 넣지 않기
- 제목은 명령문으로! 과거형 사용하지 않기
- 본문의 각 행은 72글자 내로 제한하기
- 본문에서 어떻게 보다는 무엇과 왜를 설명하기
위와 같이 네이밍(Naming)을 명시적이고 규칙적으로 작성해주면 한 눈에 Commit Message를 알아볼 수 있다. 그리고 해당 Commit에 대한 내용을 잘 작성해 준다면 코드를 일일히 분석하지 않아도 해당 커밋의 내용을 알아볼 수 있다.
$ <type>(<scope>): <subject> -- 헤더
<BLANK LINE> -- 빈 줄
<body> -- 본문
<BLANK LINE> -- 빈 줄
<footer> -- 바닥 글
<type>은 해당 Commit의 성격을 나타내며 다음 중 하나여야 한다.
feat : 새로운 기능에 대한 커밋
fix : build 빌드 관련 파일 수정에 대한 커밋
build : 빌드 관련 파일 수정에 대한 커밋
chore : 그 외 자잘한 수정에 대한 커밋(rlxk qusrud)
ci : CI 관련 설정 수정에 대한 커밋
docs : 문서 수정에 대한 커밋
style : 코드 스타일 혹은 포맷 등에 관한 커밋
refactor : 코드 리팩토링에 대한 커밋
test : 테스트 코드 수정에 대한 커밋
<body>는 본문으로 헤더에서 생략한 자세한 내용을 작성한다. 헤더로 충분한 표현이 가능하다면 생략이 가능하다.
<footer>는 바닥글로 어떤 이슈에서 왔는지와 같은 참조 정보를 추가하는 용도로 사용한다.
예를 들어 특정 이슈를 참조하기 위해서 close #321과 같이 사용하면 된다. 이는 main 브랜치로 push될 때 닫아진다.
- 해결(이슈 해결 시) - #123
- 관련(해당 commit에 관련된 이슈 번호) - #321
- 참고(참고할 수 있는 이슈가 있는 경우) - #222
◎ 실전 Commit Message
Feat: 관심지역 알림 ON/OFF 기능 추가(#123)
시군구의 알림을 각각 ON/OFF 할 수 있도록 기능을 추가함
- opnion0055: 구분 코드
해결: close #123
◎ Commit Message로 이슈 자동 종료 시키는 방법
Github는 Commit 메시지에 예약된 키워드를 사용하면 이슈가 자동으로 종료되는 기능을 탑재하고 있다. 이러한 예약어는 Commit 메시지 어느 위치에서나 사용 가능하다.
- 키워드를 이용한 이슈 종료 방법
- 키워드 #이슈번호
사용되는 키워드는 다음과 같다.
- 일반 개발 이슈
- close
- closes
- closed
- 버그 수정
- fix
- fixes
- fixed
- 문의나 요청사항에 대응한 이슈
- resolve
- resolves
- resolved
이슈 종료 예시
# 제목에 이슈 한 개 닫기를 적용한 사례
Close #31 - refactoring wrap-up
* This is wrap-up of refactoring main code.
* main.c
* removed old comments
* fixed rest indentations
* method extraction at line no. 35
# 본문에 이슈 여러 개 닫기를 적용한 사례
Update policy 16/04/02
* This closes #128 - cab policy, closes #129 - new hostname, and fixes #78 - bug on logging.
* cablist.txt: changed ACL due to policy update delivered via email on 16/04/02, @mr.parkyou
* hostname.properties: cab hostname is updated
* BeautifulDeveloper.java: logging problem on line no. 78 is fixed. The `if` statement is never happening. This deletes the `if` block.
위와 같이 commit 메시지를 작성하여 push 하면 브랜치에 따라 이슈가 자동으로 종료된다.
예를 들어 Github 저장소의 Default Branch가 master인 case:
- master 브랜치에 commit 후 push - 해당 번호의 이슈 종료
- child 브랜치에 commit 후 push - child 브랜치가 master 브랜치로 merge하는 시점에 이슈 종료