reset을 이용한 git add, commit, push 되돌리기
git을 통해 프로젝트를 진행하다보면 보안문제로 인해 올리지 말아야 할 것을 실수로 올려 push까지 해버리는 경우가 있다.
이럴때마다 일일이 구글링하면 해결하다보니 오랜 시간이 걸리는 것은 물론이고 진짜 돌이킬수 없는 강을 건너버리는 경우도 종종 있다.
제대로 정리해서 깔끔하게 되돌리기를 성공해보자
git add 되돌리기
add하기 전으로 돌아가고 싶다면 reset명령어를 쓰면 된다
아래의 이미지처럼 unstaged가 파일은 변경되었지만 아무런 명령을 받지 않은 상태이다.
git add를 입력하면 아래의 이미지처럼 파일이 staged가 되는 것을 볼 수 있다.
이때 해결방법은 reset
명령어이다
특정 파일의 add 되돌리는 명령어
git reset HEAD ex1
add된 파일 모두 되돌리는 명령어
git reset
2. git commit 되돌리기
commit을 취소하기 위해서는 git log를 통해서 취소할 commit을 정확히 확인해준다
저장할 파일을 3, 4 ,5 로 commit 메세지를 작성할 예정이였으나 5가아닌 3으로 커밋이 저장되어 아래의 이미지처럼 저장이 된 상태이다.
이때 커밋 메세지만 변경할 예정이기 때문에 reset의 --soft
명령어를 사용하여 add만 한 상태로 되돌린다.
commit된 파일을 add된 상태로 되돌리는 명령어
한단계만 되돌리면 되기때문에 HEAD뒤에 ^을 붙여준다. 이때 왜그런지는 모르겠으나 More?이라는 질문이 뜨는데 이때 그냥 바로 전 단계라는 의미로 ^을 입력해주면 된다
git reset --soft HEAD^
commit된 파일을 unstaged된 상태로 되돌리는 명렁어
그러니까 commit된 파일을 add도 되지 않은 맨 처음 상태로 되돌리는 명령어이다. 그리고 해당명령어는 디폴트 명령어이기 때무에
git reset HEAD^
명령어와 똑같다
git reset --mixed HEAD^
commit 된 파일을 n 단계로 되돌리고 싶을때 사용하는 명령어
만약 2단계전으로 돌리고 싶다면 HEAD뒤에 ~2를 붙여주면 된다
git reset HEAD~2
commit된 파일을 아예 unstaged 상태로 디렉터리에서 삭제할때 사용하는 명령어
만약 git에서 main 브랜치로 이동하고 싶은데 unstaged에 변경된 파일이 있으면 브랜치로 이동할 수 없다. 이럴땐 stash 명령어 아니면 아래의 명령어를 써주자
git --hard HEAD^
push된 파일 되돌리기
가장 고생했던 부분이다. 실제로 장고 시크릿키가 올라가서 되돌리기를 쓰다가 명령어 하나의 잘못으로 레포를 다시 판 기억이 있다.
이 명령어는 내 local에 있는 파일의 내용들을 remote에 강제로 덮어쓰기 하는 명령어이기 때문에 주의해서 remote가 덮어쓰기 되어져도 괜찮은지 생각해보고 써주자
나는 commit id를 쓰는것을 선호한다. git log나 나의 리모트에 있는 commit id를 가져와서 입력하면 해당 commit이 된 시점으로 되돌아간다. 그렇기 때문에 이후에 commit된 내용들은 remote와 local 두군데에서 전부 사라지게 된다.
git reset [commit id]
이후 되돌려지기 되었다면 remote에서 commit의 기록을 지우기 위해 commit을 다시 해준 후 git push origin
git push origin <branch name> -f
이때 진짜 주의해야 할 것은 f
명령어이다. 이 명령어는 강제로 실행해주기 때문에 이후에는 돌이킬수 없다. 차라리 안전하게 코드를 백업시키고 써주자