개발자 도구/Git

Git) stash 명령어로 파일을 임시 저장하기

Dev.Andy 2023. 10. 17. 23:59

목차

    머리말

    stash을 배우기 전과 후의 모습

      stash 이전 stash 이후
    긴급한 문제 발생 시 (1) 작업 중인 브랜치에서 바로 대응
    → 브랜치 기능과 관련이 없는 부분을 포함한 채로 커밋을 남겨 푸쉬

    (2) 다른 빈 파일/페이지에 해결 내용을 일일이 저장 후 브랜치로 분기하여 나중에 붙여넣기
    git stash 하여 문제 해결한 코드를 임시저장
    → 다른 브랜치로 분기하여 이를 적용
    → 달라진 브랜치에서 푸쉬

     

    포스팅 이유

    a) feature branch에서 작업 중 긴급한 문제 발생

    Git에서 feature/stamp-list-UI 브랜치에서 작업을 하고 있었다.

    스탬프목록 화면에 대한 UI 구현 #23

    하지만 도중에 긴급한 문제를 발견했다. 이대로 계속 코드만 늘어나면 해당 branch 기능에서 벗어난 코드가 늘어날 수 있고 해당 문제를 먼저 수정해야 하는 필요성을 발견했다.

    화면 스크롤 시 NavigationBar, TabBar의 색상이 변하는 문제 #22

    b) 또다른 feature branch로 나눠야 할 필요성

    따라서 여태 구현한 부분만 커밋을 하고 현재 기능과 관련이 없는 부분만 남겨두어 이를 stash 했다. 저장한 stash를 다시 다른 git branch에 적용해서 git branch를 세분화 할 수 있었다.

    화면 스크롤 시 NavigationBar, TabBar의 색상이 변하는 문제 수정 #24

    git stash

    0)  ⭐️ 새로 추가한 파일을 저장하지 않는 stash

    (10월 18일 업데이트)

    기본적으로 stash는 새롭게 추가한 untracked 파일을 무시한다. 그렇다면 untracked 파일은 어떻게 할 수 있을까?

    0-1) u 옵션을 주어 stash 하기

    `-u`만 추가하면 untracked 또한 stash 할 수 있다

    git stash -u

    0-2) --include-untracked 옵션을 주어 stash 하기

    `--include-untracked`의 단축 옵션이 `-u` 이다. (같은 기능) 아마 길어서 거의 사용하지 않을 듯하다.

    git stash --include-untracked

    0-3) git add 해서 stash 하기

    add를 쓰면 untracked 파일을 스테이징하여 staged 상태로 만들기 때문에 저장이 가능하다

    1) git stash list

    임시 저장한 목록을 확인

    명령어를 실제로 사용해 보자.

    git stash list
    stash@{0}: On feature/bar-appearance: appearance with system color
    stash@{1}: WIP on feature/fix-bar-appearance: bcfdb40 feat: annotation 저장 시 realm에 저장 및 방문 처리 (#19)

    📌 stash는 스택(stack)의 특징을 갖고 있다

    후입선출(LIFO)의 특징을 갖는 스택

    스택은 가장 최근에 추가한 것을 꺼내는 후입선출(LIFO)의 특징을 갖고 있다.

    스택의 추가는 push라 하고, 삭제는 pop이라 한다.git stash에서도 이를 명령어로 구현되어 있어서 사용할 수 있다.

    이에 대한 내용은 스택에 대해 간단히 정리해 놓았으니 참고

    (자료구조) 스택(Stack) in Python

    2) git stash push

    가장 최근의 것으로 저장하는 push

    곧바로 push를 하게 되면 아래처럼 WIP(Work In Progress; 진행 중인 작업)라는 용어와 함께 저장이 된다.

    git stash push
    stash@{0}: WIP on feature/fix-bar-appearance: bcfdb40 feat: annotation 저장 시 realm에 저장 및 방문 처리 (#19)

    (+) m 옵션을 통해 특정 메시지를 같이 기록하기

    이번에는 `-m`을 적용하여 특정 메세지와 함꼐 적용하도록 하였다.

    git stash push -m "appearance with system color"
    Saved working directory and index state On feature/stamp-list-UI: appearance with system color
    stash@{0}: On feature/bar-appearance: appearance with system color
    stash@{1}: WIP on feature/fix-bar-appearance: bcfdb40 feat: annotation 저장 시 realm에 저장 및 방문 처리 (#19)

    이를 통해 2가지 사실을 알 수 있다

    1. stack의 특징으로 최근의 것이 0번 인덱스에 저장이 되었고,
    2. m 옵션을 통해 특정 메시지가 기록 되었다.

    3) git stash pop

    가장 최근의 것을 가져오고 해당 stash를 삭제

    곧바로 pop을 하면 가장 최근의 것(즉, 0번 인덱스의 stash)을 적용한다.

    git stash pop

    인덱스를 통해 특정 stash를 가져오기

    하지만 최근의 것이 아닌 특정 stash를 가져오고 싶다면 index를 입력하면 된다.

    인덱스는 아래와 같이 "@{n}"의 형태를 띠고 있다

    git stash pop stash@{1}

    🔗 참고 자료

    Git Documentation

    Git - git-stash Documentation