Git Reset
마지막 업데이트
git reset은 현재 브랜치를 다른 커밋으로 옮기고, 모드에 따라 스테이징 영역(인덱스)과 작업 트리를 그에 맞게 업데이트합니다. 세 가지 모드는 그 업데이트가 어디까지 미치는지에서만 차이가 납니다. --soft는 브랜치를 옮기고 멈추며, --mixed(기본값)는 스테이징 영역도 초기화하고, --hard는 작업 파일까지 덮어씁니다.
--hard는 커밋하지 않은 작업을 버리므로, 실행하기 전에 어떤 모드가 필요한지 알아두세요. 이 명령들은 터미널 플레이그라운드에서 안전하게 시험해 볼 수 있습니다 - 브라우저 안의 진짜 셸입니다.
세 가지 모드
| Mode | Moves branch | Resets staging | Resets working tree |
|---|---|---|---|
--soft | 예 | 아니요 | 아니요 |
--mixed (default) | 예 | 예 | 아니요 |
--hard | 예 | 예 | 예 |
문법
| Command | What it does |
|---|---|
git reset --soft HEAD~1 | 마지막 커밋 취소, 변경 사항은 스테이지에 유지 |
git reset HEAD~1 | 마지막 커밋 취소, 변경 사항을 스테이지에서 내린 채로 유지 |
git reset --hard HEAD~1 | 마지막 커밋 취소, 변경 사항 버리기 |
git reset <file> | 파일을 스테이지에서 내리기(변경 사항은 유지) |
git reset --hard origin/main | 로컬 브랜치를 원격과 일치하도록 강제하기 |
자주 쓰는 경우
| Goal | Command |
|---|---|
| 전부 스테이지에서 내리기 | git reset |
| 파일 하나 스테이지에서 내리기 | git reset README.md |
| 커밋 3개 뒤로 가면서 작업 유지하기 | git reset --soft HEAD~3 |
| 특정 커밋 이후의 모든 로컬 변경 사항 버리기 | git reset --hard <hash> |
Git reset 자주 묻는 질문
--soft, --mixed, --hard의 차이는 무엇인가요?
셋 다 브랜치 포인터를 대상 커밋으로 옮기며, 그 외에 무엇을 건드리는지에서 차이가 납니다.
--soft는 그 외에는 아무것도 바꾸지 않아 변경 사항이 스테이지에 그대로 남습니다. --mixed(기본값)는 스테이징 영역도 비우므로 변경 사항이 스테이지에서 내려가지만 파일에는 남습니다. --hard는 작업 트리까지 대상 커밋에 맞게 덮어써서 커밋하지 않은 변경 사항을 버립니다.git reset으로 파일을 스테이지에서 어떻게 내리나요?
git reset <file>을 실행하거나(예: git reset README.md), 경로 없이 git reset을 실행해 전부 스테이지에서 내립니다. 이렇게 하면 파일이 스테이징 영역에서 빠지지만 작업 트리의 편집 내용은 유지됩니다. 최신 Git에서는 git restore --staged <file>도 사용할 수 있으며, 같은 일을 더 명시적으로 처리합니다.git reset --hard는 되돌릴 수 있나요?
작업 트리에서는 되돌릴 수 없습니다 -
--hard는 커밋하지 않은 변경 사항을 영구히 버립니다. 다만 reset으로 없앤 커밋된 작업은 대개 복구할 수 있습니다. git reflog를 실행해 커밋의 해시를 찾은 뒤 git reset --hard <hash>를 실행하세요(또는 그 지점에 브랜치를 만드세요). 스테이지나 커밋을 한 번도 한 적 없는 변경 사항은 복구할 수 없으니 --hard는 신중히 사용하세요.git reset과 git revert의 차이는 무엇인가요?
git reset은 브랜치를 뒤로 옮겨 히스토리를 다시 씁니다 - 로컬 커밋에는 괜찮지만 이미 push한 커밋에는 위험합니다. git revert는 히스토리를 그대로 두고 이전 커밋을 취소하는 새 커밋을 추가하므로, 공유 브랜치에는 안전한 선택입니다.이걸 온라인에서 연습할 수 있나요?
네. 터미널 플레이그라운드를 열면 브라우저 안의 진짜 셸에서
git reset을 실행할 수 있습니다 - 설치할 것이 없습니다. Coddy의 무료 인터랙티브 Git 강좌에서도 리셋과 변경 취소를 단계별로 다룹니다.