파이문

git rm 한 file 복구(reset, restore) 하기 본문

TIL

git rm 한 file 복구(reset, restore) 하기

민Z 2021. 2. 16. 18:58
728x90

상황

  1. git rm /path/to/file
  2. git commit -m "Delete wrong file" .
  3. git push

git rm (--cached 없이) 으로 파일을 삭제하고 커밋하고 push 까지 해 버림 (...)

(원래는 git mv 로 파일을 변경했는데 source 파일을 삭제 안하고 target 파일을 삭제했다는 TMI)

목표

이 때 잘못 삭제한 파일을 복구하고 싶었다.

Example

git version < 2.23

# 복구할 version 확인하기
$ git log
# version 으로 이동
$ git reset <version>
# 삭제한 파일을 다시 가져온다
$ git checkout -- /path/to/file
# 다시 커밋함
$ git commit -m "Fix" /path/to/file
# force push 한다
$ git push -f

특이사항으로는 이전에 삭제 후 커밋, 푸시 한 버젼이 사라지고 현재 새롭게 (복구한 파일이 있는) 만든 커밋으로 force push 한다는 점이다.

 

잘못 삭제해서 푸시까지 한 이후 커밋이 없기 때문에 force push 해도 상관 없었다.

git version >= 2.23

# git restore 로 특정 파일을 가져온다.
# 아래의 의미는 main~1 (main/HEAD 에서 이전 1번째) 커밋에서 /path/to/file 를 다시 가져온다는 것임
# restore 옵션은 여기서 확인 https://git-scm.com/docs/git-restore
$ git restore --source main~1 /path/to/file
# 다시 추가한 거기 때문에 stage 에 다시 추가 해 줌
$ git add /path/to/file
# 다시 커밋해준다.
$ git commit -m "Fix" /path/to/file
# push
$ git push

1번째 방법이랑 다른 점은 git 에서 새롭게 나온 restore 를 사용했다는 점이고, commit 을 되돌린게 아니기 때문에 force push 하지 않아도 된다.

 

롤백 개념이라기 보다는, 파일을 다시 추가해서 새로운 커밋을 만들어줬다는 점 정도? (물론 reset 하고 force push 해도 되는데, restore 도 써보고 싶었음)

Comments