Git

Git Stash - 작업하던 내용을 임시 저장하기

강태종 2022. 2. 8. 20:00

커밋하지 않은 변경 내용이나 새롭게 추가된 파일들이 작업 트리에 남아있는 채로 다른 브랜치로 전환(checkout)하면, 그 변경 내용은 기존 브랜치가 아닌 전환된 브랜치로 옮겨가게 됩니다.

 

만약 코드를 열심히 수정하다가 갑자기 핫픽스 요청이 들어오는 경우 완성되지 않은 내용을 커밋하기에는 찝찝하고, 변경사항 전체를 하드 리셋하거나, 새로운 저장소를 만들어서 작업하는 등 명쾌한 해답은 없었습니다.

git add .
git commit -m "Hotfix 작업을 위한 임시 저장(작업중)"

 

이런 상황에서 git stash 명령어로 변경사항을 임시 저장했다가, 나중에 다시 이어서 작업할 수 있습니다.

 

user@AL01724100 Git-Study % ls
aa	bb	cc

aa, bb, cc 파일이 있을 때 cc 파일을 작업하던 중 다른 파일을 작업하는 경우를 예로 들겠습니다.

 

user@AL01724100 Git-Study % git stash
Saved working directory and index state WIP on cc: 5c7d508 stash cc pop
user@AL01724100 Git-Study % git status
현재 브랜치 cc
커밋할 사항 없음, 작업 폴더 깨끗함

stash 명령어를 실행하면 작업했던 내용이 초기 상태로 변한 것을 확인할 수 있습니다. 또한 status로 확인해도 변경 사항이 없는 것을 확인할 수 있습니다. 이제 급한 작업을 처리하면 됩니다.

 

user@AL01724100 Git-Study % git stash pop
현재 브랜치 cc
커밋하도록 정하지 않은 변경 사항:
  (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오)
  (use "git restore <file>..." to discard changes in working directory)
	수정함:        cc

커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를
사용하십시오)
Dropped refs/stash@{0} (88dcd639101f4f957800115c4d3219eb3aa0553d)

이후 기존의 작업을 다시 진행하기 위해 stash pop 명령어를 실행합니다. 기존의 작업했던 내용을 확인할 수 있으며 작업을 이어서 진행하면 됩니다!!


 

user@AL01724100 Git-Study % git stash -m "c"
Saved working directory and index state On cc: c
user@AL01724100 Git-Study % git stash -m "z"
Saved working directory and index state On cc: z
user@AL01724100 Git-Study % git stash list
stash@{0}: On cc: z
stash@{1}: On cc: c

stashcommit처럼 메시지를 설정할 수 있습니다. -m을 통해 메시지를 설정할 수 있으며, stash list 명령어를 통해 stash 목록을 확인할 수 있습니다.

 

user@AL01724100 Git-Study % git stash show 0
 cc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
user@AL01724100 Git-Study % git stash show 1
 cc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

또한 git stash show + index를 통해 stash에서 변경된 내용을 diff처럼 자세히 볼 수 있습니다.

 

user@AL01724100 Git-Study % git stash apply 1
현재 브랜치 cc
커밋하도록 정하지 않은 변경 사항:
  (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오)
  (use "git restore <file>..." to discard changes in working directory)
	수정함:        cc

커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를
사용하십시오)
user@AL01724100 Git-Study % git stash list
stash@{0}: On cc: z
stash@{1}: On cc: c
user@AL01724100 Git-Study % git stash drop 1
Dropped refs/stash@{1} (f4a08026c2ece045bbc7a914d04d93d48f029e5f)

git stash apply + index를 통해서 해당 stash에 저장된 내용으로 복구할 수 있습니다. stash pop과 다른 점은 명령어 실행 후 stash를 삭제 하는지 하지 않는지 입니다. stash를 삭제하는 명령어는 stash drop을 통해 삭제할 수 있습니다. 즉, stash pop은 apply + drop을 합친 것과 같으며 stash는 스택 구조로 관리됩니다.