목표
- CHANGELOG.md 파일을 스크립트로 생성할 수 있게 한다.
- 중요하지 않은 커밋을 무시할 수 있게 한다 (형식 변경 같은 커밋).
- 이력을 탐색할 때 더 나은 정보를 제공한다.
CHANGELOG.md 생성
프로젝트를 진행하다 보면, 여러 번의 릴리스가 이루어지고, 그에 따라 기능 추가, 버그 수정, 중대한 변경 사항들이 발생한다. 이를 관리하기 위해서는 변경 사항을 명확하게 기록하는 것이 중요하다. 이때 `CHANGELOG.md` 파일을 사용하면 버전별로 어떤 변경이 있었는지 한눈에 파악할 수 있다.
하지만 매번 수동으로 변경 사항을 기록하기는 번거로울 수 있다. 다행히 Git 명령어를 통해 자동으로 변경 사항을 추출하여 `CHANGELOD.md` 파일을 생성하는 방법이 있다.
릴리스 이후의 모든 커밋 메시지를 나열하는 명령어
git log <last tag> HEAD --pretty=format:%s
- `<last tag>`: 마지막 릴리스를 나타내는 Git 태크
- `--pretty=format:%s`: 커밋 메시지만 간략하게 보여주기 위한 옵션
릴리스에서 새롭게 추가된 기능만 추출하는 명령어
git log <last release> HEAD --grep feature
- `--grep feature`: 커밋 메시지에서 'feature'라는 단어를 포함한 커밋만 필터링
중요하지 않은 커밋 인식하기
형식 변경 (공백 추가/제거, 들여쓰기 등), 세미콜론 추가/제거, 주석 수정 같은 코드의 로직에 영향을 주지 않는 사소한 커밋들은 `git bisect` 명령어를 사용해 건너뛸 수 있다.
git bisect skip $(git rev-list --grep irrelevant <good place> HEAD)
- `<good place>`: 문제 없는 것으로 간주하는 커밋을 나타낸다. 이 지점부터 HEAD까지의 커밋 중에서 'irrelevant'`라는 단어가 포함된 커밋을 무시한다.
- `--grep irrelevant`: 특정 패턴(여기서는 'irrelevant')을 포함하는 커밋을 찾아 무시한다. 이 부분은 실제로 프로젝트에서 형식 변경에 대한 커밋 메시지 형식을 정하고 그에 맞춰 사용할 수 있다.
커밋 메시지에 더 많은 정보 제공하기
기본적으로 변경된 코드의 위치 정보를 제공하는 것이 좋다.
예를 들어 다음과 같은 메시지는 변경된 위치를 어느 정도 명확히 설명하고 있다.
- `Fix small typo in docs widget (tutorial instructions)`
- `Fix test for scenario.Application - should remove old iframe`
- `docs - various doc fixes`
- `docs - stripping extra new lines`
반면, 다음과 같은 메시지는 위치 정보가 명확하지 않다.
- `fix comment stripping`
- `fixing broken links`
- `Bit of refactoring`
따라서 코드의 특정 부분을 명시하는 규칙을 따르는 것이 좋다.
커밋 메시지 형식
커밋 메시지는 헤더, 본문, 푸터로 나뉜다. 각 부분은 빈 줄로 구분되며, 각 줄의 길이는 100자를 넘지 않도록 작성해야 한다.
<type>(<scope>): <subject>
<body>
<footer>
- 헤더 (Header): 커밋의 요약 정보가 들어간다.
- 본문 (Body): 변경의 동기와 구체적인 설명이 들어간다.
- 푸터 (Footer): 중대한 변경이나 이슈 번호 참조 정보를 포함한다.
Revert 커밋
이전 커밋을 되돌릴 경우, 헤더는 `revert: `로 시작하고, 그 뒤에 되돌리는 커밋의 헤더를 작성한다. 본문에는 `This reverts commit <hash>.`형태로 해당 커밋의 SHA 해시를 기재한다.
예시:
revert: feat($browser): onUrlChange 이벤트 추가
This reverts commit abc1234.
메시지 헤더
헤더는 커밋 메시지의 첫 번째 부분으로, 타입, 스코프(선택적), 주제로 구성된다. 헤더의 형식은 다음과 같다.
<type>(<scope>): <subject>
Allowed `<type>`
커밋이 제공하는 변경 사항의 종류를 나타낸다.
- `feat`(새로운 기능)
- `fix`(버그 수정)
- `docs`(문서 변경)
- `style`(형식 변경, 세미콜론 추가/제거 등)
- `refactor`(리팩토링)
- `test`(테스트 추가)
- `chore`(유지보수 작업)
Allowed `<scope>`
스코프는 커밋이 영향을 미치는 파일 또는 모듈을 명시한다. 예를 들어 `$location`, `$browser`, `$compile`등을 사용할 수 있으며, 특별히 적용할 부분이 없으면 `*`을 사용할 수 있다.
`<subject>` 텍스트
- 변경 사항에 대한 간단한 설명을 적는다.
- 명령형, 현재형으로 작성한다. 예: `change`, `fix` (과거형이나 3인칭 사용 금지)
- 첫 글자는 대문자로 시작하지 않는다.
- 끝에 마침표(`.`)를 붙이지 않는다.
메시지 본문
`<subject>`처럼 명령형, 현재형을 사용하며, 변경에 대한 동기와 이전 동작과의 차이점을 설명한다.
예시:
$browser에 새로운 이벤트를 추가했습니다:
- popstate 이벤트가 있을 경우 전달
- popstate가 없을 경우 hashchange 이벤트 전달
- popstate와 hashchange 모두 없을 경우 폴링 사용
메시지 푸터
푸터에는 중대한 변경 사항이나 이슈 참조를 기록한다,
중대한 변경
모든 중대한 변경 사항은 푸터에 BREAKING CHANGE로 시작하는 섹션을 추가해야 한다. 이 섹션에는 변경 사항과 그 이유, 마이그레이션 방법을 설명한다.
예시:
BREAKING CHANGE: isolate scope bindings 정의가 변경되었으며, 디렉티브 컨트롤러 주입을 위한 inject 옵션이 제거되었습니다.
이슈 참조
해결된 버그는 푸터에 `Closes` 키워드를 사용하여 이슈 번호와 함께 명시한다.
예시:
Closes #123, #245, #992
예시
feat($browser): onUrlChange 이벤트 추가 (popstate/hashchange/polling)
$browser에 새로운 이벤트를 추가했습니다:
- popstate 이벤트가 있을 경우 전달
- popstate가 없을 경우 hashchange 이벤트 전달
- popstate와 hashchange 모두 없을 경우 폴링 사용
BREAKING CHANGE: $browser.onHashChange 제거 (onUrlChange를 사용)
fix($compile): IE9에 대한 몇 가지 유닛 테스트 수정
이전 버전 IE는 HTML을 대문자로 직렬화하지만, IE9는 그렇지 않음...
따라서 대소문자를 구분하지 않도록 수정했습니다.
'Git&GitHub' 카테고리의 다른 글
[Github Error] The requested URL returned error: 403 (0) | 2024.10.03 |
---|---|
[Git] Git Commands (0) | 2024.07.09 |
Introduction to Git and GitHub - 모듈 2(Branching and Merging) (0) | 2024.06.24 |
Introduction to Git and GitHub - 모듈 2(Undoing Things) (0) | 2024.06.24 |
Introduction to Git and GitHub - 모듈 2(Advanced Git interaction) (0) | 2024.06.24 |