git reset
Reset current HEAD to the specified state
— Git 공식 매뉴얼(man git-reset)
로컬의 실수를 지워주는 인생 지우개지만, 이미 서버에 올라간 공용 브랜치에 가동하면 전쟁범죄자로 찍히는 마법. ~~~~내가 방금 reset --hard HEAD~5 라고 쳤나? 제발 꿈이라고 해줘(...)~~~~
1. 개요
현재 헤드(HEAD) 브랜치의 포인터를 특정 과거 커밋으로 통째로 강제 순간이동 시켜 역사를 다시 쓰는 명령어다. 커밋을 취소하거나 스테이징 영역을 깨끗이 비워낼 때 사용되며, 동작 파급력의 크기에 따라 세 종류의 화력을 제공하여 조심스럽게 다뤄야 한다.
2. 3대 옵션의 살상력 비교
이 명령어는 무조건 옵션의 지식이 탑재된 상태로 다뤄야 대참사를 면한다. 1) --soft는 커밋만 얌전히 풀어서 변경 코드를 그대로 대기방에 놔두는 온건파, 2) --mixed(디폴트)는 대기방(Index)까지 청소해 작업 공간에 파일만 흩뿌리는 중도파, 3) --hard는 작업 공간의 파일 변경 내역까지 불도저로 밀어 무결한 과거 상태로 리포맷해버리는 무자비한 철권 통치파다. 하드가 실행되는 순간 당신이 작성하던 미커밋 상태의 코드는 물리적으로 지워진다.1
3. 공유 브랜치에서의 학살 행위 금지
가장 중요한 불문율은 이미 원격(GitHub 등)에 Push된 커밋들에는 절대 reset을 가하면 안 된다는 사실이다. 나 혼자 역사를 쥐락펴락하면, 이미 내 코드를 기반으로 성실하게 우주를 설계해 놓은 다른 팀원들의 저장소와 뼈대가 어긋나, 다음 풀 리퀘스트 시 우주적 대규모 컨플릭트 참극과 팀장의 데스노트 등재를 경험하게 된다. 이때는 조용히 반성하며 얌전하게 신규 역사를 한 층 더 쌓아 올리는 git revert를 써야 문명인 대접을 받는다.
4. 실제 사용 예시
스테이징을 취소하거나 최근 커밋을 되돌릴 때 사용한다. 가장 안전한 출발점은 스테이징에서만 내리는 형태다.
# 스테이징만 취소하고 파일 수정 내용은 유지
git reset HEAD src/app.ts
# 마지막 커밋은 취소하되 변경 내용은 스테이징 상태로 유지
git reset --soft HEAD~1
--hard는 작업 내용까지 지우므로 실행 전에 반드시 git status와 git log를 확인해야 한다. 공유 브랜치에서는 거의 쓰지 않는 편이 안전하다.
git status
git log --oneline -5
git reset --hard HEAD~1
5. 관련 밈 및 드립
5.1. reflog를 찾아 울부짖는 새벽녘
무지성으로 git reset --hard를 갈겨 야근 작업분을 우주 먼지로 날리고 식은땀을 흘리는 밈이다. 결국 온갖 커뮤니티를 기어 다니며 구걸하다가, '오직 영웅만이 만질 수 있는' 신들의 백업 로그 git reflog를 통해 죽어가던 커밋 해시를 극적으로 심폐 소생하여 숨죽여 우는 개발자의 인간 승리 다큐멘터리다.
5.2. 자살 방지용 alias 금단 현상
초보자들이 하도 reset --hard를 쳐서 코드를 날려 먹으니, 사수들이 사전에 터미널 설정에서 git reset --hard 자체를 못 치게 경고 메시지를 띄우는 별칭(alias) 락을 걸어놓아 생명을 연장해 주는 기묘한 사내 보안 문화 밈이다.
6. 여담
- HEAD~ 문법:
HEAD~1은 바로 한 커밋 전,HEAD~5는 다섯 개 전의 커밋을 지칭하는 기발하고 직관적인 표기법이다. - 물리적 완전 삭제: 하드로 인해 소멸한 파일은 정말로 디스크 조각 모음에서도 찾기 힘든 나락으로 빠질 수 있으니, 무서우면 미리 바탕화면에 백업 복사본을 만들어두는 졸렬함을 기르자.
- Index 초기화: 아무 옵션 없이
git reset단독으로 실행하면, 스테이징 영역에 올라간 파일들만 차분하게 쫓아내며 무대 밑으로 끌어내리는 검문 해제용으로도 작동한다.