티스토리 뷰
● 도입
- git은 버전관리 프로그램이기에 언제든지 이전 commit 으로 되돌아가거나 문제가 되는 commit 내역을 취소할 수 있다.
- 이번 글에서는 git restore / git revert / git reset 명령어를 통해 파일 복구 방법을 알아볼 것이다.
git restore : 파일 하나 복구
git revert : commit 복구
git reset : 시간 되돌리기
- 깔끔한 상태에서 시작하기 위해 새로운 작업 폴더를 하나 만들었다.
- 해당 폴더에서 git init 후 commit을 몇 번 했다.(파일 3개 생성, 만들 때 마다 commit)
- 위 사진 왼쪽에 있는 노란 문자들은 commit의 고유 id 이다.
- 해당 고유 id를 이용해 "내가 원하는 고유 id로 되돌려라" 같은 명령이 가능하다.
● git restore : 파일 하나 되돌리기
- 파일 하나가 잘못되었을 경우 (ctrl + z) 여러번 누르면 되지만 수정사항이 너무 많다면 명령어 하나로 처리할 수 있다.
git restore 파일명
--> 최근 commit 된 상태로 현재 파일의 수정 내역을 되돌릴 수 있다.
git restore --source 커밋아이디 파일명
--> 입력한 파일이 특정 commit id 시점으로 복구
cf) 복구랑 상관없는 명령어
git restore --staged 파일명
--> 특정 파일의 staging 취소
● git revert : commit 되돌리기
- 코딩(복붙) 열심히 하던 중 갑자기 과거 commit 하나가 문제를 일으키는 경우가 있다.
- 위 사진을 보면 현재 commit이 3개 있는데 이 중 b 파일이 문제가 많아 b 파일을 만든 d874b2b commit을 취소하고 싶은 것이다.
- 이때 commit 하나를 취소하고 싶으면 git revert 명령어를 사용하면 된다.
- 정확히 말하면 취소(삭제)는 아니고 commit 하나를 취소한 commit을 하나 생성하는 것이다.
git revert 커밋아이디
--> 해당 커밋아이디에서 일어난 일만 취소
--> 실행 시 Vim 에디터가 뜨면 커밋 메세지 수정하고 닫으면 된다.
- 나는 two.txt 파일이 commit 된 5cb35bb commit을 revert 할 것이다.
- 참고로 위 사진은 Vim 에디터가 아니다. 위 사진에서는 쌍따옴표에 커밋 메세지 입력 후 저장하면 알아서 commit 된다.
- git log를 보면 revert 했다는 새로운 commit이 자동으로 생성되어있다.(be5dce2 commit 참고)
- 작업 폴더에서 one.txt, thr.txt 파일은 있지만 two.txt 파일은 삭제됐다.
- 해당 commit id 이후에 했던 파일이나 commit 들은 아무런 영향없이 유지된다.
- 결론: revert 명령어를 쓰면 특정 commit에서 있었던 일을 지워버릴 수 있다.
참고
- revert 할 때 동시에 여러개의 commit id 도 입력 가능하다.
- 가장 최근에 했던 commit 1개만 revert 하고 싶으면 git revert HEAD 명령어를 사용하는게 더 편리
- merge 명령으로 인해 새로 만들어진 commit도 revert 가능하다. 그러면 merge가 취소된다.
cf)
- revert 명령시 가끔 Vim 에디터가 뜨는 경우가 있다.
- Vim 에디터에서 커밋 메세지를 수정하라는 얘기인데 i 를 눌러 메세지 입력 후 esc 를 눌러서 나올 수 있다.
- 나온 후 :wq 누르면 커밋 메세지가 저장된다.
● git reset : 시간 되돌리기
- git reset 명령어 사용하면 특정 commit 시점으로 아예 모든걸 되돌릴 수 있다.
git reset --hard 커밋아이디
--> 해당 commit이 생성된 시점으로 시간을 되돌려준다.
--> 작업 폴더 내의 파일도 해당 시점으로 돌아간다.
- commit2로 reset --hard 해버리면 commit2 이후의 모든 내용을 잃어버리는 것이다.
- 위험도가 높은 작업인 만큼 git reset은 프로젝트가 망하면 쓰거나 짧은 거리를 되돌아갈 때 쓰도록 하자.
참고
- 여러명이 협업하는 리포지토리에는 보통 reset 쓰면 안된다. 갑자기 소스코드가 사라지는거니까
- untracked 파일들(git add 안해놓은 파일들)은 사라지지않고 유지된다
- git clean 명령어 찾아서 쓰면 untracked 파일들도 다 지울 수 있다.
git reset 명령어 옵션
- 위 사진처럼 a, b, c 파일을 각각 만든 후 생성 때마다 commit을 했다고 해보자
- 이때 git reset 명령어에 hard / soft / mixed 옵션을 적용할 수 있다.
git reset --hard d874b2b
--> a, b 파일은 남아있고 c 파일이 삭제된다.
git reset --soft d874b2b
--> a, b 파일은 남아있고 c 파일은 staging area에 남아있다.
--> git commit 할 수 있다.
git reset --mixed d874b2b
--> a, b 파일은 남아있고 c 파일은 staging 되지 않은 상태
--> git add 하고 git commit 할 수 있다.
- git reset 하면서 파일을 아예 지워버리는게 아니라 검토하고 다시 commit 하고 싶으면 --soft / --mixed 옵션을 사용해보자
- 사실 'git reset 어쩌구만' 하면 --mixed 옵션이 자동으로 적용된다.
'Git' 카테고리의 다른 글
#8 Github2 - 타인과 협업하기 git clone, git pull (0) | 2022.11.12 |
---|---|
#7 Github1 - 내 코드 올릴 때는 git push, remote repository, git ignore (0) | 2022.11.11 |
#5 다양한 merge 방법 - 3-way / fast-forward / rebase / squash / branch 삭제 (1) | 2022.11.08 |
#4 branch, merge, conflict (1) | 2022.11.03 |
#3 git add, commit, diff / Git graph Extensions (0) | 2022.11.01 |
- Total
- Today
- Yesterday
- 프로그래머스
- SQL
- Java8
- spring
- 프로세스
- 자료구조
- API
- jpa
- db
- Advanced Stream
- 코딩테스트
- MySQL
- Spring Boot
- 빅데이터
- MongoDB
- OS
- 알고리즘
- java
- git
- Phaser3
- 메모리
- Stream
- SpringBoot
- Phaser
- node.js
- DART
- 빅데이터 분석기사
- nosql
- 코테
- 운영체제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |