과거에 했던 커밋으로 내용을 되돌리고 싶을 때 어떤 커맨드를 사용해야 하는지 알아보자.
특정 커밋 시점으로 되돌릴 때는 git reset
특정 시점의 커밋으로 되돌릴 때는 아래와 같은 커맨드를 사용한다.
git reset --hard 돌아가고 싶은 시점의 커밋 아이디값(4자리)
--hard 옵션을 사용한 git reset은 특정 시점으로 리셋하고 나면 이후의 작업 내용은 모두 사라지게 된다. 그렇기 때문에 신중하게 써야하는 명령어이며, 옵션은 총 3가지가 있는데 이 부분도 매우 중요한 부분이라 이 포스팅을 끝까지 읽기를 바란다. 그럼 예제를 통해서 알아보도록 하겠다. 먼저 git history 명령어를 사용하여 아직까지 한 커밋 리스트를 확인해 보았다.
HEAD가 가장 마지막에 한 Re_update commit_text.txt 커밋을 가리키고 있다. 참고로 현재 HEAD가 가리키고 있는 커밋 버전은 (HEAD -> main) 표시를 통해서 확인이 가능하다.
나는 git reset --hard 161d를 입력하여 바로 이전 커밋으로 되돌려 보았다. 다시 커밋 리스트를 실행하면 가장 최근의 커밋 내용은 사라지고, HEAD가 161d로 시작하는 Create "Commit_text.txt" 커밋을 가리키고 있는 것을 알 수 있다.
git reset 옵션(--soft, --mixed, --hard)
git reset을 사용할 때에는 3가지 옵션을 선택하여 쓸 수 있다. git에는 세가지 작업 영역(working directory, staging area, repository)이 있는데, 이 작업영역의 상태가 위의 어떤 옵션을 사용하느냐에 따라 달라진다.
※ 세가지 작업영역을 확인하고 싶다면 아래 링크 클릭
2022.09.05 - [개발자 꿈나무/Git] - Git의 세가지 작업영역(Working Directory, Staging Area, Repository)
Git의 세가지 작업영역(Working Directory, Staging Area, Repository)
Git의 작업영역을 자세히 살펴보면 크게 3가지로 구분된다. 앞으로 Git을 이용해서 버전 관리를 하려면 이 개념을 반드시 이해하고 있어야 한다. Working Directory Git으로 관리하도록 지정된 디렉토리
heinafantasy.com
git reset [옵션] 커밋아이디값 | Working Directory | Staging Area | Repository |
--soft | 안 바뀜 | 안 바뀜 | HEAD가 해당 커밋 가리킴 |
--mixed | 안 바뀜 | 해당 커밋처럼 바뀜 | HEAD가 해당 커밋 가리킴 |
--hard | 해당 커밋처럼 바뀜 | 해당 커밋처럼 바뀜 | HEAD가 해당 커밋 가리킴 |
- hard 옵션을 사용하면 세가지 작업 영역이 모두 바뀐다. 작업을 하고 있던 내용이 있다면 모두 사라진다.
- mixed 옵션을 사용하면 Repository와 Staging Area의 내용은 바뀌지만, Working Directory의 모습은 바뀌지 않는다.
Working Directory는 가장 최근에 작업을 했던 모습 그대로 남아있다. - soft 옵션을 사용하면 Repository의 내용만 바뀌고 나머지 작업 영역의 내용은 모두 최근 모습 그대로 남아있다.
작업의 특정 시점으로 내용을 변경하고 싶을 때에, 위의 조건을 참고하여 현재 상태에 적절한 옵션을 선택하면 될 것 같다.
cf. 해당 커밋 이후에 작업한 내용을 모두 잃어버리기 때문에 보통 hard 옵션은 잘 사용되지 않는다고 한다. (복구 불가)
cf. 옵션을 생략하고 git reset만 사용하면 --mixed 옵션이 자동으로 적용된다.
상대적인 표현으로 git reset 하기
git reset을 할 때 커밋아이디를 쓰는 방법 외에 상대적인 표현법도 있다. 커밋 아이디 대신에 HEAD^와 HEAD~n을 사용하는 것이다.
git reset --hard HEAD^
#현재 HEAD가 가리키고 있는 커밋의 바로 이전 커밋으로 돌아가자.
git reset --hard HEAD~n
#현재 HEAD가 가리키고 있는 커밋보다 n단계 전에 있는 커밋으로 돌아가자.
#예시
git reset --hard HEAD~2
#현재 HEAD가 가리키고 있는 커밋보다 2단계 전에 있는 커밋으로 돌아가자.
바로 직전의 커밋으로 돌아간다면 커밋아이디를 입력해주는 것보다 HEAD^를 사용하는 것이 편하기 때문에 참고 삼아 알아두면 도움이 될 것이다.
'개발 도구 > Git' 카테고리의 다른 글
브랜치(branch)는 무엇인가? 어떻게 사용해야할까? (0) | 2022.11.14 |
---|---|
중요한 커밋(commit)에 태그(tag)넣는 방법 (0) | 2022.11.09 |
두 커밋 사이의 차이점 비교하기(git diff) (0) | 2022.10.25 |
Git alias(별명) 설정하는 방법 & HEAD의 의미 (0) | 2022.10.21 |
최신 커밋(commit) 내용 수정하기(커밋 메세지 수정 아님) (0) | 2022.10.19 |
댓글