
최근에 회사에서 진행했던 프로젝트에서 여러 팀원들의 커밋 메시지를 살펴보면 명확히 정해진 커밋메시지 없이 커밋한 분들이 많아서 아무 메시지 없이 커밋한 것도 보이고, 너무 많은 수정을 하고 한 번에 커밋한 분도 계셔서 기록과 추적에 용이하지 않았습니다. 이렇게되면 항상 문제가 생겨 되돌아볼때 오래걸리고 본인 조차도 어디서 수정했는지 잘 모르게 됩니다.
저 또한 친구의 sj960126/Commit-message을 보면서 참고하며 사용했지만 좀 더 정확히 알고 사용하고 싶었고 명확한 기준을 정해서 팀원들과 공유하면 좋겠다는 생각을 하고 다음 프로젝트 투입시에는 커밋메시지를 좀 더 명확히 정하고 팀원들이 따를 수 있도록 하고자 작성하게 되었습니다.
Git과 같은 분산 버전 관리 시스템에서 개발자가 코드를 변경하고 저장소에 적용할 때마다 커밋 메시지를 작성하여 해당 변경 사항에 대한 설명과 의도를 기록합니다.
가독성 향상: 다른 개발자나 팀원들이 변경 이력을 빠르게 이해하고 파악할 수 있도록 도와줍니다.
협업 간의 일관성: 협업 시 오해나 혼란을 최소화하고 코드 변경에 대한 일관성을 유지할 수 있습니다.
버그 추적 및 유지보수 용이성: 커밋 메시지를 검색하여 특정 기능이나 버그 수정 내용을 쉽게 찾을 수 있습니다.
프로젝트 이해도 증가: 새로 합류한 개발자나 향후 개발자들에게 프로젝트 이해도를 높여줍니다.
코드 리뷰 향상: 리뷰어가 변경 사항에 대한 이해를 높이고 적절한 피드백을 제공하기가 더 쉬워집니다.
{emoji} {type}({scope}): {subject} //header(제목)
{body} //body(본문)
{issue tracker} //footer(꼬리말)
{breaking change}
다른 개발자들이 커밋의 목적과 변경 내용을 빠르게 이해할 수 있도록 명확하고 간결하게 작성한다.
Header(제목)
제목 행은 (영문 기준) 50글자 이하
첫 글자는 대문자로 작성
feat: Add new feature 🟢
feat: add new feature ❌
제목 끝에 특수문자 사용 X
(마침표, 느낌표, 물음표 등)
open the door 🟢
open the door.!? ❌
제목은 명령문으로 사용, 과거형X
Add user authentication feature 🟢
Added user authentication feature ❌
Body(본문) - 부연설명이 필요한 경우에 작성(생략가능)
제목과 본문을 빈 행으로 구분
본문의 각 행은 (영문 기준) 72글자 이하
어떻게(How) 보다는 무엇(What)과 왜(Why)를 설명한다.
Footer(꼬리말) - 생략가능
Resolves: #123
Resolves: #7, #8
이모지는 간단하게 커밋의 특성을 표현하는 데 사용될 수 있습니다.
동료 개발자들의 커밋 목적이나 의도를 쉽게 식별할 수 있게 됩니다.
더 많은 Gitmoji가 있는 Gitmoji site
| 이모지 | 예약어 | 설명 | 원문 |
|---|---|---|---|
| 🎨 | :art: | 새 기능 | Improve structure / format of the code. |
| ⚡️ | :zap: | 성능 개선 | Improve performance. |
| 🔥 | :fire: | 코드/파일 삭제 | Remove code or files. |
| 🐛 | :bug: | 버그 수정 | Fix a bug. |
| 🚑️ | :ambulance: | 긴급 수정 | Critical hotfix. |
| ✨ | :sparkles: | 새 기능 추가 | Introduce new features. |
| 📝 | :memo: | 문서 추가/수정 | Add or update documentation. |
| 🚀 | :rocket: | 배포 | Deploy stuff. |
| 💄 | :lipstick: | UI/스타일 파일 추가/수정 | Add or update the UI and style files. |
| 🎉 | :tada: | 프로젝트 시작 | Begin a project. |
| ✅ | :white_check_mark: | 테스트 추가/수정 | Add, update, or pass tests. |
| 🔖 | :bookmark: | 릴리즈/버전 태그 | Release / Version tags. |
| ⏪ | :rewind: | 변경 내용 되돌리기 | Revert changes. |
| 🔀 | :twisted_rightwards_arrows: | 브랜치 합병 | Merge branches. |
| ♻️ | :recycle: | 코드 리팩토링 | Refactor code. |
| 🔧 | :wrench: | 구성 파일 추가/삭제 | Add or update configuration files. |
| 🔨 | :hammer: | 개발 스크립트 추가/수정 | Add or update development scripts. |
| 🚚 | :truck: | 리소스 이동, 이름 변경 | Move or rename resources (e.g.: files paths routes). |
| 💡 | :bulb: | 주석 추가/수정 | Add or update comments in source code. |
| 🗃 | :card_file_box: | 데이터베이스 관련 수정 | Perform database related changes. |
| ⬆️ | :arrow_up: | 종속성 업그레이드 | Upgrade dependencies. |
| ⬇️ | :arrow_down: | 종속성 다운그레이드 | Downgrade dependencies. |
Type은 Commit의 종류를 나타냅니다.
| 태그 | 설명 | 관련 이모지 | 헤더 사용예시 |
|---|---|---|---|
| docs | 단순한 문서 추가 및 수정 | 📝 | 📝 docs(readme): Update installation instructions |
| feat | 새로운 기능 추가 | ✨ | ✨ feat(user-auth): Implement social media login |
| fix | 버그 수정 | 🐛 | 🐛 fix(data-processing): Resolve null pointer issue |
| perf | 성능 개선 | ⚡️ | ⚡ perf(api): Optimize database query for faster response |
| refactor | 기능 추가(feat), 버그수정(fix), 성능 개선(perf)을 제외한 코드 수정 | ♻️ | ♻️ refactor(api): Simplify error handling |
| style | code style 변경(Code Formatting, 세미콜론(;) 누락 등) | 🎨 | 🎨 style: Format code according to style guidelines |
| design | 사용자 UI 디자인 변경 (CSS 등) | 💄 | 💄 style(ui): Update button styles |
| test | test code, refactoring test code 추가 | 🧪 | 🧪 test(api): Add unit tests for authentication service |
| revert | 이전 커밋으로 회귀할 때 | ⏪️ | ⏪ revert: Undo last commit |
| build | 빌드 파일 또는 외부 종속성에 영향을 미치는 수정 | ||
| ci | CI 설정 파일 수정 | ||
| chore | 빌드 업무 수정, 패키지 매니저 수정(.gitignore 수정 같은 경우) | ⬆️⬇️ | ⬆️ chore(dependencies): Update axios to version 1.6.4 |
| rename | 파일 혹은 폴더명을 수정한 경우 | 🚚 | 🚚 rename: Change component file names |
| remove | 파일을 삭제한 경우 | 🔥 | 🔥 remove: Delete obsolete utility functions |
태그중에서 가장 많이 사용하는 것은 feat과 fix입니다.
style, design처럼 로직 변화가 없을 경우에 커밋 메시지에 명시해주는 것만으로도 추후 오류를 찾을 때 많은 도움이 됩니다.
커밋이 어떤 부분에 영향을 미쳤는지를 나타냅니다. 이 부분은 선택적이며, 변경 사항의 범위를 더 명시적으로 표현할 때 사용됩니다.
함수나 메소드를 직접적으로 명시하기도 합니다.
fix(filter): ...
fix(필터): ...
커밋의 간단한 한 줄 요약으로, 50자 이내로 작성하는 것이 좋습니다. 변경 사항의 핵심을 나타내야 합니다.
Add user authentication feature
사용자 인증 기능 추가
커밋에 대한 자세한 설명이나 배경을 기술하는 부분입니다. 필수는 아니지만, 변경 사항을 더 자세히 설명할 수 있도록 도움이 됩니다.
주로 커밋과 관련된 이슈 트래킹, 변경 사항의 영향 등에 대한 추가적인 정보를 기록하는 데 사용됩니다.
resolves(관련 이슈 해결): 이 커밋이 특정 이슈를 해결한다는 것을 명시합니다.
resolves: #123
refs(참조) : 이 커밋이 특정 이슈를 참조한다는 것을 명시합니다.
refs: #456
closes(이슈 닫힘) : 이 커밋이 특정 이슈를 해결했으며, 해당 이슈를 닫을 때 사용합니다.
closes: #789
: 소프트웨어의 새로운 버전이나 업데이트에서 기존 버전과 호환되지 않는, 즉 기존 코드나 동작에 중요한 변화를 가져오는 변경을 의미합니다. 이는 주로 API 변경, 데이터베이스 스키마 변경, 라이브러리 버전 업그레이드 등이 해당될 수 있습니다.
Breaking Changes: API endpoint signature changed
resolves: #123 // 꼬리말 => issue 123을 해결했으며,
ref: #456 issue 456 를 참고해야하며,
related to: #7, #8 현재 커밋에서 아직 issue 7과 8이 해결되지 않았다.
English
✨ feat(Authentication): Add user authentication feature
* Implement user authentication functionality.
* Enhance security by validating user credentials.
* Connect authentication module with user database.
Resolves: #567
한글
✨ feat(인증): 사용자 인증 기능 추가
* 사용자 인증 기능 구현.
* 사용자 자격 증명을 유효성 검사하여 보안 강화.
* 인증 모듈을 사용자 데이터베이스와 연결.
Resolves: #567
++ 추가로 좋은 커밋 메시지를 작성하기 위해 좋은 git commit 메시지를 위한 영어 사전를 참고해보자
저는 항상 제 코드나 제가 일한것을 협업할 때 같이 일하는 팀원이나, 처음보는 사람도 쉽게 이해할 수 있어야 한다고 생각합니다.
그래서 항상 주석도 열심히 달고 문서를 쓸 때도 가이드나 기준을 명확히 정해서 일을 진행합니다.
commit message도 마찬가지라고 생각합니다.
이렇게 기준을 정하고 commit message를 작성하게 되면 자기가 작성한 코드뿐만 아니라 팀원 서로의 코드를 이해하고 진행정도를 알기 쉽다고 생각합니다.
이렇게 협업에 도움될 수 있는 공부를 계속하고 정리하여 팀원에게 공유할 수 있도록 하고
다음 프로젝트에는 꼭 적용해서 팀원들에게 도움이 될 수 있도록 해야겠습니다.