실수로 github 레포지터리에 푸시하지 않아도 되는 파일을 add 했다. 현재 stage 상태인 파일을 unstage 상태로 변경하려고 한다.
두괄식으로 결론만 먼저 적으면, add 취소할 파일을 지정하여 git reset 명령을 실행하면 된다. 아래 명령어는 모두 동일한 명령어다.
git reset <FILE>
git reset --mixed <FILE>
git reset --mixed HEAD <FILE> # 위와 동일한 명령어
# 예시
git reset README.md
기본 개념
HEAD
현재 브랜치를 가리키는 포인터
브랜치는 브랜치에 담긴 커밋 중 가장 마지막 커밋을 가리킨다.
HEAD가 가리키는 커밋은 다음 커밋의 부모가 된다.
Index
Staging Area. 다음에 커밋할 것들.
git commit 명령 실행 시 git이 처리할 것들.
Working Directory
수정할 파일이 있는 디렉터리
git add, git commit 시 아래와 같은 흐름대로 동작한다.
git add 명령이 실행된 상태는 아래 사진처럼 이해할 수 있다.
git reset
기능
- HEAD 이동(--soft)
HEAD 브랜치 이동
가리키는 브랜치는 그대로 두되 현재 브랜치가 가리키는 커밋을 변경한다. - Index 업데이트(--mixed)i
index를 현재 HEAD가 가리키는 내용으로 업데이트
옵션을 주지 않았을 때의 기본값이다.
- Working Directory 업데이트(--hard)
Working Directory를 index의 상태로 업데이트하여 수정 내용을 실제로 삭제한다. undo가 불가능하기 때문에 주의해서 사용한다.
위 내용을 이해했다면, git add를 취소하는 명령은 git reset --mixed에 해당한다는 걸 알 수 있다.
파일 경로 지정하여 reset
reset 명령 사용 시 파일의 경로를 지정하면, HEAD 변경을 건너뛰고 지정한 파일에만 이후의 reset 작업을 진행한다.
git reset <FILE>
# 위와 동일
git reset --mixed HEAD <FILE>
위 명령은 본질적으로 FILE을 HEAD에서 index로 복사하는 것으로, 해당 파일을 Unstage 상태로 만든다.
참고문서