작업 브랜치를 변경하려면 워킹 디렉토리는 깨끗한 상태로 정리되어 있어야 한다. 워킹 디렉토리에서 작업 중인 내용이나 커밋되지 않은 변경 사항들이 남아 있으면 브랜치를 변경할 수 없다. 깃은 완료되지 않은 작업이 남아 있을 때, 현재 작업을 임시로 저장할 수 있는 스태시 기능을 제공한다. 스태시는 브랜치를 이동할 때 작업 중인 내용 때문에 워킹 디렉토리가 충돌하는 것을 방지하는 데 사용한다.
현재 브랜치는 워킹 디렉토리에 커밋하지 않은 작업이 남아있어 변경할 수 없는 상태이다.
스태시의 임시 스택 영역에 작업 중인 코드 저장
스태시 명령을 실행하면 현재 작업 중인 내용은 임시 저장되고, 수정 전 마지막 커밋 상태로 돌아간다. 즉, 이전 커밋 후 작업하지 않은 상태의 워킹 디렉토리가 된다. 수정 중인 내용을 커밋하지 않고도 브랜치를 이동할 수 있게 되며 영구적인 커밋 기록 대신 현재 작업들이 임시 스택 영역에 저장된다.
스태시는 스택 구조로 여러 번 실행하여 저장할 수 있다. 스태시가 여러 개 있을 때 각각의 스태시를 구별할 수 있도록 메세지를 추가할 수도 있다.
$ git stash # tracked 파일 저장
$ git stash push -m "수정 사항 임시 저장"
명령의 결과로 워킹 디렉토리가 깨끗하게 정리되었고 워킹 디렉토리에서 작업 중인 파일도 사라졌다. 따라서, 정상적으로 다른 브랜치로 체크아웃이 가능하다.
스태시 작업을 할 때 스테이지 영역의 파일들을 제외할 수도 있고 untracked된 파일까지 스태시로 생성할 수도 있다.
$ git stash push --keep-index # staged 되지 않은 파일들만 저장
$ git stash push --include-untracked # untracked 파일까지 저장
$ git stash push --keep-index --include-untracked # staged된 파일만 남기고 저장
스태시 스택 확인
스태시의 저장 영역은 스택 구조이다. 스택은 FILO(First Input Last Out) 구조로, 마지막에 입력한 자료가 제일 먼저 출력되는 데이터 저장 방식이다.
스태시에 저장된 스택은 list 옵션을 사용하여 확인할 수 있다. 스태시 이름은 stash@{번호} 형태로 순차적으로 부여되며 목록 번호는 0부터 시작한다.
$ git stash list
깃은 스태시된 객체들을 .git/refs/stash에 저장한다. 이는 cat 명령어로 내용을 확인할 수 있다.
스태시와 현재 워킹 디렉토리 차이 비교
특정 스태시를 지정하지 않으면 최근 스태시와 현재 워킹 디렉토리 간 차이를 출력한다. diff 기능과 유사하다.
$ git stash show
$ git stash show stash@{1} # 특정 스태시 지정
p 옵션을 추가하면 상세 차이점도 알 수 있다.
$ git stash show -p
$ git stash show -p stash@{1} # 특정 스태시 지정
스태시 불러오기
스태시는 현재 브랜치의 워킹 디렉토리와 자동으로 병합한다. 스태시 스택에 저장된 항목들은 어느 브랜치에서나 복원이 가능하다.
$ git stash pop # 스태시 적용 후 목록에서 삭제
$ git stash pop stash@{1} # 특정 스태시 적용 후 목록에서 삭제
$ git stash apply # 스태시를 적용해도 목록에서 삭제하지 않음(변경 사항만 적용)
$ git stash apply stash@{1} # 특정 스태시 적용
$ git stash apply --index # 변경 사항과 staged 상태까지 복원
$ git stash apply --index stash@{1} # 특정 스태시의 staged 상태까지 복원
스태시 삭제
스태시를 복원할 때 한 번 호출하면 자동으로 스택에서 삭제되지만 충돌이 발생하거나 apply 명령으로 복구할 때는 스택에서 삭제되지 않는다. 해당 경우는 drop으로 스태시 목록에서 삭제할 수 있다.
$ git stash drop
$ git stash drop stash@{1} # 특정 스태시 삭제
커밋 후 강제로 복구
스태시 기능을 사용하지 않는다면 작업 중인 내용을 커밋한 후 다시 리셋으로 복원할 수 있다.
$ git commit -am "temp commit" # 임시 커밋
$ git reset --soft HEAD~1 # 복원
변경 사항은 staged 상태로 유지되며 unstaged 상태로 되돌리려면 reset HEAD를 사용한다.
$ git reset # staged 상태 해제
'Git' 카테고리의 다른 글
워킹 디렉토리 정리 (0) | 2025.03.16 |
---|---|
수정 사항 복원 중 충돌 해결 (0) | 2025.03.16 |
브랜치 삭제 (0) | 2025.03.13 |
브랜치 패치 (0) | 2025.03.13 |
원격 브랜치 (0) | 2025.03.09 |