Git

git> 코드짜다가 실수했다 되돌아가자 (git revert, reset, restore)

연습노트 2024. 7. 24. 16:54

commit만 주구장창 하는 사람들이 있는데 

git은 버전관리 프로그램이기 때문에 

언제든지 이전 commit으로 되돌아가거나

문제가 되는 commit 내역을 취소하거나 그럴 수 있습니다. 

git restore / git revert / git reset 명령어써서 파일 복구하는 법을 알아봅시다. 

각각 파일하나 복구, commit 복구, 시간되돌리기가 가능합니다. 

 

깔끔한 상태에서 시작하기 위해

새로운 작업폴더 만들어서 다시 시작합시다. 

 

 

 

 

 

일단 commit 몇 번 해보고 

 

새로운 작업폴더에서 git init 하고 commit 몇 번 해봅시다. 

저는 파일 3개 만들고 만들 때 마다 commit 해봤습니다. 

git log --oneline 입력해보면 여러분의 commit 내역을 한 줄로 이쁘게 보여줍니다. 

 

 

▲ 왼쪽에 있는 노란 문자들은 commit의 고유 id 입니다. 

고유 id를 이용해야 "그 고유 id로 되돌려주세요~" 이런 명령들이 가능합니다.  

 

 

 

 

 

 

파일 하나를 되돌리려면 git restore

 

파일 하나가 잘못되었을 경우 ctrl + z 여러번 눌러도 되겠지만

수정사항이 너무 많다면 명령어 하나로 처리할 수 있습니다. 

 

git restore 파일명

이러면 최근 commit 된 상태로 현재 파일의 수정내역을 되돌릴 수 있습니다. 

 

 

git restore --source 커밋아이디 파일명

이러면 입력한 파일이 특정 커밋아이디 시점으로 복구됩니다. 

 

 

git restore --staged 파일명

이건 복구랑 상관없지만 이러면 특정 파일을 staging 취소할 수 있습니다. 

 

 

 

 

 

 

 

commit을 되돌리려면 git revert 

 

 

 

코드 열심히 짜다가

갑자기 과거 commit 하나가 문제를 일으키면 어떻게 하죠? 

 

 

 

 

 

위 사진을 보면 지금 commit이 3개 있는데

여기서 b 파일이 문제가 많아서

b 파일을 만든 d874b2b commit을 취소하고 싶어진겁니다. 

commit 하나를 취소하고 싶으면 git revert 사용하면 됩니다. 

실은 없애버리는건 아니고 commit 하나를 취소한 commit을 하나 생성해줍니다. 

 

 

git revert 커밋아이디

이거 입력하면 그 커밋아이디에서 일어난 일만 취소해줍니다. 

실행하면 아마 에디터가 뜰 텐데 맘대로 커밋메세지 수정하고 닫으면 끝입니다.

 

 

 

 

▲ revert 명령시 가끔 Vim 에디터가 뜨는 사람들이 있을겁니다.

커밋 메세지 수정하라는건데 i 눌러서 글자수정하고 싶으면 하고 esc 눌러서 나올 수 있습니다.

그리고 :wq 누르면 커밋 메세지가 저장됩니다.

 

 

 

 

아무튼 에디터 닫고나면 새로운 커밋이 생성되고 b파일만 뿅 삭제되어있습니다.

(그 커밋id 이후에 했던 파일이나 커밋들은 영향없이 유지됨)

 

 

 

git log 다시 해보면 revert 해줬다는 commit이 자동으로 생성되어있고 

작업폴더에서 a, c 파일은 있지만 b 파일은 삭제되어있군요.  

결론은 revert 명령어 쓰면 특정 커밋에서 있던 일을 지워버릴 수 있습니다.

 

 

 

 

 

▲ 그림 좋아하면 그림보쇼 

 

 

(참고)

- revert 할 때 동시에 여러개의 commit id 입력가능 

- 그냥 최근 했던 commit 1개만 revert하고 싶으면 git revert HEAD 하면 편리합니다.

- merge 명령으로 인해 새로 만들어진 commit도 revert 가능합니다. 그럼 merge가 취소되겠군요 필요하면 찾아보셈 

 

 

 

 

 

 

 

 

그냥 전부 시간을 되돌리고 싶으면 git reset

 

 

 

지옥같은 개발에 대해 아무것도 모르던 어린시절로 되돌아가고 싶습니까? 

현실에선 불가능하지만 git에선 가능합니다. 

git reset 명령어 사용하면 특정 commit 시절로 아예 모든걸 되돌릴 수 있습니다. 

 

 

 

git reset --hard 커밋아이디

입력하면 그 커밋이 생성될 때로 시간을 되돌려줍니다. 

작업폴더 내의 파일도 그 시절로 돌아갑니다.

작업폴더에서 직접 해봅시다. 

 

 

 

 

▲ 그림으로 설명하면 이렇게 동작합니다.

commit2로 reset --hard 해버리면

commit2 이후의 미래 기억을 모두 잃습니다. 

 

 

 

 

 

 

 

로 git reset은 그냥 프로젝트 망하면 쓰거나

아니면 짧은 거리를 돌아갈 때 쓰도록 합시다. 

 

 

 

(참고)

- 여러명이서 협업하는 리포지토리에는 보통 reset 쓰면 안됩니다. 갑자기 소스코드가 사라지는거니까요.

- untracked 파일들은 (git add 안해놓은 파일들은) 사라지지않고 유지됩니다. 

- git clean 명령어 찾아서 쓰면 untracked 파일들도 다 지울 수 있습니다. 

 

 

 

 

 

 

 

참고 : reset시 옵션 설정가능

 

 

 

▲ 아까 상황으로 다시 돌아와서 a, b, c 파일을 만들면서 각각 commit을 했다고 칩시다. 

git reset 뒤에 hard / soft / mixed 설정을 넣을 수 있는데 

 

 

git reset --hard d874b2b

이러면 a, b파일은 남아있고 c 파일이 삭제됩니다. 

 

 

git reset --soft d874b2b

이러면 a, c파일은 남아있고 b 파일은 staging area에 남아있습니다. 

이제 commit 하거나 그럴 수 있습니다. 

 

 

git reset --mixed d874b2b

이러면 a, c파일은 남아있고 b 파일은 staging 되지 않은 상태가 됩니다. 

이제 git add 하고 commit 하거나 그럴 수 있습니다. 

 

 

결론은 reset하면서 파일을 아예 지워버리는게 아니라 

검토하고 다시 commit 하고 싶으면 --soft / --mixed 사용해봅시다. 

실은 git reset 어쩌구만 하면 --mixed 옵션이 자동으로 발동됩니다.