git commit 사용법과 커밋 메시지 작성법

git commit 사용법과 커밋 메시지 작성법

git commit은 Git에서 가장 핵심적인 명령어라고 할 수 있습니다. 스테이징 영역(staging area)에 올려놓은 변경 내용을 하나의 변경 이력으로 저장소에 기록할 때 사용하는데요. 프로젝트 개발 과정에서 의미 있는 단위로 작업을 나누어 기록해두면, 나중에 특정 시점으로 돌아가거나 다른 사람이 코드 변경 이력을 이해하기 훨씬 수월해집니다.

git add와 git commit

git commit 명령어를 사용하기 전에 반드시 git add로 스테이징 영역에 변경 내용을 올려놔야 합니다. Git은 작업 디렉토리의 모든 변경 내용을 자동으로 기록하지 않고, 개발자가 명시적으로 선별한 변경 내용만 커밋에 포함시키기 때문입니다.

$ git add index.js
$ git commit -m "로그인 유효성 검사 추가"

이렇게 git addgit commit을 분리해둔 덕분에 한 번에 여러 파일을 수정하더라도, 관련 있는 변경 내용끼리 묶어서 커밋을 남길 수 있습니다.

기본 사용법

가장 기본적인 git commit 사용법은 -m 옵션과 함께 커밋 메시지를 직접 넘기는 것입니다.

$ git commit -m "커밋 메시지"

예를 들어, 로그인 기능에 이메일 형식 검증을 추가했다면 이렇게 커밋할 수 있겠죠.

$ git add src/auth/login.js
$ git commit -m "로그인 시 이메일 형식 검증 추가"
[main 3a7b2c1] 로그인 시 이메일 형식 검증 추가
 1 file changed, 15 insertions(+), 2 deletions(-)

-m 옵션 없이 git commit만 실행하면 설정된 텍스트 에디터(보통 Vim이나 Nano)가 열리면서 커밋 메시지를 작성할 수 있는 화면이 나타납니다. 한 줄짜리 간단한 메시지라면 -m 옵션이 편하고, 여러 줄에 걸쳐 상세한 설명을 남기고 싶을 때는 에디터를 사용하는 게 낫습니다.

커밋 메시지 잘 쓰는 법

커밋 메시지는 미래의 나 또는 동료가 코드 변경 이력을 보고 “이 변경이 왜 필요했는지” 빠르게 파악할 수 있도록 작성해야 합니다.

좋은 커밋 메시지를 작성하는 몇 가지 원칙을 소개하면,

우선 제목은 50자 이내로 간결하게 작성하고, 어떤 변경을 했는지 명확히 드러내는 게 좋습니다. "수정", "업데이트" 같은 모호한 표현보다는 "로그인 실패 시 에러 메시지 표시", "사용자 목록 API 페이지네이션 적용" 처럼 구체적으로 적는 게 바람직합니다.

# 나쁜 예
$ git commit -m "수정"
$ git commit -m "버그 fix"

# 좋은 예
$ git commit -m "장바구니에서 수량 0 입력 시 에러 메시지 표시"
$ git commit -m "회원가입 API 응답 시간 개선을 위해 쿼리 최적화"

부연 설명이 필요한 경우에는 제목과 본문을 빈 줄로 구분하여 작성합니다. 이때 -m 옵션을 여러 번 사용하면 각각이 별도의 문단으로 들어갑니다.

$ git commit -m "회원가입 이메일 중복 검사 추가" -m "기존에는 서버에서만 중복을 체크했지만, 사용자 경험 개선을 위해 입력 시점에 실시간으로 중복 여부를 확인하도록 변경했습니다."

git log로 변경 이력을 조회하면 제목만 먼저 보이기 때문에, 제목만으로도 대략적인 내용을 파악할 수 있어야 합니다.

add와 commit 한번에 하기

매번 git addgit commit을 따로 실행하는 게 번거롭다면, -a 옵션(또는 --all)을 쓰면 됩니다.

$ git commit -a -m "설정 파일 경로 수정"

이 옵션은 Git이 이미 추적하고 있는 파일(tracked file)의 수정과 삭제를 자동으로 스테이징하고 바로 커밋합니다. 다만 새로 생성한 파일(untracked file)은 포함되지 않으니 주의하세요. 새 파일까지 포함하려면 먼저 git add로 추가한 후에 커밋해야 합니다.

빈 커밋 만들기

간혹 파일 변경 없이 커밋만 남겨야 할 때가 있습니다. CI/CD 파이프라인을 다시 돌리고 싶다거나, 브랜치의 시작점을 표시하고 싶을 때인데요.

$ git commit --allow-empty -m "CI 재실행"

--allow-empty 옵션을 사용하면 스테이징 영역에 아무것도 없어도 커밋을 생성할 수 있습니다.

마지막 커밋 수정하기

커밋 메시지에 오타가 있거나 빠뜨린 파일이 있을 때, --amend 옵션으로 마지막 커밋을 수정할 수 있습니다.

커밋 메시지만 고치고 싶다면 이렇게 합니다.

$ git commit --amend -m "수정된 커밋 메시지"

파일을 추가로 포함시키고 싶다면, 먼저 해당 파일을 스테이징한 뒤에 --amend를 사용합니다.

$ git add 빠뜨린-파일.js
$ git commit --amend --no-edit

--no-edit 옵션을 붙이면 커밋 메시지는 그대로 유지하면서 스테이징된 파일만 추가됩니다.

한 가지 주의할 점은, 이미 git push로 원격 저장소에 올린 커밋을 --amend로 수정하면 커밋 해시가 바뀌기 때문에 강제 푸시(git push -f)가 필요해집니다. 다른 사람과 공유하는 브랜치에서는 이력 충돌이 발생할 수 있으므로, 원격에 이미 올라간 커밋은 함부로 수정하지 않는 게 좋습니다.

커밋 이력 확인

커밋을 남긴 뒤에는 git log 명령어로 변경 이력을 확인할 수 있습니다.

$ git log --oneline
3a7b2c1 로그인 이메일 형식 검증 추가
f1e2d3c 회원가입 페이지 레이아웃 구현
a4b5c6d 프로젝트 초기 설정

--oneline 옵션을 사용하면 각 커밋을 한 줄로 요약해서 볼 수 있어 전체 흐름을 파악하기 편합니다.

특정 커밋의 변경 내용을 자세히 보고 싶다면 git show 명령어를 사용합니다.

$ git show 3a7b2c1

커밋 되돌리기

이미 남긴 커밋을 취소하고 싶을 때는 git reset 명령어를 사용할 수 있는데요. 상황에 따라 세 가지 모드를 선택할 수 있습니다.

커밋은 취소하되 변경 내용은 스테이징 영역에 그대로 남겨두려면 --soft 옵션을 사용합니다.

$ git reset --soft HEAD~1

커밋과 스테이징을 모두 취소하되 작업 디렉토리의 파일은 건드리지 않으려면 --mixed(기본값)를 사용합니다.

$ git reset HEAD~1

커밋, 스테이징, 작업 디렉토리의 변경 내용까지 전부 없애려면 --hard를 사용합니다.

$ git reset --hard HEAD~1

--hard 옵션은 되돌릴 수 없으니 신중하게 사용해야 합니다.

마치며

git commit은 코드 작업의 이정표를 남기는 명령어입니다. 작고 의미 있는 단위로 자주 커밋하는 습관을 들이면, 코드 리뷰도 수월해지고 문제가 생겼을 때 원인을 추적하기도 한결 쉬워집니다.

더 자세한 내용은 Git 공식 문서를 참고하세요.

This work is licensed under CC BY 4.0 CC BY

Discord