본문 바로가기

잡다/git

[Git 09] Stash

 통상적인 업무를 하다가 갑자기 긴급한 버그를 발견하거나, 수정 사항이 생겨 해당 업무를 먼저 처리해야 하는 상황이 있을 수 있다. 그런데 깃은 변경사항이 저장되지 않은 경우 ( 스테이지 상태에 뭔가 있는 경우 ) 충돌의 문제로 브랜치 이동을 허용하지 않는다. 이런 상황에서 stash 명령어는 큰 도움이 된다.

stash 명령은 수행중인 상태를 임시로 저장하기 위한 명령으로, 명령 수행 이후 변경 이전의 커밋 상태로 돌아간다.

작업중인 업무 임시 저장

$git stash // 현재 진행중인 상황을 임시 저장
$git stash save "message" // 메시지를 달아 임시 저장 
$git stash push // stash save을 대체할 가능성이 있는 명령

stash 명령 수행 이전 상태
stash 명령으로 변경사항 임시로 stack 형태로 저장
stash 명령 수행 이후

스태시 리스트 보기

$git stash list

현재 스태시 상태에 있는 변경사항들을 보고싶을 수 있다. 이 경우 stash list 명령을 이용한다.

위에서 저장한 작업 내역이 보인다.

stash 명령에 의해 저장된 변경사항들은 스택 구조의 형태를 가진다. 각 스태시는 인덱스 번호를 통해 지정할 수 있는데, 위의 경우 feature에서 저장된 스태시 내역을 인덱스 0 을 통해 가리킬 수 있다. 이후 해당 인덱스 기반으로 특정 변경사항을 스택 구조와 무관하게 복원할 수 있다.

새로운 스태시는 위에 쌓인다.

 스택에 새로운 변경사항이 쌓이면, 최신에 들어온 변경사항 순서대로 인덱스가 지정된다.

스태시 복원

저장사항을 복사하는 경우는 크게 2가지가 있다. 스택에서 제거하면서 복원하거나( pop ), 스택에는 그대로 두고 복원하는 방식이다( apply ). 필요에 따라 적절하게 선택하여 스태시를 복원하면 된다.

$git stash pop [stash index] // index 위치의 변경사항을 복원하고, 스택에서 제거한다.

$git stash apply [stash index] // index 위치의 변경사항을 복원한다.
// 인덱스 없이 실행하면 최근에 저장된 변경사항을 복원한다.

stash pop 1 으로 처음에 저장된 내용을 복원했다.

이때 중요한 점은, 스태시를 복원할 때 자동으로 스태시를 저장한 브랜치 및 위치로 이동하지는 않는다는 점이다. 스태시 복원 자체는 어떤 브랜치에서도 수행할 수 있기 때문에, 스태시를 저장한 브랜치에서 복원하고 싶다면 해당 브랜치로 이동한 후 pop 또는 apply 명령을 수행해야 한다.

이외로 --index 옵션을 추가하여 stage 상태도 함께 복원할 수 있다.

스태시 복원 취소

실수로 원하지 않는 위치에서 스태시 복원을 시도하는 경우가 있다. 스태시를 복원한 상태는 최신 커밋으로부터 변경사항을 단순히 저장하지 않은 상태이므로, 해당 변경사항을 스테이지 상태에서 제거하면 이전 상태로 복원된다.

 충돌이 발생하는 경우와 발생하지 않는 경우에 대해 복원을 취소하는 방식이 조금 다르다.

충돌이 발생하는 경우, stash pop을 수행하더라도 스태시 내역이 제거되지 않는다. 따라서 기존 커밋 상태에 대한 변경사항을 제거하기만 하면 된다. 제거는 아래 명령을 통해 가능하다.

$git restore --staged [filename]
$git restore [filename]

중복된 변경사항에 의해 어떻게 merge 할 것인지 물어본다.
명령을 연달아 수행한다.
원래 상태로 복원된다.

 

충돌이 발생하지 않은 경우, 복원된 변경사항은 스태시에 저장되어 있던 내역이다. 해당 내역을 그대로 스태시로 다시 저장하면 기존의 스태시와 동일하므로, stash 명령을 이용해 스태시가 복원되기 전 상태로 복귀할 수 있다.

stash pop을 통해 복원한 내역을 그대로 stash 명령으로 저장하여 이전 상태로 돌아간다.

 

브랜치를 새로 만들면서 복원

스태시를 복원하는 과정에서 기존 코드와 충돌이 발생할 가능성이 있다. 충돌 발생시 위에서 언급한 것처럼 스태시 내역을 pop 명령을 이용해도 삭제하지 않는다. 이 경우 브랜치로 해당 스태시를 저장하여 수동으로 Merge 단계에서 발생하는 충돌을 다루는 방법을 고려할 수 있는데, 이를 위해 스태시를 바로 브랜치로 만드는 기능을 지원한다.

$git stash branch branch_name

 

스태시 내역 삭제

apply 등을 통해 이미 사용하여 쓸모없는 스태시가 존재하는 경우 drop을 통해 제거할 수 있다.

$git stash drop [stash name]

현재 저장된 모든 스태시가 필요 없는 상황이라면 clear을 통해 한번에 제거할 수도 있다.

$git stash clear

clear 이전 상태
clear 이후 상태. 모든 스태시 내역이 제거되었다.

'잡다 > git' 카테고리의 다른 글

[git] git commit message convention  (0) 2023.08.02
[git] WSL2 환경에서의 글로벌 .gitconfig  (0) 2022.02.23
[Git 08] 브랜치  (0) 2021.12.28
[Git 07] 서버  (0) 2021.12.27
[Git 06] Alias  (0) 2021.10.31