Git에서 작업 내역을 임시로 저장하고 복원하기

Git // 2024년 07월 05일 작성

Git 저장소로 관리하는 프로젝트 작업 중 원래 소스를 참조해야 해서 현재의 작업 내용을 잠깐 어딘가 보관해 두고 수정된 내역을 다시 원래대로 돌리고 싶을 때가 있다. 이럴 때는 stash 커맨드를 사용할 수 있는데 어떻게 사용하는지 대충 정리해 보자.

Git Stash

Git의 Stash 기능은 이름처럼 임시 영역에 무언가를 넣어두는(stash) 명령이다. 넣는 것은 '변경 사항' 뿐이기 때문에 이 명령을 실행하면 현재 저장소의 브랜치는 수정하기 전 상태로 돌아간다는 것이 특징이다. 그 외에 임시 영역은 브랜치와 무관하게 보관된다는 특징 또한 가지고 있다.

당연하겠지만 Stash는 작업 중(dirty)인 내역만 임시 영역으로 옮기고, 커밋된 부분이나 저장소에 포함되지 않은(untracked) 파일은 옮기지 않는다. 따라서 커밋하기 전에 수정 전의 코드를 사용해야 할 일이 있을 때 유용하게 사용할 수 있다.

그 외에 여러 기능이 제공되지만 이 글에서는 기본적인 사용법과 개인적으로 종종 사용하는 방법에 대해서만 정리한다.

작업 내역을 임시 영역으로 옮기기

현재 작업 내역 중 커밋되지 않은 변경점들은 stash 명령을 이용해 임시 영역으로 옮길 수 있다. 이러면 마치 농땡이(?)를 피운 양 현재 브랜치의 작업 내역이 싹 초기화된다.

git stash

-m으로 옵션으로 커밋과 비슷하게 메시지를 남길 수도 있으니 참고하자.

git stash -m "is this correct way?"

특정 파일만 임시 영역에 옮기고 싶은 경우

Git 2.13 부터 stash push 명령이 새롭게 생겼다. 이 명령을 이용하면 파일 단위로 임시 영역으로 변경점들을 옮길 수 있다.

git stash push foo/bar/file

임시 영역 목록 보기

임시 영역에 보관된 내역들은 stash list 커맨드로 대충 확인할 수 있다.

git stash list

임시 영역의 내용물 보기

임시 영역에 보관된 변경 사항이 어떤지 대충 확인할 때는 show 커맨드를 사용할 수 있다.

git stash show [stash_name]

당연하겠지만 stash_nam을 생략하면 모든 사항이 표시된다.

임시 영역과 현재 브랜치와 비교하기

임시 영역의 들어간 내용들과 현재 브랜치와의 차이점(diff)을 보려면 show 커맨드에 -p 옵션을 붙여보자.

git stash show -p [stash_name]

역시 stash_name 부분은 생략할 수 있다.

임시 영역의 변경사항을 현재 브랜치에 적용하기

볼 일(?)이 다 끝나고 임시 영역의 내용을 현재 브랜치로 다시 가져오려면 pop 명령을 활용해보자. 이 경우 임시 영역의 내용은 사라진다.

git pop [stash_name]

stash_name을 생략하면 모든 임시 영역의 변경 사항들이 그대로 적용된다. 당연하겠지만 커밋 되기 전의 상태를 의미한다.

임시 영역을 초기화하지 않고 적용하기

만약 임시 영역의 내용을 현재 브랜치에 적용할 때 임시 영역에서 지우지 않길 원한다면 apply 커맨드를 활용해 보자.

git stash apply [stash_name]

자주 쓸 일은 없겠지만 여러 브랜치에 비슷한 변경 사항을 적용해서 커밋하기 전에 시험해 볼 때는 유용할 수도 있다.

임시 영역의 변경사항 버리기

임시로 보관된 변경사항들을 지워버릴 때는 drop 명령을 사용할 수 있다.

git stash drop [stash_name]