Git 되돌리기: Reset, Revert, Restore

artp·2025년 9월 29일

git&github

목록 보기
18/18
post-thumbnail

1. 커밋 해시 (Commit Hash)

커밋 해시각 커밋을 식별하는 고유한 ID입니다. Git은 파일의 변경사항을 기록(커밋)할 때마다 이력을 생성하며, 커밋 해시는 이 이력들을 구별하는 데 사용됩니다. reset이나 revert처럼 특정 커밋을 대상으로 하는 작업을 수행할 때 필요합니다.

  • git log 명령어로 커밋 해시를 확인할 수 있습니다.
  • 보통 전체 해시 문자열 대신 앞 7자리 정도의 일부만 사용해도 커밋을 식별할 수 있습니다.
git log

# 출력 예시
# commit 1234567890abcdef1234567890abcdef12345678 (<- 이것이 커밋 해시)
# Author: ...
# Date:   ...
#
#   커밋 메시지

2. git reset: 커밋 이력 되돌리기

reset은 브랜치가 가리키는 커밋을 변경하여 과거의 특정 커밋 시점으로 돌아가는 명령어입니다. 마치 타임머신처럼 지정한 커밋 이후의 이력을 삭제합니다.

주의: reset은 커밋 히스토리를 변경하므로, 원격 저장소에 이미 푸시(push)한 커밋에 대해서는 사용을 주의해야 합니다. 공유된 히스토리를 변경하면 협업 시 큰 문제를 일으킬 수 있습니다.

기본 문법: git reset --<옵션> <커밋 해시>

Reset의 세 가지 옵션

reset 명령어는 옵션에 따라 변경 내용을 어디까지 되돌릴지 결정합니다.

  • --soft: 커밋만 취소합니다. reset으로 되돌아간 커밋의 변경 내용이 스테이징 영역(Staging Area)에 그대로 남아있습니다.

    • 사용 예: 커밋 메시지를 잘못 작성했을 때, 커밋만 취소하고 메시지를 수정하여 다시 커밋하고 싶을 때 유용합니다.
    git reset --soft HEAD~1
  • --mixed (기본 옵션): 커밋과 스테이징을 모두 취소합니다. 변경 내용은 작업 디렉토리(Working Directory)에 파일로 남아있습니다.

    • 사용 예: 커밋에 포함된 파일 구성을 바꾸고 싶을 때, 커밋과 스테이징을 모두 취소하고 원하는 파일만 다시 add하여 커밋할 수 있습니다.
    git reset --mixed HEAD~1 # 또는 git reset HEAD~1
  • --hard: 커밋, 스테이징, 작업 디렉토리의 변경 내용을 모두 삭제합니다. 되돌아간 커밋 이후의 모든 변경사항이 영구적으로 사라집니다.

    • 사용 예: 최근의 커밋과 모든 작업 내용이 완전히 잘못되어 완전히 폐기하고 싶을 때 사용합니다. 매우 위험한 옵션이므로 신중하게 사용해야 합니다.
    git reset --hard <돌아가고-싶은-커밋-해시>

3. git revert: 되돌리기 커밋 생성

revert는 특정 커밋에서 발생한 변경 사항을 취소하는 새로운 커밋을 생성하는 명령어입니다. 기존 커밋 이력을 삭제하는 reset과 달리, revert는 이력을 그대로 유지하면서 되돌리기 내용을 추가합니다.

특징: revert는 기존 히스토리를 변경하지 않고 새로운 커밋을 추가하는 방식이므로, 원격 저장소에 이미 공유된 커밋을 안전하게 되돌릴 때 사용합니다.

기본 문법: git revert <커밋 해시>

# 특정 커밋(예: 1234abcd)의 변경사항을 되돌리는 새 커밋을 생성
git revert 1234abcd

4. git restore: 파일 변경사항 되돌리기

restore는 커밋 이력 전체가 아닌, 특정 파일의 변경사항만을 되돌리는 명령어입니다. 아직 커밋되지 않은 수정 내용을 폐기할 때 유용합니다.

  • 작업 디렉토리의 파일 되돌리기: 파일의 수정 내용을 최근 커밋 시점의 상태로 되돌립니다.

    # 특정 파일의 수정사항을 폐기
    git restore <파일명>
  • 스테이징 영역의 파일 되돌리기: 스테이징된 파일(git add한 파일)을 다시 작업 디렉토리 상태로 되돌립니다. (unstage)

    # 특정 파일을 스테이징 영역에서 내림
    git restore --staged <파일명>

상대적 커밋 참조 (HEAD~n)

커밋 해시 대신 HEAD를 사용하여 현재 커밋을 기준으로 상대적인 위치를 참조할 수 있습니다.

  • HEAD: 현재 브랜치의 가장 최신 커밋
  • HEAD~1: 최신 커밋 바로 이전의 커밋
  • HEAD~2: 2개 이전의 커밋
# 가장 최근 커밋을 soft reset
git reset --soft HEAD~1

# 2개 이전 커밋의 변경사항을 revert
git revert HEAD~2

정리

명령어대상히스토리주 사용 사례
git reset커밋변경 (삭제)아직 공유하지 않은 로컬(개인) 커밋을 되돌릴 때
git revert커밋유지 (추가)이미 공유한 원격(공개) 커밋을 안전하게 되돌릴 때
git restore파일변경 없음아직 커밋하지 않은 파일의 수정 내용을 폐기할 때
profile
donggyun_ee

0개의 댓글