커밋 없이 브랜치 전환? git stash 실전 예제로 해결!

갑자기 다른 브랜치로 이동해야 하는데, 지금 작업 중인 파일들을 미처 다 끝내지 못해서 커밋하기도 난감하고, 그렇다고 포기할 수도 없어 이러지도 저러지도 못했던 경험, 다들 있으실 겁니다.

이런 상황은 작업 흐름을 방해하고, 불필요한 고민으로 이어져 생산성을 저하시킵니다. 미완성된 코드를 커밋하는 것은 코드 품질을 떨어뜨리고 히스토리를 오염시킬 위험도 있습니다.

이 글에서는 Git의 `stash` 명령어를 활용해 작업 중인 변경 사항을 안전하게 임시 저장하고, 필요한 시점에 다시 복원하여 효율적으로 브랜치를 전환하며 작업하는 실질적인 방법을 안내합니다.

이 글의 핵심

– Git `stash`는 미완성된 변경사항을 커밋 없이 임시 저장하는 강력한 도구입니다.
– `stash` 명령어를 통해 브랜치 전환 등 갑작스러운 상황에 유연하게 대처할 수 있습니다.
– 여러 개의 stash를 관리하고 특정 stash를 선택적으로 적용하는 방법을 이해하여 작업 효율을 극대화합니다.

💡 한 줄 답변

커밋 없이 브랜치를 전환해야 할 때, `git stash`를 사용하면 현재 작업 내용을 임시 저장하고 다른 브랜치에서 작업 후 돌아와 이어서 할 수 있습니다.

Git Stash, 왜 필요할까요? – 미완성 작업 처리의 딜레마

개발 과정에서 우리는 예상치 못한 상황에 자주 직면합니다. 한 브랜치에서 중요한 기능을 개발하던 중, 긴급한 버그 수정 요청이 다른 브랜치에서 발생하거나, 동료의 도움이 필요해 잠시 다른 작업으로 이동해야 할 때가 대표적입니다. 이때 작업 중이던 코드가 아직 미완성 상태라면 크게 3가지 선택지 앞에서 고민하게 됩니다.

첫 번째는 미완성된 코드를 임시 커밋하는 것입니다. 하지만 이는 커밋 히스토리를 지저분하게 만들고, 나중에 해당 커밋을 되돌리거나 수정해야 하는 번거로움을 초래합니다. 두 번째는 변경 사항을 모두 버리고 다른 브랜치로 이동하는 것인데, 이는 당연히 시간 낭비와 함께 개발자의 사기를 저하시키는 최악의 선택입니다. 마지막으로, 단순히 브랜치를 전환하려 시도하면 Git이 충돌 가능성 때문에 전환을 허용하지 않아 발만 동동 구르게 됩니다.

바로 이때 `git stash` 명령어가 빛을 발합니다. `git stash`는 현재 작업 디렉토리의 변경 사항을 임시로 저장하여 작업 디렉토리를 깨끗한 상태로 만들어줍니다. 마치 책갈피를 꽂아두고 잠시 책을 덮어두는 것과 같습니다. 이 기능을 통해 개발자는 현재 작업에 대한 부담 없이 자유롭게 브랜치를 전환하거나 다른 작업을 수행할 수 있습니다.

git stash 임시 저장 후 다른 브랜치 작업

Photo by Markus Spiske on Pexels

Git Stash 기본 사용법: 임시 저장하고 다시 불러오기 (3단계 실습)

이제 `git stash`의 기본적인 사용법을 단계별로 알아보겠습니다. 이 3단계만 익히면 여러분은 어떤 상황에서도 미완성된 작업을 안전하게 다룰 수 있습니다.

먼저, 작업 중인 파일을 수정하거나 새로 추가하여 변경 사항을 만듭니다. `git status` 명령어로 변경 사항을 확인해 보세요. 예를 들어 `feature` 브랜치에서 작업 중인 `index.js` 파일을 수정했다고 가정합니다.

  1. 작업 임시 저장하기 — `git stash` 또는 `git stash push` 명령어를 사용하여 현재의 변경 사항을 임시 저장합니다. Git은 워킹 디렉토리의 변경 사항과 스테이징 영역의 변경 사항을 스택에 저장하고, 워킹 디렉토리를 마지막 커밋 상태로 되돌립니다.
    git stash

    만약 나중에 쉽게 기억할 수 있도록 메시지를 남기고 싶다면 `git stash push -m “작업 중이던 기능A 임시 저장”`처럼 사용할 수도 있습니다.

  2. 저장된 stash 목록 확인하기 — `git stash list` 명령어를 통해 지금까지 임시 저장한 stash 목록을 확인할 수 있습니다. 각 stash는 `stash@{0}`, `stash@{1}`과 같은 형식으로 고유한 인덱스를 가집니다. 가장 최근에 저장한 stash가 `stash@{0}`입니다.
    git stash list

    출력 예시:
    `stash@{0}: On feature: 작업 중이던 기능A 임시 저장`
    `stash@{1}: On main: 버그 수정 중 임시 저장`

  3. 저장된 작업 복원하기 — 임시 저장된 작업을 다시 불러오는 방법은 크게 두 가지입니다.
    • `git stash apply`: 특정 stash를 현재 브랜치에 적용합니다. stash는 스택에 그대로 남아 있어 여러 번 적용할 수 있습니다. 예를 들어 `git stash apply stash@{1}`은 `stash@{1}`을 적용합니다. 아무 인덱스 없이 `git stash apply`를 사용하면 가장 최근의 stash(`stash@{0}`)가 적용됩니다.
    • `git stash pop`: 특정 stash를 현재 브랜치에 적용함과 동시에 스택에서 해당 stash를 제거합니다. 일반적으로 가장 많이 사용되는 방식이며, `git stash pop`은 `stash@{0}`을 적용 후 제거합니다.
    git stash pop
    # 또는
    git stash apply stash@{0}

    이렇게 복원된 변경 사항은 다시 워킹 디렉토리로 돌아오며, 원래 하던 작업을 이어서 진행할 수 있습니다. 10초도 채 걸리지 않는 과정으로 작업의 연속성을 확보할 수 있습니다.

git stash 임시 저장 후 다른 브랜치 작업

Photo by Stanislav Kondratiev on Pexels

Git Stash 활용 마스터: 여러 스택 관리와 고급 기능

단순히 임시 저장하고 복원하는 것을 넘어, `git stash`는 더 유연한 작업을 위한 몇 가지 고급 기능을 제공합니다. 여러 개의 stash를 쌓아두고 관리하는 방법을 안다면, 복잡한 상황에서도 침착하게 대처할 수 있습니다.

`git stash list` 명령어를 통해 여러 개의 stash가 쌓여 있는 것을 확인했다면, 이제 필요에 따라 원하는 stash를 선택적으로 적용하거나 삭제할 수 있습니다. 예를 들어, `git stash apply stash@{1}` 명령어로 특정 인덱스의 stash만 적용할 수 있습니다. 또한, 필요 없는 stash는 `git stash drop stash@{n}` 명령어로 언제든지 삭제할 수 있습니다. 모든 stash를 한 번에 지우고 싶다면 `git stash clear`를 사용하면 됩니다. 이 명령어는 스택의 모든 stash를 깨끗하게 비워줍니다.

때로는 stash된 변경 사항을 새로운 브랜치로 가져와 작업을 이어가고 싶을 때도 있습니다. 이럴 때는 `git stash branch <새로운 브랜치 이름> [stash 인덱스]` 명령어를 사용합니다. 이 명령어는 특정 stash를 기반으로 새로운 브랜치를 생성하고, 해당 stash의 변경 사항을 적용한 뒤 스택에서 stash를 제거합니다. 이는 stash된 변경 사항을 임시 커밋으로 만들지 않고도 독립적인 작업 공간을 마련할 때 매우 유용합니다.

참고
`git stash show` 명령어를 사용하면 stash된 변경 사항을 자세히 확인할 수 있습니다. 기본적으로 최신 stash의 변경 내용을 보여주지만, `git stash show stash@{n}`과 같이 인덱스를 지정하여 특정 stash의 내용을 볼 수도 있습니다. `git stash show -p`를 사용하면 `diff` 형식으로 변경된 내용을 상세히 파악할 수 있어, 어떤 작업을 stash했는지 잊었을 때 유용합니다.
git stash 임시 저장 후 다른 브랜치 작업

Photo by Daniil Komov on Pexels

Git Stash 사용 시 꼭 알아야 할 주의사항

`git stash`는 매우 유용한 도구이지만, 몇 가지 주의할 점을 염두에 두어야 합니다. 이 점들을 잘 이해하고 사용해야 예상치 못한 문제에 부딪히지 않고 작업 흐름을 원활하게 유지할 수 있습니다.

첫째, `git stash`는 기본적으로 Git이 추적하는(tracked) 파일의 변경 사항만 저장합니다. 즉, 새로 생성했지만 `git add`로 스테이징 하지 않은 untracked 파일은 stash되지 않습니다. untracked 파일을 포함하여 모든 변경 사항을 stash하려면 `git stash -u` 또는 `git stash –include-untracked` 옵션을 사용해야 합니다. 또한, `.gitignore`에 의해 무시되는 파일(`ignored files`) 역시 기본적으로 stash되지 않으며, 이를 포함하려면 `git stash -a` 또는 `git stash –all` 옵션을 사용해야 합니다.

주의
stash를 적용(`apply` 또는 `pop`)할 때 현재 워킹 디렉토리에 stash와 충돌하는 변경 사항이 있다면 충돌이 발생할 수 있습니다. Git은 충돌이 발생했음을 알려주며, 이때는 일반적인 Git 충돌 해결 과정과 동일하게 수동으로 파일을 수정하고 `git add`, `git commit`을 통해 충돌을 해결해야 합니다. stash를 적용하기 전에 현재 브랜치의 상태를 깨끗하게 유지하는 것이 충돌을 피하는 가장 좋은 방법입니다.

둘째, `git stash`는 일시적인 저장 공간입니다. 장기적인 작업이나 중요한 변경 사항을 위해서는 정식 커밋을 사용하는 것이 바람직합니다. stash는 말 그대로 ‘임시’ 저장이기 때문에, 실수로 `git stash clear`를 실행하거나 레포지토리를 삭제할 경우 stash된 내용도 함께 사라질 수 있습니다. 중요한 내용은 반드시 커밋하여 Git 히스토리에 영구적으로 기록해야 합니다.

정리

`git stash`는 미완성된 작업을 안전하게 임시 저장하고, 유연하게 브랜치를 전환하거나 다른 작업을 수행할 수 있도록 돕는 필수적인 Git 명령어입니다. 기본 `stash`, `list`, `pop`부터 `apply`, `drop`, `branch` 등의 고급 기능까지 숙지한다면, 복잡한 개발 환경에서도 작업 흐름의 방해 없이 효율성을 크게 높일 수 있습니다.

지금 바로 적용해 보세요.

참고 자료

  • Git Stash 공식 문서 — Git Stash 명령어에 대한 가장 정확하고 상세한 정보를 제공합니다.

동영상으로 보는 git stash 임시 저장 후 다른 브랜치 작업

글로 충분하지 않다면 관련 영상을 함께 보세요. 클릭하면 YouTube에서 검색 결과로 이동합니다.

▶ YouTube에서 “git stash 임시 저장 후 다른 브랜치 작업” 영상 보기

자주 묻는 질문

Q. 커밋하지 않은 변경사항이 있을 때 `git stash`는 어떤 문제를 해결해주나요?

A. `git stash`는 현재 작업 중인 브랜치에서 아직 커밋하고 싶지 않은 변경사항이 있을 때 다른 브랜치로 전환해야 하는 문제를 해결해줍니다. 현재 작업 내용을 임시로 저장하여 작업 디렉토리를 깨끗하게 만들고, 커밋 없이 안전하게 브랜치를 전환할 수 있도록 돕습니다.

Q. `git stash`로 임시 저장한 변경사항은 어떻게 다시 불러올 수 있나요?

A. 임시 저장한 변경사항은 주로 `git stash pop` 또는 `git stash apply` 명령어를 통해 다시 불러올 수 있습니다. `pop`은 변경사항을 적용하고 stash 목록에서 해당 항목을 제거하며, `apply`는 변경사항을 적용하되 stash 목록에는 그대로 남겨둡니다.

Q. `git stash`를 사용하면 스테이징된 변경사항과 스테이징되지 않은 변경사항 모두 저장되나요?

A. 네, 기본적으로 `git stash`는 스테이징된(index에 추가된) 변경사항과 스테이징되지 않은(수정되었지만 index에 추가되지 않은) 변경사항을 모두 저장합니다. 이를 통해 작업 디렉토리를 현재 HEAD 커밋 상태로 완전히 깨끗하게 되돌려 놓습니다.

Q. `git stash`는 장기적인 변경사항 저장에도 적합한가요?

A. `git stash`는 주로 단기적인 작업 흐름 전환이나 긴급한 상황에서 임시 변경사항을 저장하는 데 최적화되어 있습니다. 장기적으로 보관해야 하거나 다른 사람과 공유해야 할 변경사항의 경우, 새로운 브랜치를 생성하거나 WIP(Work In Progress) 커밋을 하는 것이 더 권장됩니다.


댓글 남기기

Mebys Blog에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기