안녕하세요. 이번 시간에는 git stash apply와 git stash pop의 차이에 대해 알아봅시다.

 


 먼저 apply에 대해 알아봅시다.

 

 1.txt에 있는 6과 7을 제거하고, 3과 8 사이에 9를 추가하겠습니다. 그리고 이 변경 사항을 stash 해 보겠습니다.

 

 

 list를 보면 stash@{0}이 있는데요. 1.txt에 있는 6과 7을 제거하고 3과 8사이에 9를 추가한 변경 내역을 의미합니다. 실제로, 이 변경이 맞는지 show 명령어로 확인해 봅시다.

 

 

 정확히 맞네요. 이제, stash apply를 해 보겠습니다.

 

 그러면 1.txt가 변경되었다는 내역이 다시 로컬에 반영이 됩니다. 그리고 나서 다시 git stash list를 입력해 보겠습니다.

 

 봤더니, 아직도 stash@{0}에 대한 정보가 저장되어 있어요. 이 정보는 무엇인가요? 6과 7을 제거하고, 3과 8 사이에 9를 추가한 변경 내역을 의미해요. stash list에서 스태시의 status (정보)를 제거하지 않습니다. 위 그림만 봐도 알 수 있는 점입니다. 이제, 로컬의 변경 사항을 다시 stash 하겠습니다.

 

 

 그리고, 2.txt에 3, 4, 5를 추가한 변경 사항도 stash 하겠습니다. 이러면 어떻게 그림이 그려질까요? git stash apply로 스태시의 맨 위에 있는 변경 사항을 current working state 에 반영했지만, 스태시 리스트에 상태를 제거하지 않았습니다. 따라서, 그림은 아래와 같이 그려질 겁니다.

 

 

 apply를 한 직후입니다. 1.txt가 변경되었다는 이력이 stash@{0}에 있는 상태입니다. 그리고 current working state 에는 1.txt가 변경되었다는 정보가 있을 겁니다.

 


 git stash를 하면 어떻게 될까요? 1.txt가 변경되었다는 이력이 새로 stash list에 올라갑니다.

 

 

 그러면 stash@{0}에는 1.txt가 변경되었다는 정보가 올라갈 겁니다. 기존에 있었던 stash@{0}은 stash@{1}로 밀려날 거고요. 마치 스택처럼 동작한다고 생각하면 편합니다. 이 상태에서 로컬에서 2.txt에 3, 4, 5를 추가한 후에 다시 스태시 명령어를 입력했습니다.

 

 그러면 stash@{0}에는 2.txt가 변경되었다는 이력이 들어가게 됩니다. 그래서 군청색은 2.txt가 변경된 이력, 노란색은 1.txt가 변경된 이력을 의미하겠습니다. 실제로 list를 보면 아래와 같이 되어 있어요.

 

 3개의 스태시 목록들이 있음을 볼 수 있어요. 그리고, 0번과 1번을 볼까요?

 

 

 0번은 보시다시피, 2.txt에 3, 4, 5를 추가한 이력이 저장되어 있습니다.

 

 

 그리고 1번에는 3과 8 사이에 9가 추가되고, 6, 7이 제거된 이력이 있습니다. 물론 2번도 마찬가지입니다.

 

 


 git stash pop 1을 하면 어떻게 될까요? 1.txt가 modified가 되었다는 정보가 current working state에 반영되게 됩니다.

 

 

 이제, git stash list를 보면, 스태시 하나가 사라졌음을 볼 수 있어요. 즉 current working state에 반영하고 stash 목록에서는 제거하는 것이 git stash pop이라고 할 수 있어요. 즉, apply와 pop 차이는 현재 working state에 스태시를 반영하고 stash 리스트에 그대로 유지를 하느냐, 제거하느냐의 차이로 볼 수 있겠습니다.