[Git] Commit Message 작성법

나나콘·2023년 12월 14일

Git

목록 보기
1/2
post-thumbnail

🤦‍♂️ 작성하게 된 이유

최근에 회사에서 진행했던 프로젝트에서 여러 팀원들의 커밋 메시지를 살펴보면 명확히 정해진 커밋메시지 없이 커밋한 분들이 많아서 아무 메시지 없이 커밋한 것도 보이고, 너무 많은 수정을 하고 한 번에 커밋한 분도 계셔서 기록과 추적에 용이하지 않았습니다. 이렇게되면 항상 문제가 생겨 되돌아볼때 오래걸리고 본인 조차도 어디서 수정했는지 잘 모르게 됩니다.

저 또한 친구의 sj960126/Commit-message을 보면서 참고하며 사용했지만 좀 더 정확히 알고 사용하고 싶었고 명확한 기준을 정해서 팀원들과 공유하면 좋겠다는 생각을 하고 다음 프로젝트 투입시에는 커밋메시지를 좀 더 명확히 정하고 팀원들이 따를 수 있도록 하고자 작성하게 되었습니다.


⁉ 커밋 메시지란 ?

Git과 같은 분산 버전 관리 시스템에서 개발자가 코드를 변경하고 저장소에 적용할 때마다 커밋 메시지를 작성하여 해당 변경 사항에 대한 설명과 의도를 기록합니다.

규칙에 맞춰 커밋 메시지를 작성해야 하는 이유

  1. 가독성 향상: 다른 개발자나 팀원들이 변경 이력을 빠르게 이해하고 파악할 수 있도록 도와줍니다.

  2. 협업 간의 일관성: 협업 시 오해나 혼란을 최소화하고 코드 변경에 대한 일관성을 유지할 수 있습니다.

  3. 버그 추적 및 유지보수 용이성: 커밋 메시지를 검색하여 특정 기능이나 버그 수정 내용을 쉽게 찾을 수 있습니다.

  4. 프로젝트 이해도 증가: 새로 합류한 개발자나 향후 개발자들에게 프로젝트 이해도를 높여줍니다.

  5. 코드 리뷰 향상: 리뷰어가 변경 사항에 대한 이해를 높이고 적절한 피드백을 제공하기가 더 쉬워집니다.

🪐 Commit Message 구성

{emoji} {type}({scope}): {subject}  //header(제목)
​
{body} //body(본문)
​
{issue tracker} //footer(꼬리말)

{breaking change}

🤝 기본 규칙

다른 개발자들이 커밋의 목적과 변경 내용을 빠르게 이해할 수 있도록 명확하고 간결하게 작성한다.

  • Header(제목)

    1. 제목 행은 (영문 기준) 50글자 이하

    2. 첫 글자는 대문자로 작성

      feat: Add new feature 🟢
      feat: add new feature ❌

    3. 제목 끝에 특수문자 사용 X
      (마침표, 느낌표, 물음표 등)

      open the door 🟢
      open the door.!? ❌

    4. 제목은 명령문으로 사용, 과거형X

      Add user authentication feature 🟢
      Added user authentication feature ❌

  • Body(본문) - 부연설명이 필요한 경우에 작성(생략가능)

    1. 제목과 본문을 빈 행으로 구분

    2. 본문의 각 행은 (영문 기준) 72글자 이하

    3. 어떻게(How) 보다는 무엇(What)과 왜(Why)를 설명한다.

  • Footer(꼬리말) - 생략가능

    1. "유형: #issue tracker ID" 형식으로 사용합니다.

      Resolves: #123

    2. 여러개의 이슈 번호를 적을 때는 쉼표로 구분합니다.

      Resolves: #7, #8


📌 Header(제목)

1. {emoji} (선택사항)

이모지는 간단하게 커밋의 특성을 표현하는 데 사용될 수 있습니다.
동료 개발자들의 커밋 목적이나 의도를 쉽게 식별할 수 있게 됩니다.

더 많은 Gitmoji가 있는 Gitmoji site

Gitmoji 예시

이모지예약어설명원문
🎨: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.

2. {type}

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
stylecode style 변경(Code Formatting, 세미콜론(;) 누락 등)🎨🎨 style: Format code according to style guidelines
design사용자 UI 디자인 변경 (CSS 등)💄💄 style(ui): Update button styles
testtest code, refactoring test code 추가🧪🧪 test(api): Add unit tests for authentication service
revert이전 커밋으로 회귀할 때⏪️⏪ revert: Undo last commit
build빌드 파일 또는 외부 종속성에 영향을 미치는 수정💚
ciCI 설정 파일 수정
chore빌드 업무 수정, 패키지 매니저 수정(.gitignore 수정 같은 경우)⬆️⬇️⬆️ chore(dependencies): Update axios to version 1.6.4
rename파일 혹은 폴더명을 수정한 경우🚚🚚 rename: Change component file names
remove파일을 삭제한 경우🔥🔥 remove: Delete obsolete utility functions

태그중에서 가장 많이 사용하는 것은 featfix입니다.
style, design처럼 로직 변화가 없을 경우에 커밋 메시지에 명시해주는 것만으로도 추후 오류를 찾을 때 많은 도움이 됩니다.

3. ({scope}) (선택사항)

커밋이 어떤 부분에 영향을 미쳤는지를 나타냅니다. 이 부분은 선택적이며, 변경 사항의 범위를 더 명시적으로 표현할 때 사용됩니다.
함수메소드를 직접적으로 명시하기도 합니다.

fix(filter): ...
fix(필터): ...

4. {subject}

커밋의 간단한 한 줄 요약으로, 50자 이내로 작성하는 것이 좋습니다. 변경 사항의 핵심을 나타내야 합니다.

Add user authentication feature
사용자 인증 기능 추가


📋 Body(본문)

{body}

커밋에 대한 자세한 설명이나 배경을 기술하는 부분입니다. 필수는 아니지만, 변경 사항을 더 자세히 설명할 수 있도록 도움이 됩니다.


🔗 Footer(꼬리말) - 선택사항

주로 커밋과 관련된 이슈 트래킹, 변경 사항의 영향 등에 대한 추가적인 정보를 기록하는 데 사용됩니다.

issue tracker

  • 해결: Closes(종료), Fixes(수정), Resolves(해결)
  • 참고: Ref(참고), Related to(관련), See also(참고)
  1. resolves(관련 이슈 해결): 이 커밋이 특정 이슈를 해결한다는 것을 명시합니다.

    resolves: #123
  2. refs(참조) : 이 커밋이 특정 이슈를 참조한다는 것을 명시합니다.

    refs: #456
  3. closes(이슈 닫힘) : 이 커밋이 특정 이슈를 해결했으며, 해당 이슈를 닫을 때 사용합니다.

    closes: #789

breaking changes (중요한 변경 사항)

: 소프트웨어의 새로운 버전이나 업데이트에서 기존 버전과 호환되지 않는, 즉 기존 코드나 동작에 중요한 변화를 가져오는 변경을 의미합니다. 이는 주로 API 변경, 데이터베이스 스키마 변경, 라이브러리 버전 업그레이드 등이 해당될 수 있습니다.

Breaking Changes: API endpoint signature changed
resolves: #123               // 꼬리말 => issue 123을 해결했으며,
ref: #456                                 issue 456 를 참고해야하며,
related to: #7, #8         현재 커밋에서 아직 issue 7과 8이 해결되지 않았다.

🤹‍♀️ Commit Message 작성 예시

  • 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를 작성하게 되면 자기가 작성한 코드뿐만 아니라 팀원 서로의 코드를 이해하고 진행정도를 알기 쉽다고 생각합니다.

이렇게 협업에 도움될 수 있는 공부를 계속하고 정리하여 팀원에게 공유할 수 있도록 하고

다음 프로젝트에는 꼭 적용해서 팀원들에게 도움이 될 수 있도록 해야겠습니다.


📚 References

profile
지식을 기록하고, 경험을 코드로 남겨라.

0개의 댓글