무조건 git commit -m으로만 커밋 메시지를 작성했던 지난 날.. 이걸로만은 한계를 느껴 커밋 메시지에 대해 좀 더 알아보았다.
Commit Options
커밋 메시지 작성
- -m: 인라인 형식으로 바로 커밋 메시지 작성
git commit -m "커밋 메시지"
- -a 또는 --all: 별도의 add 명령어를 사용하지 않고, 수정된 모든 파일에 대해 add, commit을 한번에 수행(단, 한번도 add되지 않은 파일은 add를 따로 해주어야 함)
git commit -a -m "커밋 메시지"
- -am: a, m 옵션을 합친 형태(파일을 스테이지에 올리고 커밋)
git commit -am "커밋 메시지"
커밋 메시지 수정
1. 커밋을 push하기 전인 경우
- --amend 옵션으로 가장 최근에 만든 커밋 메시지 수정하기
git commit --amend -m "수정할 커밋 메시지"
- 수정하고자 하는 커밋이 가장 최근 커밋이 아닌 경우
git rebase -i HEAD~[숫자]
숫자는 최근까지 실행된 커밋 중 몇 개까지 살펴볼 것인지를 말한다. 예를 들어 2를 입력 시, 최근 커밋보다 이전에 커밋된 2개의 git 메시지를 수정 가능하다.
위 명령어를 통해 수정화면에 들어가면 각 커밋 앞에 pick이 적혀있다.
수정하고자 하는 커밋 앞의 pick을 reword로 변경한 뒤 저장하면 해당 커밋을 수정할 수 있는 창이 열린다. (i를 눌러 내용을 수정하고, esc를 누른 후 :wq를 입력하면 저장할 수 있다.)
자세한 과정은 아래에 있는 gif를 참고하면 된다.
2. 커밋을 이미 push한 경우
이 경우 다른 개발자들이 해당 변경사항을 이미 pull 받았을 수도 있기 때문에 커밋 메시지를 수정하는 것을 권장하지 않는다. 하지만 그럼에도 불구하고 반드시 수정해야 하는 경우라면 위에서 설명한 방법으로 커밋 메시지를 수정한 후 git push --force를 입력하면 된다.
-amend 또는 rebase -i HEAD~로 커밋 메시지 수정
git push --force
Commit Message Convention
커밋 메시지 컨벤션이란 프로젝트 참여자들이 일관된 형식의 커밋 메시지를 작성하기 위한 규칙을 말한다.
커밋 컨벤션의 중요성
일관된 커밋 메시지의 형태를 유지하면 가독성을 높일 수 있고, 소스 변경 이력을 효율적으로 추적할 수 있다.
또한 코드 리뷰 및 버그 수정 과정에서 불필요한 의사소통 과정을 간소화해 프로젝트 관리에 들어가는 시간을 줄일 수 있다.
기본 포맷
일반적으로 아래와 같은 형태로 작성한다.
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
type과 description은 필수적으로 작성하고, scope, body, footer는 필요에 따라 작성해주면 된다. (e.g. feat: 로그인 기능 추가)
type에는 상황에 따라 다음과 같은 단어들이 들어가면 좋다.
- FEAT: 새로운 기능 추가
- FIX: 버그 수정
- DOCS: 문서 수정
- STYLE: 스타일 관련 기능(코드 포맷팅, 세미콜론 누락, 코드 자체의 변경이 없는 경우)
- REFACTOR: 코드 리팩토링
- TEST: 테스트 코드 추가
- CHORE: 빌드 업무 수정, 패키지 매니저 수정(ex .gitignore 수정 같은 경우)
좋은 커밋 메시지를 쓰기 위한 규칙
1. 제목과 본문을 빈 행으로 분리한다.
사소한 변경으로 커밋 메시지를 한 줄만 작성해도 괜찮은 경우도 있다. 이럴 경우에는 본문을 쓰지 않아도 괜찮다.
하지만 어떤 변경 사항인지 맥락과 설명이 필요하다면 본문을 작성해야 한다. 제목과 본문을 구분해서 작성할 때는 무조건 그 사이에 빈 행이 존재해야 제대로 동작한다.
2. 제목 행을 50자로 제한한다.
이는 강제로 제한하는 규칙이 아닌 경험에 의한 규칙이다.
이 길이로 하면 읽기 편하고, 작성자가 무슨 일이 일어나는지 간결하게 작성하는 데 집중할 수 있도록 돕게 된다.
(제목을 요약하는 것이 너무 어렵다면 한 번에 커밋하기에 너무 많은 변경을 포함하는 경우일 수도 있다.)
3. 제목 행 첫 글자는 대문자로 쓴다.
4. 제목 행 끝에 마침표를 넣지 않는다.
5. 제목 행에 명령문을 사용한다.
6. 본문을 72자 단위로 개행한다.
7. 어떻게 보다는 무엇과 왜를 설명한다.
'왜' 이렇게 바꾸었는지에 먼저 주목하자. 바꾸기 전에 무엇을 했는지(무엇이 잘못 동작했는지), 지금은 어떻게 동작하는지, 그리고 왜 당신이 그렇게 바꾸기로 했는지에 대해 적자.
Commit Message Template
커밋 메시지 템플릿을 이용하면 일관된 커밋 메시지를 작성하도록 유도할 수 있다.
기본 구조가 적힌 템플릿 파일을 생성한 후, git config commit.template 명령어로 해당 템플릿 파일을 git config에 등록하면 템플릿을 사용할 수 있다.
템플릿 파일 작성하기
먼저 .gitmessage.txt라는 이름의 파일을 생성한 후, 파일에 아래 내용을 붙여넣고 저장한다.
################
# <타입> : <제목> 의 형식으로 제목을 아래 공백줄에 작성
# 제목은 50자 이내 / 변경사항이 "무엇"인지 명확히 작성 / 끝에 마침표 금지
# 예) FEAT: 로그인 기능 추가
# 바로 아래 공백은 지우지 마세요 (제목과 본문의 분리를 위함)
################
# 본문(구체적인 내용)을 아랫줄에 작성
# 여러 줄의 메시지를 작성할 땐 "-"로 구분 (한 줄은 72자 이내)
################
# 꼬릿말(footer)을 아랫줄에 작성 (현재 커밋과 관련된 이슈 번호 추가 등)
# 예) Close #7
################
# FEAT: 새로운 기능 추가
# FIX: 버그 수정
# DOCS: 문서 수정
# STYLE: 스타일 관련 기능(코드 포맷팅, 세미콜론 누락, 코드 자체의 변경이 없는 경우)
# REFACTOR: 코드 리팩토링
# TEST: 테스트 코드 추가
# CHORE: 빌드 업무 수정, 패키지 매니저 수정(ex .gitignore 수정 같은 경우)
################
#으로 시작하는 부분은 주석으로, 커밋에 반영되지 않는다.
아래 명령어를 통해 템플릿 파일을 설정할 수 있다. 이렇게하면 git commit 명령을 실행할 때 지정한 템플릿 메시지를 편집기에서 매번 사용할 수 있다.(-m 옵션을 사용하지 않고 git commit만 입력하면 된다.)
git config --global commit.template .gitmessage.txt
config options
따로 범위 옵션을 지정하지 않으면 git은 기본적으로 --local 옵션을 지정한다. 상황에 따라 맞는 옵션을 선택해 지정해주면 된다.
- --system: 해당 시스템에 있는 모든 사용자와 모든 저장소에 적용되는 설정 파일
- --global: 해당 사용자에게만 적용되는 설정 파일(내 로컬에서 커밋하는 모든 프로젝트에서 동일한 템플릿이 적용됨)
- --local: 현재 작업 중인 저장소의 git 디렉토리에 있는 파일을 찾는다. 이 파일은 해당 저장소에만 적용된다.
커밋 메시지 작성하기
먼저 git add 명령어를 통해 변경사항이 있는 파일을 스테이지에 올린다. 그 후 git commit을 실행한다.(-m 옵션을 빼고 git commit만 입력하면 설정한 템플릿이 나온다.)
vi 에디터가 나오면 i를 눌러 편집모드로 변경 후 내용을 작성한다. 입력이 완료되었으면 esc를 누른 후 :wq를 입력해 저장해주면 커밋이 완료된다.
작업이 끝났다면 git push를 통해 커밋을 원격 저장소에 올릴 수 있다.
커밋 메시지 자동화 툴
git 커밋 메시지를 자동으로 생성하고 관리하기 위한 다양한 자동화 도구들이 있다.
- commitlint: git 커밋 메시지를 검사해 컨벤션을 따르는지 확인
- Husky: git hook을 설정해 커밋 및 푸시 전에 자동화된 작업(커밋 메시지 검사, 코드 포매팅 등)을 설정할 수 있음.
References
https://git-scm.com/docs/git-commit
https://yozm.wishket.com/magazine/detail/1974/
https://velog.io/@bky373/Git-커밋-메시지-템플릿
https://chanhuiseok.github.io/posts/git-4/
https://richone.tistory.com/26