노트

커밋 메시지와 원자적 커밋

Atomic Commits and Commit Messages

인프라#git · 연결된 개념 10개

쉽게 말하면

원자적 커밋은 이삿짐 상자 하나에 한 방의 짐만 담고 겉면에 무엇을 왜 넣었는지 적어 두는 거예요. 나중에 특정 상자만 풀거나 다시 싸기 쉽고, 문제가 생긴 상자도 금방 찾죠.

비유가 깨지는 곳 상자 겉면에 내용물을 하나하나 다 적을 필요는 없어요. 어떻게 바뀌었는지는 diff가 보여 주니 메시지엔 무엇을 왜 바꿨는지 써요. 여러 파일에 걸쳐도 목적이 하나면 한 커밋이에요.

좋은 커밋은 한 가지 변경만 담고(원자적 커밋, atomic commit), 그 변경이 무엇이고 왜 필요했는지를 메시지로 설명한다. 히스토리는 나중의 나와 동료가 읽는 문서다.

원자적 커밋

  • 한 가지 목적의 변경만 담는다. 여러 파일에 걸쳐도 목적이 하나면 괜찮다
  • 리뷰·되돌리기·cherry-pick이 쉬워지고, git bisect로 원인 커밋 찾기가 원인을 정확한 커밋으로 좁힌다
  • 구조 정리와 동작 변경은 따로 커밋한다(정리(Tidying))
  • 로컬 커밋은 자주 하고, 푸시 전에 인터랙티브 리베이스로 커밋 정리로 다듬는다. 빌드 산출물·의존성·개인 설정 파일은 넣지 않는다

메시지 규칙

  • 제목과 본문은 빈 줄로 나눈다. 제목은 50자 안팎, 본문은 72자 정도에서 줄을 바꾼다
  • 제목 끝에 마침표를 찍지 않는다. 영어라면 명령형 동사로 시작한다(Add, Fix, Remove, Rename…)
  • 본문은 "어떻게"보다 "무엇을, 왜"를 쓴다. 어떻게는 diff가 보여준다

Conventional Commits

타입(범위): 요약 형태로 커밋 종류를 드러내는 관례다. 체인지로그 자동 생성이나 시맨틱 버저닝(Semantic Versioning, SemVer) 도구와 잘 맞는다.

feat(auth): 리프레시 토큰 회전 추가
fix: 빈 장바구니에서 결제 버튼 비활성화

자주 쓰는 타입은 feat·fix·docs·style·refactor·test·chore다. 쓸지 말지, 대소문자를 어떻게 할지는 팀이 정한다. 합의가 없다면 놀랍지 않은 쪽으로 기존 히스토리를 따른다.

출처: How to Write a Git Commit Message · Conventional Commits 1.0.0

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • GitOps

    GitOps는 "환경이 어떤 상태여야 하는가"를 전부 git 저장소에 선언해 두고, git에 적힌 것을 유일한 진실(single source of truth)로 삼아 실제 환경을 맞추는 운영 방식이다. 서버에 직접 손대지 않고, 바꾸고 싶으면 git을 고친다.

  • 『켄트 벡의 Tidy First?』 개요

    켄트 벡이 "코드를 바꾸기 전에 먼저 정리해야 할까?"라는 질문 하나를 붙잡고 쓴 얇은 책. 아주 작은 구조 변경인 정리의 기법, 언제 정리할지의 관리, 왜 그런지의 이론을 차례로 다룬다.

  • 쿠버네티스 핵심 개념

    쿠버네티스는 여러 서버에 컨테이너를 배치하고, 죽으면 다시 띄우고, 트래픽에 맞춰 복제 수를 조절하는 컨테이너 오케스트레이션(container orchestration) 시스템이다. 사람이 하던 서버 운영을 "원하는 상태를 선언하면 계속 맞춰 주는" 제어 루프(control loop)로 자동화한다.

  • git reset (soft·mixed·hard)

    git reset <커밋>은 현재 브랜치가 가리키는 커밋(HEAD)을 옮기는 명령이다. 옵션에 따라 스테이징 영역(staging area, index)과 작업 디렉터리(working directory)까지 함께 되돌릴지가 달라진다.

  • 결합도

    한 요소를 바꿀 때 다른 요소도 바꿔야 하는 관계. 결합도는 언제나 "어떤 변경에 대해" 결합되어 있는지를 함께 말해야 의미가 있다. 같은 두 모듈도 어떤 변경에는 묶여 있고 어떤 변경에는 독립적일 수 있다.

보기 옵션