[Git] Git reset 명령어 (feat. git reflog로 복구하기)

2022. 2. 13. 15:00·Git & GitHub/Git

 

 

reset의 종류는 3가지이다.

  1. soft 
  2. mixed 
  3. hard 

어떤 영역까지 삭제해야 하는지를 기준으로 나뉘고 아래로 갈 수록 더 많은 영역을 삭제한다.

차례대로 알아가보도록 하자.

 

 

1. soft reset


soft reset는 헤더영역만 삭제(커밋된 내용만 삭제)하는 것으로 주로 커밋로그를 변경할 때 사용된다.

실습을 통해 배워보자.

실습 전제: test1.txt 파일이 first commit으로 들어왔고, test2.txt파일이 second commit으로 들어온 상태이다.

깃 로그를 확인해보자. 그리고 git reset 명령어를 사용해보자.

commit 옆에 해쉬코드가 길게 늘어서 있다. 해쉬코드 4~5글자 정도를 복사해서 명령에 맨 뒤에 넣어주면 된다.

$ git reset --soft 92ba7

현재 버전인 (HEAD->master)라고 되어 있는 것의 해쉬코드를 넣으면 아무일도 일어 나지 않는다. 

이미 현재 버전인 상태이기 때문이다. 예전 버전의 해쉬 코드를 적으면 예전 버전으로 돌아갈 수 있다.

 

 

- git log로 헤더 영역 확인하기

$ git log
commit 92ba72383c65c86471a64865876f4a269b72c447 (HEAD -> master)
Author: BigBell <pythonstrup@gmail.com>
Date:   Thu Feb 10 13:45:49 2022 +0900

    first commit

second commit이 사라진 것을 확인할 수 있다.

 

 

 

- git status로 인덱스 영역 확인하기

$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   test2.txt

인덱스 영역에 commit 명령으로 없어졌던 test2.txt 파일이 다시 생겼을 것이다. 이 파일은 다시 commit 명령어를 통해 헤더 영역으로 넣을 수 있다.  만약 커밋메시지를 잘못 썼을 때 soft reset을 통해 변경하면 쉬울 것이다.

 

 

보너스: 커밋로그가 하나밖에 없을 때 로그바꾸는 법

$ git commit --amend -m "re commit"

 

위 명령어를 사용하면 (HEAD->master)로 설정되어있는 현재 커밋로그를 변경할 수 있다.

커밋로그가 하나밖에 없을 경우, reset을 할 수 없기때문에 위 방법을 사용하면 되겠다.

 

 

 

2. mixed reset


mixed reset는 인덱스 영역, 헤더 영역을 삭제하는 것이다.

작업 영역의 내용 변경이 필요할 때 인덱스, 헤더 영역을 삭제하고 다시 작업하여 add할 때 사용한다.

사실 mixed reset를 사용하기보다는 파일을 수정해서 "커밋 ver.2"식으로 다시 커밋하는 것이 훨씬 편하다. 그렇기 때문에 mixed reset를 사용하는 경우는 거의 없다고 봐도 된다.

 

- 현재 커밋 로그 상태

$ git log
commit 6bbead0e3039a48fe718bf16f7697eeb06c54dfa (HEAD -> master)
Author: BigBell <pythonstrup@gmail.com>
Date:   Thu Feb 10 13:57:21 2022 +0900

    secone commit

commit 92ba72383c65c86471a64865876f4a269b72c447
Author: BigBell <pythonstrup@gmail.com>
Date:   Thu Feb 10 13:45:49 2022 +0900

    first commit

 

mixed reset은  soft reset과 사용 방법은 비슷하다.

$ git reset --mixed 92ba7

 

- git log

$ git log
commit 92ba72383c65c86471a64865876f4a269b72c447 (HEAD -> master)
Author: BigBell <pythonstrup@gmail.com>
Date:   Thu Feb 10 13:45:49 2022 +0900

    first commit

second commit이 삭제된 것을 확인할 수 있다.

 

 

- git status

$ 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)

soft reset과는 다르게 Untracked files로 식별된다. 인덱스 영역에서도 삭제됐기 때문이다.

test2.txt는 현재 작업 영역에서 남아있다. git add를 통해 인덱스 영역에 다시 넣을 수 있다.

 

 

 

 

 

3. hard reset


마지막으로 hard reset은 작업 영역(폴더), 인덱스 영역, 헤더 영역 전부 삭제하는 것으로, 작업 영역 또한 이전 버전으로 되돌리고 싶을 때 사용한다.

 

- 현재 커밋 로그 상태

$ git log
commit 56606c2f421cd0f2ce4e7df5e17c088fc0af5ca9 (HEAD -> master)
Author: BigBell <pythonstrup@gmail.com>
Date:   Thu Feb 10 14:11:39 2022 +0900

    second commit

commit 92ba72383c65c86471a64865876f4a269b72c447
Author: BigBell <pythonstrup@gmail.com>
Date:   Thu Feb 10 13:45:49 2022 +0900

    first commit

 

hard reset을 실행해보자.

$ git reset --hard 92ba7

 

 

- git log

$ git log
commit 92ba72383c65c86471a64865876f4a269b72c447 (HEAD -> master)
Author: BigBell <pythonstrup@gmail.com>
Date:   Thu Feb 10 13:45:49 2022 +0900

    first commit

 

 

-git status

$ git status
On branch master
nothing to commit, working tree clean

남아있는 파일이 없다고 뜬다.

폴더를 직접 확인해보면, test2.txt가 아예 삭제된 것을 확인할 수 있다.

이렇게 삭제한 파일은 휴지통에서도 찾을 수가 없다.

대신 reset --hard 명령어와 reflog 명령어를 통해 복구할 수 있다.

 

 

보너스: 복구하는 방법

- git reflog

$ git reflog
92ba723 (HEAD -> master) HEAD@{0}: reset: moving to 92ba
56606c2 HEAD@{1}: commit: second commit
92ba723 (HEAD -> master) HEAD@{2}: reset: moving to 92ba
6bbead0 HEAD@{3}: commit: secone commit
92ba723 (HEAD -> master) HEAD@{4}: reset: moving to 92ba7
4c45a85 HEAD@{5}: commit: second commit
92ba723 (HEAD -> master) HEAD@{6}: commit (initial): first commit

git reflog 명령어를 사용하면 한 번이라도 커밋했던 로그들을 다 보여준다.

앞에 숫자와 알파벳이 섞인 것은 커밋로그의 해쉬코드이다.

 

- 값 복구하기

$ git reset --hard 56606
HEAD is now at 56606c2 second commit


$ git log
commit 56606c2f421cd0f2ce4e7df5e17c088fc0af5ca9 (HEAD -> master)
Author: BigBell <pythonstrup@gmail.com>
Date:   Thu Feb 10 14:11:39 2022 +0900

    second commit

commit 92ba72383c65c86471a64865876f4a269b72c447
Author: BigBell <pythonstrup@gmail.com>
Date:   Thu Feb 10 13:45:49 2022 +0900

    first commit

reset을 통해 복구한 결과이다. second commit이 다시 돌아와있는 것을 확인할 수 있다.

폴더에도 복구되어 있다.

'Git & GitHub/Git' 카테고리의 다른 글
  • [Git] git branch 사용하기
  • [Git] Git Branch의 개념 (fast-forward와 3-way merge)
  • [Git] 깃(git)의 기초 - 로컬저장소 생성과 초기 설정
  • [Git] Git의 역사와 배경지식
gakko
gakko
좌충우돌 개발기
  • gakko
    MYVELOP 마이벨롭
    gakko
  • 전체
    오늘
    어제
    • 분류 전체보기 (203)
      • Spring (23)
        • Spring (10)
        • Spring Boot (7)
        • Spring Security (1)
        • Hibernate (4)
      • Test (3)
      • 끄적끄적 (6)
      • 활동 (35)
        • 부스트캠프 (23)
        • 동아리 (3)
        • 컨퍼런스 (3)
        • 글또 (5)
        • 오픈소스 컨트리뷰션 (1)
      • 디자인패턴 (0)
      • Git & GitHub (22)
        • Git (13)
        • Github Actions (1)
        • 오류해결 (5)
        • 기타(마크다운 등) (3)
      • 리눅스 (6)
        • 기초 (6)
        • 리눅스 서버 구축하기 (0)
      • Infra (2)
        • Docker (1)
        • Elastic Search (0)
        • Jenkins (1)
        • AWS (1)
      • MySQL (7)
        • 기초 (6)
        • Real MySQL (1)
      • 후기 (3)
        • Udemy 리뷰 (3)
      • CS (26)
        • 웹 기본지식 (0)
        • 자료구조 (13)
        • 운영체제 OS (12)
        • 데이터베이스 (1)
        • 시스템 프로그래밍 (0)
        • 기타 (0)
      • Tools (1)
        • 이클립스 (1)
        • IntelliJ (0)
      • 프로젝트 (1)
        • 모여모여(부스트캠프) (1)
      • JAVA (32)
        • Maven (6)
        • 오류해결 (11)
        • 자바 클래스&메소드 (1)
        • JSP & Servlet (12)
      • Javascript (5)
        • 기초 (3)
        • React (2)
      • Python (28)
        • 파이썬 함수 (9)
        • 알고리즘 문제풀이 (16)
        • 데이터 사이언스 (2)
        • 웹 크롤링 (1)
      • 단순정보전달글 저장소 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 우진님
  • 공지사항

  • 인기 글

  • 태그

    Spring
    자바
    Python
    jsp
    MySQL
    알고리즘
    스프링부트
    스프링
    부스트캠프
    오류해결
    java
    자바스크립트
    운영체제
    Git
    부스트캠프 7기
    부스트캠프 멤버십
    파이썬
    GitHub
    os
    웹개발
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
gakko
[Git] Git reset 명령어 (feat. git reflog로 복구하기)
상단으로

티스토리툴바