내가 한 노력들

[ Git ] 원하는 Commit으로 돌아가고 싶은 경우 (soft와 hard) 본문

IT 공부/git

[ Git ] 원하는 Commit으로 돌아가고 싶은 경우 (soft와 hard)

JONGI-N CHOI 2022. 1. 18. 12:00

Git의 장점중 하나인 Commit을 통해 파일을 스냅샷으로 저장해두기 때문에, 원하던 Commit으로 언제든 되돌아갈 수 있습니다. 

 

 

두개의 Commit이 존재하는데, "Add module [ Add ]"인 상태로 되돌아가고 싶은 경우에는?? 

 

 

git log

git log 명령어를 통해 지금까지의 commit 기록을 확인할 수 있습니다. 

 

git log --oneline

또한, --oneline 옵션을 추가하게 되면, 더욱 하눈에 쉽게 볼 수 있는 형태로도 확인이 가능합니다. 

 

여기서 Add module [ Add ]로 되돌아가기 위해서 해당 commit의 hash값을 복사합니다. 

 


Git reset

git reset 명령을 통해서 원하는 commit위치로 변경할 수 있는데, --soft옵션과, --hard옵션이 존재합니다 (믹스 옵션도 있음) 

 

soft 옵션

git reset --soft <commit ID>

git reset을 하고 다시 git log를 통해서 확인해보면, 돌아가고 싶은 commit 으로 HEAD가 가르키고있는 것을 볼 수 있습니다. 

 

그리고, 이 것을 remote repo 위치에도 저장하기 위해서 git push를 진행할려고 하면 

사진과 같은 에러를 볼 수 있는데, 이유는 remote repo에 있던 파일과 변경이 있기 때문입니다. 

 

git push -f

-f 옵션을 통해서 강제로 push 하겠다는 명령을 입력하면 

 

 

기존에 Add module [ Sub ] 커밋은 사라지고, reset했던 commit만 존재하는 것을 확인할 수 있습니다. 

 

그리고 이 상태에서, 

git status

현재의 git 의 상태를 확인해보니 

 

기존의 변경했던 commit은 남아있는 것을 확인할 수 있습니다. 

 

working dir에 있는 해당 파일을 확인해보면, 최신의 commit상태였던 내용이 유지되어 있습니다. 

 

 

즉, 

--soft옵션을 사용하게 되면  HEAD와 branch 위치만 이동하기 때문에 기존의 working dir나 staging area는 add한 상태로 보존해두기 때문에, commit을 삭제하더라도 데이터가 남아있는 안전한 옵션이라고 할 수 있습니다. 


hard 옵션

git reset --hard <commit ID>

soft에서 한 방법으로 이번엔 --hard옵션으로 바꿔서 진행해보겠습니다. 

 

 

git reset을 하고, push까지 진행한 결과 --soft옵션과 똑같이 동작하는 것을 볼 수 있습니다.

 

하지만, 

git status

git status 명령어를 입력해보면, 아무런 상태변화가 없는 결과가 나옵니다.

 

그 이유는 working dir에 있는 파일의 내용도 git reset한 commit의 내용으로 전부 바뀌게 되기 때문입니다. 

기존의 soft옵션에서는 working dir는 기존의 파일내용을 유지하기 때문에 git status를 입력했을 때, 변경상항이 보였지만, hard는 완전히 git reset한 commit 의 내용으로  working dir가 동기화되기 때문에 아무런 변화가 없습니다.

 

따라서 기존의 데이터가 유지되지 않는다는 특징이 있습니다.