[stash]

 

커밋하기 전의 작업 상태를 보존해두었다가 사용할 수 있다.

 


 

커밋하거나 작업 내용을 버리기 전까진 마음대로 다른 상태로 checkout할 수 없다.

다른 상태로 checkout한다는 건 그 상태로 덮어씌운다는건데, 작업물들이 그냥 날라갈 것이니...

(아예 checkout 되지 않도록 에러로 거부한다.)

> git   checkout   main


error: Your local changes to the following files would be overwritten by checkout:

        001.txt<---- 체크아웃시 작업하던 내용을 덮어쓸 수 있어서, 해당 파일을 알려줌.

Please commit your changes or stash them before you switch branches.<---- 커밋하거나 스태시로 저장하라고 힌트를 줌.

Aborting<---- (중단됨)

버려도(git checkout -- 파일경로...) 상관없다면 모를까, 잠깐 옮겨놨다가 복구하고 싶을 수 있다.

아니면 현 작업물을 다른 브랜치 상태에 적용시켜서 이어가고 싶을 수도 있고.

이런 임시 저장소를 stash라고 한다.

 


 

> git   stash   [push]

> git   stash


Saved working directory and index state WIP on a01: 22daa3a my comment 01

stash를 생성한다. 현재 브랜치에서 Track 중인 파일의 모든 변화를 저장하고 브랜치의 원래 상태로 돌아간다.

 

> git   stash   list


stash@{0}: WIP on a01: 22daa3a my comment 01

stash@{1}: WIP on a01: 22daa3a my comment 01

└── 스태시 번호(높을 수록 최근), 생성된 곳의 브랜치, 생성된 기준 커밋, 기준 커밋의 코멘트 등...

stash의 목록을 보여준다.

 

> git   stash   show   [옵션]   [스태시명]

> git   stash   show   stash@{0}


001.txt | 1 +

1 file changed, 1 insertion(+)

스태시를 지정하지 않으면, 가장 최근(가장 번호가 높은)을 보며,

스태시의 작업이 어떤 것인지 간략하게 보여준다.

> git   stash   show   -p


diff --git a/001.txt b/001.txt

index e69de29..58c9bdf 100644

--- a/001.txt

+++ b/001.txt<---- 001.txt 파일에 내용이 추가되어 있음

@@ -0,0 +1 @@

+111<---- 파일 내부에 111이라는 내용이 추가되어 있음

-p옵션으로 스태시의 작업 내용을 좀 더 자세하게 볼 수 있다.(git diff처럼)

 


 

이제 저장해 둔 stash를 사용해보자.

> git   stash   apply   [--index]   [스태시명]

> git   stash   apply


On branch a01

Your branch is up to date with 'origin/a01'.

 

Changes not staged for commit:

  (use "git add <file>..." to update what will be committed)

  (use "git checkout -- <file>..." to discard changes in working directory)

 

        modified:   001.txt

 

no changes added to commit (use "git add" and/or "git commit -a")

일반적인 git status같은 응답을 받으며 작업 내용을 가져온다.

--index옵션으로 스태시를 형성할 당시의 Stage 여부까지 그대로 복원시킬 수도 있다.

(이 옵션 없이 기본 명령어로는 Stage 여부까지는 복원하지 않는다.)

 

에러 응답이 나올 수도 있는데, 그 중 하나는 아래처럼 될 수 있다.


CONFLICT (modify/delete): 001.txt deleted in Updated upstream and modified in Stashed

changes. Version Stashed changes of 001.txt left in tree.

stash를 만들었던 상황과 지금의 상황이

stash를 적용하기에 충돌(conflict)이 일어날 수 있는 경우도 있다.

충돌(conflict)은 자동으로 병합되거나 수동으로 병합해야 하는데,

이건 fetch에서 좀 더 보기로 한다.

 

git apply를 한다고 스태시가 지워지는건 아니고, 원한다면 몇 번이든 사용할 수 있다.

 


 

스태시가 이제 필요없다면 지울 수 있다.

> git   stash   drop   [스태시명]

> git   stash   drop


Dropped refs/stash@{1} (bfeb5e2fed5511a5380b676daef517e68d4d2a88)

역시 스태시를 지정하지 않으면, 가장 최근(가장 번호가 높은)것을 지운다.

 

만약 스태시를 적용과 동시에 삭제까지 바로 하고 싶다면(apply+drop)

git   stash   pop   [--index]   [스태시명]을 사용하면 된다.