프로젝트 작업중 이전 분기의 작업물에 대한 기능 확인 때문에 다른 브랜치에 체크아웃 해야하는 상황이 생겼다. 작업물을 커밋 하고 움직이기에는 아직 commit단위를 채우지 못했기 때문에 임시 저장 후 작업을 하게되었다.
그럴때 다른 브랜치에 checkout을 시도하면 commit 혹은 stash를 먼저 하라는 문구를 확인할 수 있다.
IntelliJ에서는 stash와 비슷한 기능인 Shelve라는 기능을 제공하는데 해당 기능을 사용해 보기로 했다.
먼저 Shelve와 Stash의 차이를 알아보면
IntelliJ Shelve
Shelve는 IntelliJ에서 제공하는 변경사항을 임시로 저장하는 기능이며 git의 기능이 아니다.
- IntelliJ에 특화된 기능으로 Git등의 다른 버전관리 시스템에는 존재하지 않는기능이다.
- 변경 사항 보관: 작업 중인 변경 사항을 Shelve에 저장할 수 있다. 코드를 커밋하지 않고 임시로 보관하고 싶을 때 유용하다
- 파일 단위저장: 파일을 단위로 변경사항을 저장한다. 특정 클래스 파일만 지정하여 보관할수 있음을 의미하며 변경된 전체 작업을 저장하는 stash와 가장 큰 차이점이라 생각한다.
- 프로젝트 간 공유 불가: 변경 사항은 현재 프로젝트에만 국한되면 다른 프로젝트나 IntelliJ 인스턴스에서는 접근할 수 없다.
Stash
- Git에 통합된 기능으로 IntelliJ 뿐만아니라 다른 IDEA나 Git 호환 도구에서도 사용할 수 있다.
- 작업 디렉토리 정리: 작업 디렉토리에서 변경사항을 임시로 제거 하고, 나중에 다시 적용하거나 삭제(drop)할 수 있다.
- 디렉토리 단위 저장: 변경된 전체 디렉토리를 저장한다.
- 다중 프로젝트/환경지원: Git저장소에 종속되므로 다른 프로젝트나 환경에서도 동일한 저장소에 접근할 수 있다.
Shelve 사용해보기
- 변경사항이 있는 채로 다른 브랜치로의 checkout을 시도하면 다음과같은 경고창이 발생한다.

- commit-> Shelf에 넣을 변경사항 선택 -> 우클릭 한 후 shelve changes 를 누르면 shelf에 저장된다.

- 커밋창 우측의 Shelf를 선택하면 저장된 이전 작업내용들을 확인 할 수 있다.

- 원래 하던작업을 불러오려 한다면 Shelf -> Unshelve를 통해 불러올 수 있다.

이전 작업들을 Shelf에서 Unshelve를 통해 불러왔더라도 Shelf에 저장된 내역들은 자동으로 지워지지 않는다.
마무리
둘 다 코드 변경 사항을 임시로 저장하는데 사용되지만, Shelve는 IntelliJ 전용이며 Stash는 Git에 통합된 기능이다.
Stash는 Git에 통합된 기능으로 더 큰 범위의 코드 변경 사항을 관리하는 데 적합하며 다른 Git 환경이나 프로젝트에서도 접근할 수 있는 이점이 있다.
반면, Shelve는 파일단위 Stash는 디렉토리 단위로 저장하게 되는데 Shelve가 즉각적이고 세부적인 작업에서는 좀 더 유연하게 적용 가능할 것 같다는 생각이 든다.