Git에서 가장 최근에 커밋한 내용을 어떻게 되돌릴 수 있을까요?

실수로 잘못된 파일을 커밋했는데, 아직 서버에 푸시를 하지는 않았어요.
어떻게 하면 로컬에 커밋한 내용을 되돌릴 수 있을까요?

Git에서 변경사항을 되돌리는 방법은 resetrevert, 두 가지 명령을 제공합니다.

일반적으로 커밋을 원격저장소(remote)에 푸시(push) 하지 않은 경우에는 reset
푸시한 경우에는 revert 명령을 사용합니다.

질문하신 분은 커밋을 remote에 푸시하지 않으셨다고 하니 reset을 사용하시면 되겠네요.

reset 명령은 다음과 같은 형태로 사용합니다.

git reset [mode] [<commit>]

- mode: --soft, --mixed, --hard
- <commit>: 커밋의 해쉬 혹은 HEAD와 같은 레퍼런스

만약 브랜치의 커밋 로그가 아래와 같고

* 7132c29 - C1 <-- (main/HEAD)  실수로한 커밋  
* 76cb7e5 - C2 
* 6c66025 - C3
* 8777357 - C4

실수로 수행한 커밋이 C1(7132c29)이고, 저장소의 상태를 C2로 되돌리고 싶다면

git reset HEAD~ 라고 명령을 입력하면 커밋 히스토리는 아래와 같이 변경됩니다.

* 76cb7e5 - C2 <-- (main/HEAD)
* 6c66025 - C3
* 8777357 - C4

여기까지가 질문자께서 원하시는 직접적인 해결방법입니다.

명령어에 대해 좀 더 설명 드리면 git reset 명령을 수행하면 HEAD를 지정한 커밋으로 바꿔 저장소의 상태를 변경합니다. HEAD가 변경되면서 커밋 히스토리에서 제거되는 커밋(여기서는 C1커밋)을 어떻게 처리할지는 명령 실행시 [mode] 옵션을 주어서 처리 할 수 있습니다.

명령 실행시 [mode]를 생략하면 --mixed 가 기본모드로 reset을 수행합니다. mode에는 위에 적은 것 같이 --soft, --mixed, --hard 총 세 가지가 있습니다.

 Object DataBase
        ㅣ
      Index
        ㅣ
 Working Directory 

    (저장소 구조)

mode의 동작은 다음과 같습니다.

mode 설명
soft 이력에서 제거하고 내용을 인덱스(Index)에 둡니다.
mixed 이력에서 제거된 내용을 작업 디렉토리(Wokring Directory)에 변경됨 상태로 둡니다.
hard 이력에서 제거된 내용을 완전히 제거합니다.

명령에서 한 가지 더 말씀드리면

git reset HEAD~git reset HEAD~1 과 동일한 명령입니다.
HEAD~1은 HEAD를 기준으로 1개 이전의 커밋이라는 의미입니다.
~ 뒤에 숫자를 생략하면 1이 적용되는 것이죠.

HEAD 를 사용하는 것 대신 git reset 76cb7e5 와 같이 커밋해쉬 값을 직접 입력해서 수행해도 됩니다.

1개의 좋아요