본문 바로가기
프로그래밍/개발 이야기

[GIT] reset --(soft/hard/mixed) 쉬운 설명

by JR2 2021. 10. 31.

Git reset 하는 방법에 대해서 알아보겠다.

 

  • soft
  • hard
  • mixed (옵션을 적지 않으면 defualt로 작동)

우선 현재 상태이다.

Head는 TestCommit3 인데, 엄청난 오류로 인해서 TestCommit1 으로 다시 되돌리고 싶다.

 

Reset 설명전에 구조에 대해 간단하게 소개하겠다.

Git에서는 3가지 저장소가 있다.

1. Working Directory (IDE로 작업하는 공간, 로컬로 작업하는 공간)

2. Stage Area (1번에서 작업한 파일을 git add . 으로 Stage에 올릴 시 이 공간으로 오게된다)

3. Repository (Github 온라인에 올라간 파일이다. 2번에서 push를 입력 시 이곳으로 오게된다)

  20b03f9 (commit ID) fddae4a (commit ID) e0b0a7e (commit ID)
Working Directory 1 2 3
Stage Area 1 2 3
Repository 1 2 3

 

아주 당연하게도 이런 구조가 완성된다. 여기에서 1,2,3은 각각의 내용을 나타낸 것이다.

여기서 reset 명령어를 TestCommit1으로 입력하게 되면,

옵션에 관계없이 Repository는 전부 TestCommit1이 된다.

 

하지만 옵션에 따라서 Working Directory, Stage Area가 달라지게 된다.


 

Soft는 TestCommit2, TestCommit3에서 작업한 내용이 아까워서..

작업내용을 보존하면서 TestCommit1으로 돌리기 위한 옵션이다.

혹은 TestCommit1 다음을 TestCommit23으로 바꾸려고 할 때(2와 3을 합쳐서 한 커밋으로 올리려고할 때) 사용할 수 있다.

 

1. TestCommit1의 Commit ID를 기억한다. (20b03f9)

2. git reset --soft 20b03f9 입력.

3. git push -f origin master 입력. (TestCommit2, TestCommit3가 push되었을 때만 사용)

 

TestCommit2,3이 삭제되고 TestCommit1으로 reset된 모습

TestCommit2, TestCommit3의 Commit 로그는 전부 날라가지만, 변경했던 내역에 대해서는 바로 Commit을 할 수 있는 상태로 만들어짐.

즉 Working Directory와 Stage는 3을 가지고 있고, Repository만 1로 변경이 됨.

 


 

Hard는 TestCommit2, TestCommit3에서 작업한 내용을 전부 버려야겠다고

마음 먹었을 때 사용하는 옵션이다.

1. TestCommit1의 Commit ID를 기억한다. (20b03f9)

2. git reset --hard 20b03f9 입력.

3. git push -f origin master 입력. (TestCommit2, TestCommit3가 push되었을 때만 사용)

 

TestCommit2,3이 삭제되고 TestCommit1으로 reset된 모습

마찬가지로 TestCommit2, TestCommit3의 Commit 로그는 전부 날라가고, 변경이력도 전부 날라간 상태가 됨.

즉 Working Directory, Stage, Repository 전부 1로 변경이 됨.

 


Mixed는 TestCommit2, TestCommit3에서 작업한 내용이 아까워서..

작업내용을 보존하면서 TestCommit1으로 돌리기 위한 옵션이다.

1. TestCommit1의 Commit ID를 기억한다. (20b03f9)

2. git reset --mixed 20b03f9 입력. 혹은(git reset 20b03f9 입력)

3. git push -f origin master 입력. (TestCommit2, TestCommit3가 push되었을 때만 사용)

 

TestCommit2,3이 삭제되고 TestCommit1으로 reset된 모습

즉 Working Directory는 3을 가지고 있고, Stage와 Repository는 1로 변경이 됨.

 


reset은 쉽지 않은 내용이고, reset으로 commit을 지운 상태에서도 다시 옛날 commit id로 reset 하면 돌아갈 수 있다.(git reflog로 삭제 내역을 확인가능)

reset보다는 전부 revert를 사용할 것을 권장한다.

댓글