git commit 명령어 사용법: 커밋 생성과 주요 옵션
Git에서 파일 변경사항을 추적하는 기본 단위는 commit입니다. 커밋을 생성하는 명령어가 바로 git commit입니다. 사용자는 저장하고자 하는 변경사항들을 추려서 하나의 커밋으로 만들 수 있습니다. 커밋 작업은 여러 단계를 거치지만, git commit을 실행했을 때 실제로 커밋이 생성됩니다. 이 글에서는 git commit 명령어의 사용법과 가장 많이 사용하는 옵션들에 대해서 상세히 알아봅니다.
븟 ## git commit 명령어의 기본 사용법 git commit은 Git 저장소에서 변경사항을 커밋으로 저장하는 명령어입니다. 이를 위해서는 먼저 사용자 이름과 이메일을 설정해주어야합니다. Git 설정에 대한 더 자세한 정보는 다음 글을 참고해주세요.
- 관련 글: Git 사용자 이름과 이메일 설정하는 방법
$ git config --global user.name "Your Name"
$ git config --global user.email you@example.com
변경사항이 준비되었다면 git commit 명령어로 커밋을 생성할 수 있습니다. 가장 기본적인 형식은 다음과 같습니다.
git commit -m'<MESSAGE>'
하지만 git commit은 옵션 없이도 사용할 수 있습니다.
git commit
git commit의 실행 결과는 크게 두 가지 경우로 나눌 수 있습니다.
첫 번째는 스테이징 영역이 비어있는 경우입니다. 즉, git add로 스테이징 영역에 추가한 파일이 없는 경우, nothing added to commit 혹은 nothing to commit이라는 커밋할 내용이 없다는 메시지를 출력하면서 프로그램이 종료됩니다.
스테이징 영역에 추가된 파일이 있는 경우 메시지 입력을 위한 에디터가 실행됩니다. 이 때 EDITOR 환경변수에 있는 에디터가 실행됩니다. 여기서는 VS Code를 환경변수에 지정하고 git commit을 실행해보겠습니다.
$ EDITOR="code -w"
$ git commit
hint: Waiting for your editor to close the file...
첫 번째 줄에서는 EDITOR 환경변수를 VS Code로 설정해주었습니다.
- 관련 글: 터미널에서 VS Code 실행하는 방법
이 때 커맨드라인은 대기 상태가 되고, Code가 새창으로 실행됩니다. 에디터가 실행되고, 첫 번째 줄에 커밋 메시지를 입력한(여러 줄도 입력 가능합니다) 다음 변경 내용을 저장하고 에디터를 종료해줍니다. 커밋이 추가되고 git commit가 종료됩니다.
[main 26c97b0] Add README.md
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md
메시지가 길 때는 외부 에디터를 사용하는 게 편리합니다. 커밋 메시지를 간소하게 한 줄 내로 남기고 싶다면 앞에서 소개한 -m 옵션을 사용합니다.
$ git commit -m "Add README.md
여기까지 git commit 명령어로 커밋을 생성하는 기본적인 방법에 대해 알아보았습니다.
git commit 명령어의 주요 옵션#
여기서부터는 git commit 명령어에서 주로 사용하는 핵심 옵션들을 소개하겠습니다. 여기에 있는 옵션 정도만 정확히 알고 있어도, Git 저장소에서 커밋을 자유자재로 다룰 수 있습니다.
--allow-empty-message 옵션: 커밋 메시지 없이 커밋하기#
커밋은 기본적으로 커밋 내용, 커밋 작성자 정보, 커밋 메시지로 구성됩니다. 이 때 커밋 메시지도 필수 항목입니다. git commit은 기본적으로 커밋 메시지 없이 커밋을 생성하지 않습니다.
$ git commit -m ''
Aborting commit due to empty commit message.
커밋 메시지 없이 커밋을 만드는 것을 권장하지는 않지만, ���가능한 것은 아닙니다. 이 때 사용할 수 있는 옵션이 바로 --allow-empty-message입니다. -a와는 다른 옵션이니 주의가 필요합니다. 이 옵션을 사용하면 커밋 메시지 없이 커밋을 만들 수 있습니다. 다음과 같이 사용할 수 있습니다.
$ git commit --allow-empty-message -m ''
git log 명령어로 커밋을 확인해보겠습니다.
commit c13c6fab3e17715ba1603a2efcb6d4b387941f95 (HEAD -> main)
Author: LainyZine <lainyzine.com@gmail.com>
Date: Sat Mar 18 16:43:34 2023 +0900
commit c2a5df6428a2e99aac5040cd98c14eb128fc8c62
Author: LainyZine <lainyzine.com@gmail.com>
Date: Sat Mar 18 15:43:39 2023 +0900
Initialize repository
단, 특별한 사정이 없다면 커밋 메시지 없이 커밋을 만드는 것은 권장하지 않습니다.
--author 옵션: 커밋 작성자 정보 지정#
앞서 커밋 작성을 위해서는 사용자 이름과 이메일을 설정해야한다고 이야기했습니다만, 커밋을 할 때 사용자 정보를 옵션으로 지정하는 것도 가능합니다. --author 옵션은 다음 형식으로 사용합니다.
git commit --author='USER_NAME <USER_EMAIL>'
여기서 USER_NAME은 사용자 이름으로 변경하고, USER_EMAIL은 이메일 주소로 변경해주세요. 이 형식은 git log에 표시되는 형식과 같습니다. 예를 들어 사용자 이름이 LainyZine2023이고, 이메일이 lainyzine.com+2023@gmail.com인 경우 다음과 같이 실행합니다. -m 옵션으로 커밋 메시지를 지정하지 않으면, 에디터가 실행됩니다.
$ git commit --author='LainyZine2023 <lainyzine.com+2023@gmail.com>'
커밋 메시지를 작성하고 에디터를 종료하면 커밋이 생성됩니다. git log로 내용을 확인해봅니다. 커밋 작성자 정보가 --author 옵션에 지정한 값으로 저장된 것을 확인할 수 있습니다.
$ git log
commit 6c01b6d05ef5cf2f10b97b9ccf27e2fd34042e12 (HEAD -> main)
Author: LainyZine2023 <lainyzine.com+2023@gmail.com>
Date: Sat Mar 18 16:50:03 2023 +0900
add REAMDE.md
commit c2a5df6428a2e99aac5040cd98c14eb128fc8c62
Author: LainyZine <lainyzine.com@gmail.com>
Date: Sat Mar 18 15:43:39 2023 +0900
Initialize repository
눈치 채신 분도 있겠지만, Git 커밋의 작성자(Author) 정보는 별도 인증 절차가 없습니다. 다른 사람의 이름이나 이메일을 입력해도 아무런 문제가 없습니다.
실제로 자신이 작업한 내용임을 증명하기 위해서는 GPG 키를 사용해서 커밋에 서명을 해야합니다.
-a 옵션: 모든 변경사항으로 커밋 만들기#
현재 디렉터리의 모든 변경사항을 커밋하고 싶을 때는 -a 옵션을 사용합니다. Git에서는 스테이징 영역을 통해서 원하는 내용만 커밋으로 만들 수 있습니다만, 모든 내용을 반영하고 싶다면 -a 옵션을 사용할 수 있습니다. 단, 이 옵션은 아직 Git 저장소에서 관리되고 있는 Untracked 파일을 자동으로 추가해주지는 않습니다. 이미 Git 저장소에서 관리중인 파일의 수정이나 삭제만 커밋해줍니다. 따라서 가능하면 git add와 git status 명령어로 커밋 내용을 정확히 확인하는 걸 권장합니다.
## 프로젝트의 파일들을 수정한 이후에 실행
$ git -a -m'Fix critical bugs'
-p 옵션: 인터렉티브 모드로 커밋 만들기#
-p 옵션은 변경된 모든 파일을 커밋 대상으로 하되, git add의 -p 옵션과 같은 방식으로 동작합니다. git add의 -p 옵션을 사용하면 인터렉티브 모드로 커밋하고자 하는 내용을 스테이징 영역에 추가할 수 있습니다. 인터렉티브 모드를 사용하면 파일 단위가 아니라 변경사항을 더 작은 덩어리(Hunk)로 스테이징 영역에 추가할 수 있다는 장점이 있습니다.
여기서는 README.md 파일을 수정하고 -p 옵션으로 커밋하는 경우를 가정해보겠습니다.
$ git commit -p -m 'Update README.md'
diff --git a/README.md b/README.md
index d84e332..25a8803 100644
--- a/README.md
+++ b/README.md
@@ -2,10 +2,10 @@
+Hello, world
\ No newline at end of file
(1/1) Stage this hunk [y,n,q,a,d,s,e,?]?
커밋 가능한 단위로 변경 사항을 쪼개서 차분(diff)을 보여주고 스테이징 영역에 추가할지 물어봅니다. 이 때 y를 누르면 해당 변경사항을 포함하고, n을 누르면 포함하지 않습니다. s를 누르면 더 작은 단위로 쪼개서 다시 변경사항을 포함시킬지 물어봅니다.
인터렉티브 모드의 더 자세한 사용법은 다음 문서를 참고해주세요.
--date 옵션: 커밋 작성 시간 지정#
--date 옵션을 사용하면 커밋 시간을 임의로 지정할 수 있습니다. 아래와 같이 실행하면 커밋 시간을 2000년 1월 1일로 지정할 수 있습니다.
$ git commit --date="2000-01-01 00:00:00" -m 'Update README.md'
[main 3fa64ad] Update README.md
Date: Sat Jan 1 00:00:00 2000 +0900
1 file changed, 11 insertions(+)
create mode 100644 README.md
git log 명령어를 실행해보면 커밋 시간이 정상적으로 변경된 것을 알 수 있습니다.
$ git log -n 1
commit 3fa64ade1c9e51e63003f03c227bf4a8348589f5 (HEAD -> main)
Author: LainyZine <lainyzine.com@gmail.com>
Date: Sat Jan 1 00:00:00 2000 +0900
Update README.md
단, 이 옵션은 AuthorDate만 ��경하고 CommitDate에는 영향을 주지 않습니다. git log --pretty=fuller 명령어로 확인해볼 수 있습니다.
$ git log -n 1 --pretty=fuller
commit 3fa64ade1c9e51e63003f03c227bf4a8348589f5 (HEAD -> main)
Author: LainyZine <lainyzine.com@gmail.com>
AuthorDate: Sat Jan 1 00:00:00 2000 +0900
Commit: LainyZine <lainyzine.com@gmail.com>
CommitDate: Sat Mar 18 17:27:28 2023 +0900
Update README.md
커밋의 작성자 정보는 좀 더 정확히는 작성자와 커미터 정보를 따로 가지고 있습니다. 커밋 시간까지 변경하려면 다음과 같이 실행합니다.
$ GIT_COMMITTER_DATE='2000-01-01 00:00:00' git commit --date="2000-01-01 00:00:00" -m'Update README.md'
git log로 확인해보면 두 개의 시간이 모두 정상적으로 변경된 것을 확인할 수 있습니다.
$ git log -n 1 --pretty=fuller
commit 22e91a5b381bb2ac5d4022f696ad9ed4224e9c5f (HEAD -> main)
Author: LainyZine <lainyzine.com@gmail.com>
AuthorDate: Sat Jan 1 00:00:00 2000 +0900
Commit: LainyZine <lainyzine.com@gmail.com>
CommitDate: Sat Jan 1 00:00:00 2000 +0900
Update README.md
--amend로 최신 커밋의 내용과 메시지를 수정하는 방법#
지금까지는 git commit으로 새로운 커밋을 만드는 방법을 알아보았습니다. --amend 옵션은 가장 최근의 커밋 내용을 수정하고 다시 커밋하는 명령어입니다. 예를 들어 index.html 파일을 추가하고 커밋했는데, style.css 파일도 포함하고 싶은 경우를 생각해보겠습니다.
$ touch index.html style.css
$ git add index.html
$ git commit -m'Add index.html'
[main aaf0cbe] Add index.html
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 index.html
index.html을 포함한 커밋이 이미 만들어져버렸습니다. git log로 커밋들을 확인해보겠습니다.
$ git log --oneline
aaf0cbe (HEAD -> main) Add index.html
c2a5df6 Initialize repository
이 때 style.css를 포함한 새로운 커밋을 만들 수도 있습니다만, style.css 파일을 추가하고 commit 명령어 하나로 aaf0cbe 커밋을 덮어쓸 수도 있습니다. 이 때 메시지는 새로운 커밋에 맞춰서 작성해주세요.
$ git add style.css
$ git commit --amend -m'Add index.html and style.css'
[main e8011f2] Add index.html and style.css
Date: Sat Mar 18 17:38:47 2023 +0900
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 index.html
create mode 100644 style.css
커밋을 새로 만들었기 때문에 aaf0cbe 커밋은 덮어씌워져서 사라집니다. 다시 git log로 확인하면 index.html과 style.css 2개 파일이 추가된 커밋이 있는 것을 확인할 수 있습니다.
$ git log --oneline
e8011f2 (HEAD -> main) Add index.html and style.css
c2a5df6 Initialize repository
--amend는 가장 최근 커밋을 덮어쓰는 기능입니다만, 비슷한 명령으로 Git 커밋을 취소하는 reset이나 되돌려주는 revert 명령어가 있으니 참고해주세요.
빈 커밋을 만드는 방법#
커밋은 변경사항을 추적하는 단위입니다만, 필요에 따라서 내용이 비어있는 커밋을 만드는 것도 가능합니다. 일반적이지는 않습니다만, Git 저장소의 이력을 정리하거나, 외부 CI를 트리거하기 위해서 빈 커밋을 만드는 경우가 있습니다. 스테이징 영역이 비어있는 상태에서 다음 명령어를 실행하면 빈 커밋이 만들어집니다.
$ git commit --allow-empty -m 'Add empty commit'
앞서 이야기한 것처럼 특별한 이유가 있는 게 아니라면, 빈 커밋이나 메시지가 없는 커밋은 만들지 않는 것을 권장합니다.
추천 문서#
이 글에서는 자주 사용하는 옵션들을 중심으로 정리했습니다만, git commit은 이외에도 다양한 옵션을 가지고 있습니다. 모든 옵션과 최신 정보는 Git 공식 문서를 참고해주시기 바랍니다.