[git] 커밋해놨다면 되돌릴 수 있다..!

강원지·2023년 2월 23일
0

좌충우돌 GIT 생활

목록 보기
1/3

발단

과제테스트 해보겠다고 낑낑거리다 완벽하진 않지만 나름 원하던 결과물이 나와서 커밋을 했다.

커밋을 이미 한 상태에서 브랜치를 바꾸지 않았던 게 기억이나 커밋을 취소하고 다시 할 생각으로 아래 3가지 방법 중 세 번째를 선택했다. (강제 pull의 희미한 기억 소환...)

// [방법 1] commit을 취소하고 해당 파일들은 staged 상태로 워킹 디렉터리에 보존
$ git reset --soft HEAD^
// [방법 2] commit을 취소하고 해당 파일들은 unstaged 상태로 워킹 디렉터리에 보존
$ git reset --mixed HEAD^ // 기본 옵션
$ git reset HEAD^ // 위와 동일
$ git reset HEAD~2 // 마지막 2개의 commit을 취소
// [방법 3] commit을 취소하고 해당 파일들은 unstaged 상태로 워킹 디렉터리에서 삭제
$ git reset --hard HEAD^

위기

터미널에 $ git reset --hard HEAD^를 입력하자 작성해놓은 파일들에 모두 빨간줄이 그어졌다. 다행히 삭제된 파일의 내용은 볼 수 있었다. 그와중에 개발환경 세팅은 커밋을 해놓은 상태라 index.js 같은 파일은 세이브된 내용으로만 나와서 새로 짠 코드는 볼 수 없어 정말 암담했다.

그런데 극한의 불행이 찾아오니 오히려 침착해졌다. 차라리 회사에서 안 그래서 다행이다. 해결되겠지 아님 말고 하는 마음으로 구글에 '커밋 취소 되돌리기', '커밋 취소 취소' 등을 검색해봤다.

해결

방법이 있었다.

> git reflog

위 명령어로 로그를 확인하고 돌아가고 싶은 HEADNUM을 골라 reset 명령을 내리면 된다.

> git reset --hard "HEAD@{num}"

위와 같은 실수를 반복하지 않기 위해 reset에 대해 공부해보자. 아래는 seunghan님 블로그 내용을 자주 읽어보기 위해 일부 모셔왔다.

reset

: 커밋 간 이동 명령어.

만약 우리가 third commit에서 -> first commit으로 이동한다고 가정해보면 3가지 옵션의 차이점은 아래의 그림과 같습니다.

Repository : Commit한 내용
Staging Area : git add한 내용
Working Directory : 현재 vscode 내용

--soft : HEAD는 첫번째 커밋을 가리킵니다. 하지만, Staging Area와 Working Directory는 기존의 커밋의 상태로 유지됩니다.
--mixed: soft 옵션에서 Staging Area도 함께 첫번째 커밋의 상태로 변경됩니다.
--hard: mixed옵션에서 Working Directory가 첫번째 커밋의 상태로 변경됩니다. (위험한 옵션)


만약 내가 커밋을 했긴 했는데 commit 2 와 commit 3이 마음에 들지 않는다고 가정해봅시다.

그렇다면 commit 1로 $ git reset {--soft | --mixed} {commit1_id} 명령어를 이용해 이동한 후,

--soft, --mixed 옵션은 working directory는 그대로이기 때문에 다시 코드를 예쁘게 🌈 수정한 후

$ git add .
$ git commit -m "commit 4" 순으로 실행해주면?!
커밋 히스토리가 아래와 같은 형태가 된다!

0개의 댓글