본문 바로가기
개발/Git

[Git] add 취소하고 파일 제외하기 (git reset)

by 은성 (euni) 2025. 3. 8.

git reset


작업하다가 작업 중인 모든 파일이 깔끔하게 마무리되지 않아서 일부만 add하고 싶은데,
그렇다고 모든 add를 하나씩 치기엔 작업량이 많아서 git add . 으로 add를 해버렸다.

이럴 때 특정 파일만 제외하고 싶다면 `git reset`을 사용하면 된다.

git reset [파일 경로]

 

 



git reset에는 `--hard`, `--mixed`, `--soft` 라는 세 옵션도 있는데, 이는 특정 파일이 아닌 이전 커밋 대비 전체 진행 상황을 초기화하는 기능이다.
각각의 옵션을 살펴보기 전에 Working directory, Staging Area, Repository 라는 세 개념부터 짚고 넘어가자.

1. Working Directory

우리가 직접 파일을 수정하는 공간 (파일 탐색기 내의 폴더)
아직 Git이 추적하지 않는 상태이다.

2. Staging Area (Index)

`git add`를 실행하면 Working Directory에서 변경된 내용을 스테이징(준비)하는 공간
아직 커밋되지 않았지만, 다음 커밋에 포함될 파일 목록이 여기에 저장됨

3. Repository (Commit History)

`git commit`을 실행하면 Staging Area의 내용이 확정되어 Git 저장소(Repository)에 기록됨



즉, 우리가 작업을 하면 Working Directory에 저장이 되는데
이를 `git add` 하게 되면 Staging Area에 올라가고, `git commit`을 통해 Repository에 올라가는 형식이다.



이걸 왜 설명했냐면 git reset의 옵션들이 이 3가지 공간에 미치는 영향을 기준으로 구분되어 있기 때문이다.
먼저 표로 정리하자면 이렇다.

 

옵션 HEAD 이동 Staging Area 유지 Working Directory 유지 설명
--soft O O O 커밋만 제거, 변경 내용 유지
--mixed (기본값) O X O 커밋 + Staging 초기화, 변경 내용 유지
--hard O X X 모든 변경사항 삭제

 

1. git reset --soft

커밋만 제거하고, 변경 내용은 유지한다. 즉, 파일들의 add된 상태는 유지하고 커밋만 취소하는 개념이다.
그럼 왜 사용하는지 궁금했는데, 커밋 메세지를 잘못 입력했거나, 일부 파일을 빠뜨렸을 때 사용하는 것이라고 한다.

 

2. git reset --mixed

커밋을 제거하고, 변경사항은 유지하지만 파일들의 add된 상태를 취소한다.
(옵션의 기본값이라서 옵션을 빼고 `git reset`의 형식으로 사용 시, `--mixed`와 동일한 실행을 한다.)
파일을 잘못 add 했다면 이 옵션을 사용하면 된다.

3. git reset --hard

모든 변경사항을 삭제하고 되돌린다. Working Directory에 있는 로컬 파일들도 함께 되돌려지기 때문에 사용에 주의가 필요하다.
내 경우에는 코드를 짜다가 이슈가 생길 경우 이전 상태로 롤백할 때 이 옵션을 자주 사용한다.


사용법

세 가지 옵션 모두 아래와 같은 형식으로 사용한다.

git reset --soft HEAD~1
git reset --soft [커밋 해시]
// 예시: git reset --soft 32b793921c5305de358d17d27ad8df15e6c01778
// 예시: git reset --soft 32b79 (이렇게 앞부분만 줄여도 된다!)


HEAD~1은 현재 HEAD의 이전 커밋(한 단계 전)을 가리킨다.
N단계 이전 일 경우 HEAD~2, HEAD~3처럼 쓸 수 있다고 한다.

 

커밋 해시


커밋 해시란 커밋을 하면 볼 수 있는 긴 텍스트인데, 이를 통해 특정 커밋을 지정하여 리셋할 수도 있다.