Git에서 마지막 커밋 취소하기

작성: 2024.11.09

수정: 2024.11.09

읽는시간: 00 분

Development/Git

반응형

Intro

Git을 사용하다 보면 의도와 다르게 커밋을 하거나, 잘못된 브랜치에서 커밋을 진행하는 실수를 할 때가 있다. 이렇게 한 번 커밋을 하고 나면 --amend 옵션으로 이미 커밋한 내용을 수정하고, force push로 덮을 수 있지만 때로는 커밋 자체를 완전히 취소해야 할 경우도 있다.

이 글에서는 실수로 커밋한 내용을 되돌리기 위한 방법들을 예시와 함께 살펴보고, 각 상황에서 주의할 점에 대해 정리한다.

실습

커밋을 취소해야 하는 상황

커밋 취소가 필요한 상황은 다양하다. 다음과 같은 경우가 대표적이다.

  1. 커밋을 했으나 수정할 내용이 있다: 커밋 메시지나 커밋된 내용에 빠진 부분이 있다면 --amend 옵션을 사용하여 커밋을 수정할 수 있다.
  2. 잘못된 브랜치에서 커밋을 한 경우: 작업 브랜치가 아닌 다른 브랜치에 커밋한 경우, 해당 커밋을 되돌리거나 다른 브랜치로 옮겨야 할 수 있다.
  3. 의도하지 않은 커밋: 작업 중 실수로 의도하지 않은 커밋을 했거나, 원격 저장소에 푸시하기 전에 취소하고 싶을 때, 커밋을 완전히 삭제할 필요가 있다.

각 경우에 대한 해결 방법과 실제 예시를 통해 어떻게 커밋을 취소할 수 있는지 살펴보자.

1. 최근 커밋 수정하기 - git commit --amend

이미 커밋을 했지만, 누락된 파일을 추가하거나 커밋 메시지를 수정하고 싶다면 --amend 옵션을 사용할 수 있다.

git add 추가할_파일
git commit --amend

이렇게 실행하면 수정된 파일이 기존 커밋에 포함되고, 커밋 메시지도 재입력할 수 있는 화면이 열린다.

예시

# 예시 파일 추가 및 커밋
git add example.txt
git commit -m "Add example file"

# 다른 파일 추가 후, 기존 커밋에 포함시키기
git add another_example.txt
git commit --amend

이 경우, another_example.txt 파일은 기존 커밋에 포함되며, 두 개의 파일이 함께 커밋된 것처럼 보이게 된다.

주의: 이 방법은 아직 원격 저장소에 푸시하지 않은 경우에만 사용하는 것이 좋다. 이미 푸시한 커밋을 수정할 경우 협업 중인 다른 개발자에게 혼란을 줄 수 있다. amend 후엔 보통 git push -f로 원격 커밋을 덮어쓴다.

2. 최근 커밋 되돌리기 - git reset

잘못된 브랜치에 커밋했거나, 해당 커밋이 아예 필요 없는 경우 git reset 명령어를 사용해 커밋을 되돌릴 수 있다. 이때 여러 옵션을 통해 소스 코드와 스테이징 상태를 다르게 되돌릴 수 있다.

  • 소스 코드만 되돌리기: --soft 옵션을 사용하면 커밋만 제거하고, 소스 코드와 스테이징 상태는 유지할 수 있다.

    # 커밋만 취소하고 소스 코드는 유지하려면 soft 옵션 사용
    git reset --soft HEAD~1
  • 스테이징을 해제하고 소스 코드는 유지: 옵션을 지정하지 않으면 기본적으로 --mixed가 적용된다. 이 경우 커밋만 취소되고, 파일들은 Unstaged 상태로 돌아간다.

    # 기본 옵션인 mixed를 사용하여 커밋 취소 + 스테이징 해제
    git reset HEAD~1
  • 소스 코드와 함께 되돌리기: --hard 옵션을 사용하면 커밋과 소스 코드 모두 이전 상태로 되돌아간다. 작업내용이 사라지니 주의해서 사용해야 한다.

    # 모든 변경 사항을 이전 상태로 되돌리려면 hard 옵션 사용
    git reset --hard HEAD~1

옵션 없이 git reset HEAD~1를 실행하면 --mixed가 기본값으로 적용된다. 이는 커밋을 취소하면서 스테이징된 파일을 Unstaged 상태로 되돌리며, 소스 코드는 워킹 디렉토리에 그대로 남겨둔다.

3. 커밋을 취소하고 새로운 브랜치로 옮기기 - git stash

잘못된 브랜치에서 작업을 하던 중 커밋까지 진행해 버렸다면, 해당 커밋을 취소하고 원하는 브랜치로 옮기는 방법이 있다.

  1. 먼저, 현재 브랜치에서의 변경 사항을 임시로 저장한다.

    git stash
  2. 이후 원하는 브랜치로 이동한 후, stash에 저장된 변경 사항을 가져온다.

    git checkout 원하는_브랜치
    git stash pop
  3. 마지막으로, 해당 브랜치에서 변경 사항을 커밋하면 된다.

    git add .
    git commit -m "정확한 커밋 메시지"

: git stash pop을 사용하면, stash에 임시로 저장한 변경 사항을 바로 현재 브랜치로 복구할 수 있다.

4. 원격 저장소에 푸시된 커밋 되돌리기

원격 저장소에 이미 푸시한 커밋을 취소해야 하는 경우에는 주의가 필요하다. 이 때문에 개인적으로는 작업하는 branch 는 완전 분리하는걸 선호한다.

  1. 푸시된 커밋을 수정할 경우: --force 옵션을 사용해 푸시한 커밋을 덮어쓸 수 있다. 하지만 다른 개발자가 푸시한 이후에는 사용하지 말 것.

    git reset --soft HEAD~1
    git push origin 브랜치명 --force
  2. revert 커밋 생성하기: 원격 저장소에 푸시된 커밋을 취소할 수 있는 또 다른 방법은 되돌리기 커밋을 만드는 것이다. 이 방법은 협업에 영향을 주지 않으면서 안전하게 커밋을 되돌리는 방법이다. 다만 기존 커밋 내역이 유지되어 revert 커밋 까지 총 2개의 커밋이 발생한다.

    git revert HEAD
    git push origin 브랜치명

주의: 협업 프로젝트에서 --force 옵션을 사용하는 것은 권장하지 않는다. 개인적으는 협업하는 branch에서는 어쩔 수 없이 revert 커밋을 사용한다.

결론

Git에서 커밋을 되돌리는 방법은 상황에 따라 다양하다. 커밋 취소가 필요할 때는 해당 작업이 원격 저장소에 반영된 상태인지, 현재 작업 중인 브랜치에서 안전하게 되돌릴 수 있는지 등을 먼저 고려해야 한다.

커밋을 잘못한 경우 가장 안전한 방법은 git revert로 되돌리기 커밋을 만드는 것이며, 원격에 푸시되지 않은 커밋이라면 reset 명령어를 활용해 깔끔하게 되돌릴 수 있다.

반응형