수학과의 좌충우돌 프로그래밍

08.git stash, 책갈피처럼 사용해보자 본문

git

08.git stash, 책갈피처럼 사용해보자

ssung.k 2019. 2. 9. 16:39



안녕하세요 강민성입니다.


이번 시간에는 git stash 에 대해서 알아보겠습니다.


stash의 사전적 의미를 찾아보면


'숨기는 장소'


라는 의미를 담고 있습니다.


의미로는 어떤 역할을 하는지 알아보기가 쉽지 않습니다.


함께 알아보도록 하겠습니다.




git 의 책갈피, stash 란?


 

stash 를 사용하는 경우부터 알아보겠습니다.


현재 a 라는 branch 에서 작업을 하고 있습니다.


아직 작업이 끝나지 않았는데 더 급한 일이 생겨서 b 라는 branch로 checkout 해야 할 일이 생겼습니다.


a 라는 branch에서 작업을 하고 있었는데 이 상태에서 바로 checkout을 하게 되면


다른 branch 까지 영향을 미치게 됩니다.


그렇다고 commit 하고 이동하기에는 작업이 애매하게 끝나서 마땅치 않습니다.


이 때 사용하는 게 바로 stash 입니다.


동작 방식은 a branch 에서 작업 내용을 어딘가에 숨겨놓고


가장 최근 버젼으로 이동하여 branch 상태를 깨끗하게 만든 후,


다른 branch 로 이동하여 작업하고 다시 돌아오는 것입니다.



실습을 통해서 자세히 알아보도록 하겠습니다.


git_stash 라는 디렉토리를 만들고


초기화 해준 후,


내용이 a 인 test1.txt 이라는 파일을 message 1 로 commit 했습니다.

exp라는 이름의 branch를 만들고 이동하여


test1.txt의 내용을 ab로 바꿔주었습니다.

commit을 하지 않은 체로 master로 checkout 한 후,


git status 를 확인해보면


exp branch 에서 영향을 받아 test1.txt 파일이 바뀐 것을 볼 수 있습니다.


이는 우리가 원하는 상황이 아니므로 해결해보도록 하겠습니다.

다시 exp로 돌아간 후


git stash (save)

라는 명령어를 입력합니다.


원래 명령어는 git stash save 인데


save 는 생략이 가능해서 보통 git stash 로 사용합니다.


저장되었다는 메세지가 출력되고 


branch가 commit 할 것이 없는 깨끗한 상태로 표시됩니다.

다음은 stash로 숨겼던 내용을 불러오겠습니다.


git stash apply

가장 최근의 stash 를 불러오고,


현재 상태가 아까 숨겼던 내용 그대로


test1.txt 가 수정된 상태로 남게 됩니다.

내용을 확인해보면 수정된 상태입니다.

다음으로는 stash 한 목록들을 확인해보도록 하겠습니다.


git stash list

지금은 stash 한 내용이 하나이므로 하나만 표시 됩니다.


{ } 안의 수가 stash 들의 index를 나타내며 가장 최근 index가 0이고


오래 될수록 index의 수가 커지게 됩니다.


그리고 apply는 index가 0인 가장 최근 stash를 불러오게 됩니다.

따라서 과거의 stash에 접근하기 위해서는 최근의 stash를 삭제해야 합니다.


stash 를 삭제하기 위해서는


git stash drop

drop 을 이용하여 삭제합니다.


stash는  apply로 적용시키고 나면 다시 쓸 일이 없을 경우도 많습니다.


따라서 apply 와 drop 을 동시에 사용할 수 있습니다.


git stash pop

pop 을 이용하여 간편하게 명령을 내릴 수 있습니다.



stash가 안되는 상황?


stash를 사용하다보면 잘못되는 경우가 생깁니다.


지금부터 그런 상황을 한 번 알아보겠습니다.


먼저 reset 을 사용해서 가장 최근 commit 의 돌아가겠습니다.


git reset --hard

test1.txt 는 ab로 수정을 하고 test2.txt 를 c라는 내용으로 생성해보겠습니다.

git status를 확인해보면 


test1.txt 는 수정된 상태, test2.txt는 untracked 인 상태라고 나옵니다.

이 상황에서 stash 를 하고 다시 내용을 확인해보면


내용을 모두 숨길거라고 예상했지만 예상 밖으로


test2.txt 가 아직 남아있습니다.

그 원인은 untracked 에 있습니다.


stash는 기본적으로 버젼관리가 되고 있는 파일들에 한해서만 적용됩니다.


따라서 아직 git add를 안한, 즉, 버젼관리가 안되고 있는 test2.txt 에는 적용이 안된 것입니다.


따라서 stash를 하기위해선 모든 파일을 버젼관리하고 하시길 바랍니다.


Comments