하나씩 차근차근
article thumbnail
Published 2022. 12. 31. 16:23
Git - reset과 reflog를 통한 복구 Git

git 을 사용하다보면 이전 버전으로 복구를 해야하는 상황이 발생합니다.

이번 포스트에서는 이전 커밋과 버전으로 복구를 하는 방법을 알아보겠습니다.

 

rest

git commit 을 되돌리는 명령어로 3가지 옵션이 있습니다.
  • soft : Repository 에 커밋한 내역을 변경할 경우
  • mixed : 인덱스 영역에 반영한 내용의 변경이 필요한 경우
  • hard : 작업영역의 변경이 필요한 경우

사용방법은 git reset --옵션 (커밋 해시값) 을 입력하면 됩니다.

 

reflog

한번이라도 커밋했던 내역들을 확인할 수 있는 명령어

사용방법은 git reflog 를 입력하면 현재까지 커밋한 내역들이 출력됩니다.

실습

soft 옵션

ex01 디렉토리에 test2.txt 를 생성합니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ touch test2.txt

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test2.txt

nothing added to commit but untracked files present (use "git add" to track)

다음으로 git add 와 git commit 을 통해 Repository 에 커밋을 합니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git add .

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git commit -m "두번째 파일"
[master 7f8feac] 두번째 파일
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test2.txt

이때, Repository 에 반영된 커밋을 변경하고 싶을 경우 git reset --soft 를 사용합니다.

먼저 git log 를 통해 각 커밋의 해시값을 알아야합니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git log
commit 7f8feacf9f654e7c95058d1f792aa10d8f7ed242 (HEAD -> master)
Author: jeehwan <tjtojan@naver.com>
Date:   Sat Dec 31 16:06:36 2022 +0900

    두번째 파일

commit 2f8820928ac43e71fbd53963fe6c589d6a00c10f
Author: jeehwan <tjtojan@naver.com>
Date:   Sat Dec 31 15:49:03 2022 +0900

    첫번째 파일

첫번째 파일 commit 해시값은 2f882~ , 두번째 파일의 commit 해시값은 7f8fe~ 입니다.

우리는 두번째 파일 commit 을 변경하기 위해 첫번째 파일 commit 으로 돌아가야 합니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git reset --soft 2f882

위와 같이 git reset --soft (첫번째 파일 commit 해시값) 을 입력해줍니다.

(해시값은 앞의 5자리만 입력해도 됩니다.)

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   test2.txt

다시 git status 명령어를 통해 현재 상태를 확인해보면 test2.txt 가 Repository 에 반영되지 않은것을 볼 수 있습니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git commit -m "두번째 파일 new"
[master e121c73] 두번째 파일 new
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test2.txt

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git log
commit e121c73c43beb4648dc5f63d12f636d94e2de365 (HEAD -> master)
Author: jeehwan <tjtojan@naver.com>
Date:   Sat Dec 31 16:11:59 2022 +0900

    두번째 파일 new

commit 2f8820928ac43e71fbd53963fe6c589d6a00c10f
Author: jeehwan <tjtojan@naver.com>
Date:   Sat Dec 31 15:49:03 2022 +0900

    첫번째 파일

git commit -m "두번째 파일 new" 를 통해 커밋을 하고 git log 를 통해 살펴보면

처음에 커밋한 "두번째 파일" 은 사라지고 새로운 커밋이 생긴것을 알 수 있습니다.

 

mixed 옵션

Repository 에 반영된 커밋이 아닌 인덱스 영역의 내용을 수정해야할 경우에는 mixed 옵션을 사용합니다.

예를들어 test2.txt 의 내용까지 변경을 해서 인덱스 영역과 Repository 에 반영을 할 경우에 해당합니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git reset --mixed 2f882

git reset --mixed (첫번째 commit 해시값) 을 통해 첫번째 commit 으로 돌아갑니다.

이때 soft 옵션과 다른점은 test2.txt 파일이 인덱스 영역에 반영이 되지 않았다는것입니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test2.txt

nothing added to commit but untracked files present (use "git add" to track)

git status 를 통해 확인해보면 test2.txt 가 Untrackted files 로 출력되는것을 볼 수 있습니다.

test2.txt 가 인덱스 영역에 반영이 되지 않았으므로 test2.txt 에 내용을 입력해보겠습니다.

다음으로 git add . 를 통해 인덱스 영역에 반영하고 커밋을 합니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git add .

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git commit -m "두번째 파일 내용 수정"
[master d40fcbe] 두번째 파일 내용 수정
 1 file changed, 1 insertion(+)
 create mode 100644 test2.txt

git log 를 통해 확인해보면 이전에 커밋한 "두번째 파일 new" 가 사라지고

"두번째 파일 내용 수정" 이라는 커밋이 생긴것을 볼 수 있습니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git log
commit d40fcbe0bd1ef62fd63768d5c01ef5842a1f4de8 (HEAD -> master)
Author: jeehwan <tjtojan@naver.com>
Date:   Sat Dec 31 16:21:49 2022 +0900

    두번째 파일 내용 수정

commit 2f8820928ac43e71fbd53963fe6c589d6a00c10f
Author: jeehwan <tjtojan@naver.com>
Date:   Sat Dec 31 15:49:03 2022 +0900

    첫번째 파일

 

hard 옵션

hard 옵션을 사용하게 되면 현재 디렉토리의 작업영역에 있는 파일까지 이전 커밋 상태로 돌아가게 됩니다.

현재 디렉토리에는 test1 과 test2 파일이 있습니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git reset --hard 2f882
HEAD is now at 2f88209 첫번째 파일

이때 hard 옵션을 사용해서 reset 을 하게 되면

작업영역의 test2 파일이 "첫번째 파일" 커밋 시점으로 돌아가서 사라지게 됩니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git log
commit 2f8820928ac43e71fbd53963fe6c589d6a00c10f (HEAD -> master)
Author: jeehwan <tjtojan@naver.com>
Date:   Sat Dec 31 15:49:03 2022 +0900

    첫번째 파일

git log 를 통해 커밋 내역을 확인하면 "첫번째 파일" 커밋만 반영이 되어있는 것을 알 수 있습니다.

 

reflog

git reflog 를 입력하면 현재까지 커밋했던 내역(reset 내역 포함) 을 확인할 수 있습니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git reflog
2f88209 (HEAD -> master) HEAD@{0}: reset: moving to 2f882
d40fcbe HEAD@{1}: commit: 두번째 파일 내용 수정
2f88209 (HEAD -> master) HEAD@{2}: reset: moving to 2f882
e121c73 HEAD@{3}: commit: 두번째 파일 new
2f88209 (HEAD -> master) HEAD@{4}: reset: moving to 2f882
7f8feac HEAD@{5}: commit: 두번째 파일
2f88209 (HEAD -> master) HEAD@{6}: commit (initial): 첫번째 파일

만약, git reset --hard 를 사용해 작업영역의 파일이 사라졌다면 reflog 를 활용해서 복구할 수 있습니다.

test2.txt 에 내용이 작성된 시점으로 돌리기 위해서는 d40fcbe 커밋으로 되돌아가야 합니다.

TEST@DESKTOP-6UMU4VH MINGW64 ~/Desktop/git_workspace/ex01 (master)
$ git reset --hard d40fc
HEAD is now at d40fcbe 두번째 파일 내용 수정

작업영역의 내용까지 커밋시점으로 돌아가야 하므로 hard 옵션을 사용해서

git reset --hard (돌아갈 커밋 해시값) 을 입력합니다.

작업영역을 확인해보면 test2 파일이 나타난것을 볼 수 있으며,

test2.txt 파일에 내용도 입력된 상태로 돌아간 것을 확인할 수 있습니다.

 

이 포스트는 유튜브에 올라온 메타코딩님의 Git 강의를 보고 정리한 내용입니다.
https://www.youtube.com/@metacoding

 

'Git' 카테고리의 다른 글

Git - clone 과 fetch  (0) 2023.01.03
Git - github 프로젝트 push 와 pull  (1) 2023.01.03
Git - 3 way merge  (0) 2023.01.03
Git - fast forward merge  (0) 2023.01.03
Git - 3가지 영역  (0) 2022.12.31
profile

하나씩 차근차근

@jeehwan_lee

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!