실수로 잘못된 파일을 커밋했는데, 아직 서버에 푸시를 하지는 않았어요.
어떻게 하면 로컬에 커밋한 내용을 되돌릴 수 있을까요?
Git에서 변경사항을 되돌리는 방법은 reset
과 revert
, 두 가지 명령을 제공합니다.
일반적으로 커밋을 원격저장소(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
와 같이 커밋해쉬 값을 직접 입력해서 수행해도 됩니다.