git stash

bunny.log·2022년 12월 14일
0
  • git stash save : 현재 작업을 일시적으로 저장해 두고 싶다.

  • git stash list : 일시적으로 저장해 둔 작업 목록을 확인하고 싶다.

  • git stash pop : 일시적으로 저장해 둔 작업을 되돌리고 싶다.

  • git stash drop : 일시적으로 저장해 둔 작업을 삭제 하고 싶다.

  • git stash clear : 일시적으로 저장해 둔 작업을 모두 삭제 하고 싶다.

git stash : 변경사항을 임시로 저장하는

stash는 기본적으로 스택처럼 동작합니다. git stash로 변경사항을 쌓아놓고, pop으로 가장 최근에 저장한 변경사항을 꺼내고 그 내용은 삭제해버립니다.

$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   README.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   index.html

git stash 명령어는 Git 저장소에 관리하고 있는 파일들을 대상으로 실행되며, 스테이지에 있는 내용과 아직 스테이지에 들어가지 않은 변경사항을 모두 저장해줍니다.

그럼 이 상태에서 git stash를 실행하고, git status로 상태를 확인해봅니다.

$ git stash
Saved working directory and index state WIP on master: 451c825 Add index.html

$ git status 
On branch master
nothing to commit, working tree clean

git stash를 통해 작업 내용을 워킹 디렉토리에 쌓으면
git staus로 워킹 트리를 검색하면 워킹 트리가 깨끗한 상태입니다.
즉, 최종 커밋으로부터 변경된 내용이 없다는 의미입니다. 이제 다른 작업을 진행하면 됩니다. 예를 들어 app.js 파일을 급하게 하나 추가하고 커밋했다고 가정해보겠습니다. 이제 프로젝트는 다음과 같습니다.

# 먼저 변경사항이 없는 것을 확인합니다.
$ git status
On branch master
nothing to commit, working tree clean

git stash pop : 임시 변경 사항을 꺼내오는

$ git stash pop
No stash entries found.
$ git stash -m 'app.js 작업을 위한 임시 저장'
$ git stash list
stash@{0}: On master: app.js 작업을 위한 임시 저장

여기서 stash@{0}이 이 임시 변경사항의 임시 이름이 됩니다. 뒤에서 살펴보겠습지만, stash를 쌓을 때마다 새로 쌓은 내용이 {0} 인덱스를 가지기 때문에 다수의 임시 변경사항을 가지고 작업할 때는 작업 전에 꼭 인덱스를 다시 확인해야합니다.

이 임시 변경사항(stash@{0})의 내용을 확인해보겠습니다. git stash show 명령어를 사용합니다.

git stash show

$ git stash show stash@{0}
commit a686394953c63316913361cc2b7afb5d0bd0384b (refs/stash)
Merge: e1bbd0c 3e38de1
Author: LainyZine(lainyzine.com@gmail.com)
Date:   Thu Apr 29 09:18:48 2021 +0900

    On master: app.js 작업을 위한 임시 저장

diff --cc README.md
index e69de29,e69de29..087b7d1
--- a/README.md
+++ b/README.md
@@@ -1,0 -1,0 +1,3 @@@
.....
@@@ -1,5 -1,5 +1,5 @@@
.....

git diff와 같은 형식으로 stash된 내용을 확인할 수 있습니다.

여기서 app.js를 수정하고, 이 내용도 stash로 임시 저장해보겠습니다. 이번에는 git stash save 명령어를 사용합니다.

$ git stash save
Saved working directory and index state WIP on master: e1bbd0c Add app.js

git stash는 git stash save의 축약형입니다. -m를 붙이지 않으면 현재 상태를 의미하는 메시지가 자동으로 붙여집니다.

다시 git stash list로 임시 저장된 목록을 확인해보겠습니다.

$ git stash list
stash@{0}: WIP on master: e1bbd0c Add app.js
stash@{1}: On master: app.js 작업을 위한 임시 저장

이제 임시 저장된 내용이 2개가 되었습니다. 여기서 주목할 점은 마지막에 stash한 내용이 가장 위에 있고, 인덱스가 {0}이 되었다는 점입니다.

git stash apply

apply를 명시적으로 실행하면 stash@{0}의 내용을 꺼내오지만, 삭제하지는 않습니다.

git stash pop: apply와 drop 명령어의 조합
이번에는 git stash pop에 대해서 좀 더 알아보겠습니다. git stash pop을 인자 없이 실행하면 인덱스가 stash@{0}인 변경사항(가장 최근에 stash된 내용)에 대해 다음 두 가지 작업을 수행합니다.

stash@{0}을 꺼내온다. (apply)
stash@{0}을 삭제한다. (drop)
즉, pop 작업은 apply와 drop으로 나눠서 생각해볼 수 있습니다.
apply를 명시적으로 실행하면 stash@{0}의 내용을 꺼내오지만, 삭제하지는 않습니다.

$ git stash apply
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   app.js

$ git stash list
stash@{0}: WIP on master: e1bbd0c Add app.js
stash@{1}: On master: app.js 작업을 위한 임시 저장

$git stash apply를 하면 $git statsh pop과는 다르게
꺼내온 내용이 여전히 남아있는 것을 확인할 수 있습니다. 이 상태에서 drop을 실행하면 stash@{0}을 삭제합니다.

$ git stash drop
Dropped refs/stash@{0} (716b4e839729443a935b7e15b6398c5cee152e49

$ git stash list
stash@{0}: On master: app.js 작업을 위한 임시 저장

stash@{0}이 삭제되고, stash@{1}이 stash@{0}로 변경된 것을 확인할 수 있습니다.

git stash pop, git stash apply, git stash drop 명령이의 기본 인자가 stash@{0}라는 것을 기억해주세요. 인자를 변경하는 것도 가능합니다.

아래 예제에서는 명시적으로 stash@{1}의 변경사항을 꺼내고 삭제합니다. apply와 drop을 git stash pop stash@{1} 명령어 하나로 실행해도 결과는 같습니다.

$ git stash
Saved working directory and index state WIP on master: e1bbd0c Add app.js

$ git stash list
stash@{0}: WIP on master: e1bbd0c Add app.js
stash@{1}: On master: app.js 작업을 위한 임시 저장

$ git stash apply stash@{1}
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   README.md
    modified:   index.html

$ git stash drop stash@{1}
Dropped stash@{1} (a686394953c63316913361cc2b7afb5d0bd0384b)

더 많은 내용은 아래 url 참고
https://www.lainyzine.com/ko/article/git-stash-usage-saving-changes-without-commit/

profile
나를 위한 경험기록

0개의 댓글