본문 바로가기
목차
utils/git and github

git restore: commit 이전의 변경사항 취소하기.

by ds31x 2024. 1. 1.
728x90
반응형

https://stackoverflow.com/questions/58003030/what-is-git-restore-and-how-is-it-different-from-git-reset

restore는
stage와  working tree를 이전으로 되돌리는데 사용됨.

 

resetrevertcommit이 이루어진 이후 되돌리기에 주로 사용된다면,

 

restore 는 주로

  • staged가 된 파일을 다시 working directory (or working tree)로 되돌리거나,
  • working tree에 이루어진 수정사항을 최근 commit으로 다시 돌리는 등의

commit 이전 (Working tree 와 Stage) 단계에서의 되돌리기 로 주로 사용된다.


restore 는 말 그대로 되돌리는 것으로 특정 파일을 특정 commit 시점의 상태 로도 되돌릴 수도 있다.

(이 경우 working directory에 해당 commit의 상태로 되돌림. 때문에 staging과 commit 이 추후 이루어져야 함.)

과거엔 checkout 을 통해 제공되던 기능이었으나,
너무 많은 기능이 checkout에서 집중되어서
branch관련은 switch로, 되돌리기는 restore로 분리됨.


사용법 1 : working directory를 최근 stage 내용으로 되돌리기.

git restore <modified_file>
  • 즉, Working directory 에 이루어진 수정사항 (= 아직 commit 이 이루어지지 않은 수정사항)을 취소하고,
    최신의 stage 내용으로 되돌림.
  • 이 방법으로 취소된 수정사항은 복원이 불가능 하니 주의해야함.
    • 현재 변경된 내용을 날려버리면 안되면서도 현재는 우선 되돌려야 한다면,
    • stash 로 임시 저장하거나,
    • 임시로 branch 를 만들어 저장해놓고 restore를 사용해야 함.

사용법 2 : stage의 최신 수정 사항을 취소시켜서 repository의 내용으로 다시 되돌리기 (Unstaging).

git restore --staged <target_file>

<target_file>를 Unstage시킴 : unstage

  • 아직 commit되지 않고 git add 만 이루어진 변경 내용을 취소시킴 (unstage)
  • git restore가 working tree에서의 수정사항( Modified file)을 취소시키는 데 사용된 것처럼,
  • 현재 stage에서의 수정사항 (stage에 올려졌으나 repository에 올려지지 않은 내용)을 취소함.
    • staging만 취소됨 
    • working tree는 그대로임.
  • git restore --staged 대상파일을 사용.

 

참고로, 이 방법보다 git rm --cached 대상파일 을 사용하는 경우도 많다: 대상 파일을 더이상 git으로 관리하지 않게함. 

untracked file이 대상파일이면 같은 동작이 되지만, 대상 파일이 tracked file인 경우에는 차이가 있다.

  • restore는 최근 staging만 취소시키므로 여전히 대상파일이 tracked file이나,
  • rm --cacheduntracked file로 만들어버린다 (둘 다 working tree는 건드리지 않음). 

사용법 3 : 특정 commit 시점의 상태로 특정 파일의 working directory 상태를 변경. **

git restore --source=<복원시점_commit_id> <복원대상_file>
  • <복원시점_commit_id>git log로 확인 가능한 해당 commit의 hashkey임.
    • e.q. 629d37b107ab9015cbb0fd5812360b376aa5f44f
    • 앞의 7자리 정도만 사용해도 됨.
  • working tree 에서 "해당 파일이 지정한 commit의 상태로 변경"됨.
  • 이후 변경을 하고, staging과 commit을 수행하면 HEAD의 commit childe로 추가되고 이 commit을 HEAD가 가리키게 됨.

같이보면 좋은 자료들

2024.05.20 - [utils/git and github] - [Git] Git Summary (작성중)

 

[Git] Git Summary (작성중)

git이란2024.05.20 - [utils/git and github] - Git : 소개 git 설치 후 해줘야 하는 작업들[Git] git 설치 후 우선 해줘야 하는 작업들 (tistory.com)local repository 초기화2024.05.20 - [utils/git and github] - [Git] init : local repo

ds31x.tistory.com

 

728x90