LainyZine: 프로그래머 가이드 🐣

Git 커밋 취소(reset), 커밋 되돌리기(revert), 덮어쓰기(amend)

Git 저장소에서 코딩을 하다보면 커밋을 아예 취소하거나(git reset), 커밋 내용을 되돌리거나(git revert), 기존 커밋을 덮어써야하는(--amend) 상황이 종종 발생합니다. 이 글에서는 각 명령어들의 사용법과 어떤 상황에서 사용하면 좋을지에 대해서 소개합니다.

git reset: 커밋 취소하기

git reset --hard를 사용하면 현재 작업 위치인 HEAD의 포인터를 특정 위치로 변경해버릴 수 있습니다. 설명이 조금 길어질 수 있습니다만, 일단 방금 전 커밋을 취소하고 싶은 상황을 생각해보겠습니다.

다음과 같이 97f1e31 -> d678197 -> 12741e5 차례로 커밋을 했습니다.

$ git log --oneline
12741e5 (HEAD -> main) Add ThisIsaFile
d678197 Add .gitignore
97f1e31 Readme.md

이 때 마지막 커밋 12741e5을 취소하고 싶습니다. 이 때는 git reset --hard <COMMIT_ID> 명령어로 HEAD가 이전 커밋(d678197)을 가리키도록 합니다.

$ git reset --hard d678197

다시 git loggit status 명령어로 현재 저장소 상태를 확인해봅니다.

$  git log --oneline
d678197 (HEAD -> main) Add .gitignore
97f1e31 Readme.md

$ git status
On branch main
nothing to commit, working tree clean

이제 HEAD는 2번째 커밋인 d678197을 가리키고 있으며, 저장소에 변경사항도 없는 상태입니다.

--hard 옵션은 현재 HEAD에서 추가된 변경사항들을 모두 되돌려줍니다.--hard 옵션을 사용할 때 착각할 수 있지만 아예 Git 저장소에서 관리 하지 않는 파일들(Untracked files)을 추가한 경우 이 파일들은 reset 이후에도 그대로 유지됩니다. 이 파일들까지 삭제하고자 하는 경우 git clean 명령어를 따로 실행해야합니다.

# 삭제 대상(Untracked files) 목록 확인
$ git clean -n

# Untracked files 파일 삭제
$ git clean -f

바로 이전 커밋 상태로 되돌릴 때, 커밋 아이디를 정확히 지정하는 대신 HEAD^, HEAD@{1}, HEAD~1과 같은 표현을 사용할 수도 있습니다. 단, 이 경우 반드시 바로 직전에 커밋을 하고 되돌릴 때만 의도한대로 동작하기 때문에 사용에 주의가 필요합니다(이런 표현을 잘 활용하려면 Git의 reflog 기능을 먼저 공부하는 것이 좋습니다).

$ git reset --hard HEAD^

git revert: 커밋 내용 되돌리기

git reset은 HEAD 위치를 바꿔버려서, 로컬 저장소의 상태를 커밋 이전 상태로 강제 변경해버립니다. 하지만 커밋을 협업중인 원격 저장소에 push해버린 경우, 로컬 저장소에서 커밋을 취소해버리면 원격 저장소와 상태가 틀어져버립니다. 특히 원격 저장소에서 force push를 금지하는 경우, 로컬 저장소의 변경사항을 push할 수 없게 되어버립니다. 이런 경우에는 git revert로 특정 커밋의 내용을 되돌리는 커밋을 하는 방법을 사용해야합니다.

$ git log --oneline
12741e5 (HEAD -> main) Add ThisIsaFile
d678197 Add .gitignore
97f1e31 Readme.md

이 상태에서 12741e5 커밋을 되돌리는 경우 다음 명령어를 실행합니다.

$ git revert 12741e5

커밋 메시지 작성을 위해 EDITOR 환경변수의 에디터가 실행됩니다.

Revert "Add ThisIsaFile"

This reverts commit 12741e5faca7498fe68b7f4ebe8b20b2757dedd6.

기본 메시지 그대로 저장하고 에디터를 종료합니다. 로그를 보면 다음과 같이 Revert 커밋이 추가되었습니다.

$ git log --oneline
2bc76a3 (HEAD -> main) Revert "Add ThisIsaFile"
12741e5 (origin/main) Add ThisIsaFile
d678197 Add .gitignore
97f1e31 Readme.md

여기서는 커밋을 되돌리는 간단한 활용 방법을 소개했습니다. git revert의 동작 원리나 더 다양한 활용에 대해서는 아래 글에서 소개하니

git commit –amend: 커밋 덮어쓰기

커밋의 내용을 덮어쓸 때는 git commitamend 옵션을 사용합니다. 수정할 내용을 스테이징에 반영하고 다음 명령어를 실행해줍니다.

$ git commit --amend

메시지 옵션을 사용하지 않으면 커밋 메시지 작성을 위한 에디터가 실행되고, 메시지를 작성 후 저장해줍니다.

amend의 옵션의 경우 스테이징에 추가된 내용을 반영해주는 동시에 커밋 메시지도 변경해줍니다. 따라서 변경할 내용이 없을 때도 커밋메시지를 변경하고 싶을 때 자주 사용합니다.

LainyZine은 쿠팡 파트너스 활동에 따른 수수료를 제공받습니다.