코드잇 스프린트에서 git 강의를 듣던 중
git reset이라는 커맨드에 대해 알게 되었다.
git reset이라는 개념이 한 번에 이해되지 않아서 글로 정리해보려고 한다.
❓ git reset이란?
git reset
은 현재 브랜치의 HEAD가 가리키는 커밋을 변경하는 명령어이다.
브랜치는 그대로지만 HEAD가 가리키는 위치를 옮기는 것이다.
정리하면, git reset을 하면
👉 HEAD → 브랜치 → 커밋(특정 커밋)
HEAD는 여전히 같은 브랜치를 가리키고,
HEAD가 가리키는 브랜치가 특정 커밋을 가리키게 되면서
HEAD가 간접적으로 가리키던 커밋이 바뀌게 된다.
git reset HEAD~1 # 한 커밋 뒤로
git reset abc1234 # 특정 커밋으로
위 코드처럼 git reset 커밋 아이디를 입력하면
브랜치가 특정 커밋을 가리키게 된다.
✨ git reset 특징
- git reset을 한다고 이후의 커밋이 삭제되지 않는다.
- 과거의 커밋뿐만 아니라 현재의 HEAD가 가리키는 커밋 이후의 커밋도 git reset을 할 수 있다.
위 사진처럼 git reset 1로 1번 커밋을 가리켰다가
다시 5번 커밋으로 돌아가고 싶다면
git reflog
를 사용해서 커밋 ID를 확인하고
git reset 5를 해주면 다시 5번 커밋으로 돌아올 수 있다.
🔍 git reset의 3가지 옵션
git reset은 옵션에 따라 작동 범위가 크게 달라진다.
옵션 | 설명 | 영향 받는 영역 |
--soft | 브랜치만 특정 커밋을 가리킴 | ✅ HEAD ❌ Staging Area ❌ Working Directory |
--mixed | --soft + Staging Area도 특정 커밋처럼 초기화 * 옵션을 생략하면 --mixed 옵션이 적용됨 |
✅ HEAD ✅ Staging Area ❌ Working Directory |
--hard | --soft + --mixed + 현재 작업 영역까지 특정 커밋 상태로 초기화 현재 작업중인 워킹 디렉토리의 내용까지 초기화시키기 때문에 신중하게 사용해야함 |
✅ HEAD ✅ Staging Area ✅ Working Directory |
💡 git reset 사용 예시
1. Staging Area에서 파일을 내릴때
git reset 파일명
2. 이전 커밋으로 완전히 되돌리기
git reset --hard 커밋ID
과거 커밋으로 완전히 돌아가고 싶을 때 사용한다.
커밋 이후의 작업 내용(워킹 디렉토리 초기화)도 전부 삭제되기 때문에 유의해서 사용해야 한다.
3. 커밋만 취소하고 작업 내용은 유지하고 싶을 때
git reset --soft 커밋ID
잘못 커밋했거나, 너무 불필요하게 커밋을 많이 했을때 사용한다.
🤔 git reset vs git checkout
git reset과 git checkout은 얼핏 보면 비슷해보이지만,
사용하는 목적과 결과가 다르다.
git reset
- 브랜치가 다른 커밋을 가리키도록 변경함
- HEAD도 간접적으로 다른 커밋을 가리키는 효과를 얻게됨
- 브랜치의 커밋 히스토리를 수정할때 사용함
git checkout
- HEAD 자체가 다른 커밋이나 브랜치를 가리키도록 함
- 브랜치를 통하지 않고 커밋을 직접적으로 가리켜서 Detached HEAD 상태가 될 수 있음
- 브랜치를 전환할 때 사용함
✅ 마무리
git reset에 대해 배운 내용을 정리했다.
아직 실제로 git reset을 활용해보진 못했지만
git reset 옵션에 해당하는 범위를 잘 기억하고
git reflog로 커밋ID를 조회하는 것을 잊지 말자!
728x90