작업 중인 내용 저장하기

GitBeginner
지금 연습하기

소개

Git 탐험가 여러분, 다시 오신 것을 환영합니다! 오늘은 작업 진행 상황 관리에 유용한 Git 기능 중 하나인 stash 에 대해 알아보겠습니다. 기능을 개발하던 중 갑자기 다른 작업으로 전환해야 했던 경험이 있으신가요? Git stash 가 바로 이럴 때 유용합니다!

Git stash 는 아직 완료되지 않은 작업을 임시로 보관할 수 있는 마법의 서랍과 같습니다. 반쯤 완료된 작업을 커밋하지 않고도 빠르게 컨텍스트를 전환할 수 있게 해줍니다. 이는 다른 브랜치로 전환하거나, 업데이트를 가져오거나, 긴급한 버그 수정을 처리해야 할 때 매우 유용합니다.

이번 랩에서는 Git stash 를 사용하여 작업 진행 상황을 저장하는 방법, stash 된 변경 사항을 적용하는 방법, stash 에서 브랜치를 생성하는 방법, 여러 stash 를 관리하는 방법, 그리고 stash 를 정리하는 방법을 살펴보겠습니다. 이 랩을 마치면 Git 툴킷에 워크플로우를 더욱 원활하고 유연하게 만들어 줄 강력한 새로운 도구를 갖게 될 것입니다.

자, Git stash 의 강력한 기능을 함께 시작해 봅시다!

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 94%입니다.학습자들로부터 97%의 긍정적인 리뷰율을 받았습니다.

작업 공간 설정

Stashing 을 시작하기 전에, 실험할 작업 공간을 설정해 보겠습니다. 새로운 디렉토리를 생성하고, Git 저장소를 초기화한 다음, 초기 콘텐츠를 추가할 것입니다.

터미널을 열고 다음 명령을 입력하세요:

cd ~/project
mkdir git-stash-lab
cd git-stash-lab
git init
echo "## Git Stash Lab" > README.md
git add README.md
git commit -m "Initial commit"

이 명령들이 무엇을 하는지 자세히 살펴보겠습니다:

  1. cd ~/project: 현재 디렉토리를 홈 디렉토리의 "project" 폴더로 변경합니다.
  2. mkdir git-stash-lab: "git-stash-lab"이라는 새 디렉토리를 생성합니다.
  3. cd git-stash-lab: 새로 생성된 디렉토리로 이동합니다.
  4. git init: 현재 디렉토리에 새로운 Git 저장소를 초기화합니다.
  5. echo "## Git Stash Lab" > README.md: "## Git Stash Lab" 내용을 가진 "README.md"라는 새 파일을 생성합니다.
  6. git add README.md: 커밋을 위해 새 파일을 스테이징합니다.
  7. git commit -m "Initial commit": 스테이징된 변경 사항으로 첫 번째 커밋을 생성합니다.

훌륭합니다! 이제 하나의 커밋이 있는 저장소가 있습니다. 상태를 확인해 보겠습니다:

git status

작업 트리가 깨끗하다는 메시지가 표시되어야 합니다. 이는 Git stash 를 가지고 실험할 준비가 되었음을 의미합니다!

문제가 발생하면, 올바른 디렉토리에 있는지, 그리고 Git 이 시스템에 제대로 설치되었는지 확인하십시오. git --version을 실행하여 Git 설치를 확인할 수 있습니다.

변경 사항 Stash 하기

이제 작업 공간이 설정되었으니, 몇 가지 변경 사항을 만들고 이를 stash 하는 방법을 배워보겠습니다.

먼저, README.md 파일을 수정해 보겠습니다:

echo "This is a work in progress" >> README.md

이 명령은 README.md 파일에 새 줄을 추가합니다. 또한 새 파일도 생성해 보겠습니다:

echo "Some important notes" > notes.txt

이제 git status를 실행하면, 수정된 파일과 추적되지 않은 파일이 모두 있음을 확인할 수 있습니다:

git status

README.md 가 수정되었고 notes.txt 가 추적되지 않음으로 표시되는 출력을 보게 될 것입니다.

이 시점에서 다른 작업으로 빠르게 전환해야 하지만, 이러한 변경 사항을 커밋할 준비가 되지 않았다고 가정해 봅시다. 이럴 때 git stash가 유용합니다!

변경 사항을 stash 하려면 다음을 실행하십시오:

git stash

다음과 유사한 출력을 보게 될 것입니다:

Saved working directory and index state WIP on master: 1234567 Initial commit

이제 git status를 다시 실행하면 흥미로운 점을 볼 수 있습니다:

git status

README.md 가 더 이상 수정된 것으로 표시되지 않지만, notes.txt 는 여전히 추적되지 않은 파일로 나열되어 있습니다. 이는 git stash에 대한 중요한 점입니다:

중요: 기본적으로 git stash는 다음만 stash 합니다:

  1. 추적된 파일 (Git 이 이미 추적하고 있는 파일) 에 대한 변경 사항
  2. 스테이징된 변경 사항

추적되지 않은 파일 (예: notes.txt) 은 기본적으로 stash 에 포함되지 않습니다. 이 동작은 Git 이 저장소에 포함하고 싶지 않을 수 있는 새 파일을 실수로 숨기지 않도록 보장합니다.

추적되지 않은 파일을 stash 에 포함하려면 -u (또는 --include-untracked) 옵션을 사용할 수 있습니다:

git stash -u

이 명령을 실행하면 README.md 에 대한 변경 사항과 새 notes.txt 파일이 모두 stash 됩니다.

stash 에 무엇이 있는지 확인하려면 다음을 사용할 수 있습니다:

git stash list

-u 옵션을 사용했는지 여부에 따라 하나 또는 두 개의 stash 항목을 보게 될 것입니다.

stash 목록 보기를 종료하려면 q를 누르십시오.

기억하세요, stashing 은 빠른 컨텍스트 전환에 완벽합니다. 그러나 장기적인 워크플로우에서 커밋을 대체하는 것은 아닙니다. Stash 는 임시 저장소로 사용됩니다.

Stashed 변경 사항 적용

이제 저장된 변경 사항을 되돌리는 방법을 배워보겠습니다. 이를 위해 git stash applygit stash pop 두 가지 주요 명령어가 있습니다.

git stash apply부터 시작해 보겠습니다.

git stash apply

이 명령어를 실행한 후 예상치 못한 결과가 나타날 수 있습니다. 상태를 확인해 보겠습니다.

git status

다음과 유사한 출력이 나타날 것입니다.

master 브랜치에서
추적되지 않은 파일:
  (커밋할 항목에 포함하려면 "git add <파일>..."을 사용하십시오)
        notes.txt

추적되지 않은 파일이 있지만 커밋할 항목은 없습니다 (추적하려면 "git add"를 사용하십시오)

놀랍게도 notes.txt 만 추적되지 않은 파일로 표시되고 README.md 의 변경 사항은 표시되지 않습니다. 이러한 동작은 다음과 같은 이유 때문입니다.

  1. 2 단계에서 git stash-u 옵션 없이 사용하여 README.md 의 변경 사항만 저장했습니다.
  2. 그런 다음 git stash -u를 사용하여 추적되지 않은 notes.txt 파일을 저장했습니다 (README.md 는 이전 저장에서 이미 깨끗했습니다).
  3. 저장을 적용할 때 Git 은 가장 최근의 저장 ( -u 옵션으로 생성된 저장) 을 적용하는데, 이 저장에는 notes.txt 만 포함되어 있으므로 README.md 의 변경 사항이 표시되지 않습니다.

README.md 의 변경 사항을 포함하여 모든 변경 사항을 확인하려면 다음을 사용할 수 있습니다.

git stash apply stash@{1}

이제 다시 상태를 확인하면 README.md 의 변경 사항과 notes.txt 가 추적되지 않은 파일로 표시됩니다.

이 상황은 저장과 함께 작업할 때 저장을 생성하고 적용하는 순서가 결과에 영향을 줄 수 있다는 중요한 측면을 보여줍니다. 특히 여러 저장과 함께 작업할 때 저장 내용을 확인하는 것이 항상 좋은 방법입니다.

applypop의 차이점은 apply는 저장된 변경 사항을 유지하는 반면, pop은 적용 후 저장에서 변경 사항을 제거한다는 것입니다.

git stash clear
git stash -u
git stash list

먼저 모든 저장을 지우고 새로 시작한 다음 -u 옵션으로 추적되지 않은 파일을 포함하여 변경 사항을 저장합니다. 마지막으로 저장을 확인하기 위해 저장 목록을 표시합니다.

다시 변경 사항을 저장하고 pop을 시도해 보겠습니다.

git stash pop

이전과 유사한 출력이 나타나지만 이제 git stash list를 실행하면 저장이 비어 있는 것을 볼 수 있습니다.

applypop이 둘 다 필요한 이유는 무엇일까요? apply는 동일한 저장된 변경 사항을 여러 브랜치에 적용하려는 경우 유용합니다. pop은 동일한 브랜치에서 작업을 다시 시작할 때 더 일반적으로 사용됩니다.

Stash 에서 브랜치 생성

때로는 stash 한 변경 사항이 실제로 자체 브랜치에 있어야 한다는 것을 깨달을 수 있습니다. Git 은 git stash branch 명령을 사용하여 이를 쉽게 만들 수 있습니다.

먼저, 몇 가지 새로운 변경 사항을 만들고 stash 해 보겠습니다:

echo "Feature in progress" >> README.md
echo "More notes" >> notes.txt
git stash -u

이제 이러한 변경 사항으로 새 브랜치를 생성해 보겠습니다:

git stash branch feature-branch

이 명령은 "feature-branch"라는 새 브랜치를 생성하고, 이를 체크아웃한 다음, stash 된 변경 사항을 적용합니다. 그런 다음 stash 는 stash 목록에서 제거됩니다.

다음과 유사한 출력을 보게 될 것입니다:

Switched to a new branch 'feature-branch'
On branch feature-branch
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

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        notes.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (1234567890abcdef1234567890abcdef12345678)

이 기능은 실험적인 변경 사항을 stash 한 후 나중에 자체 브랜치에서 진행할 가치가 있다고 결정할 때 특히 유용합니다.

기억하세요, stash 에서 브랜치를 생성한 후, 변경 사항을 유지하려면 커밋해야 합니다:

git add README.md notes.txt
git commit -m "Start new feature"

master 브랜치로 다시 전환하려면 다음을 사용하십시오:

git checkout master

여러 Stash 관리

Git 를 사용하면서 여러 번의 변경 사항을 스테이지에 저장해야 할 수 있습니다. Git 는 여러 개의 스테이지를 쉽게 관리할 수 있도록 지원합니다. 여러 개의 스테이지를 생성, 목록화 및 관리하는 방법을 살펴보겠습니다.

먼저, 서로 다른 변경 사항을 가진 세 개의 스테이지를 생성해 보겠습니다.

## 첫 번째 스테이지
echo "변경 사항 1" >> README.md
git stash push -m "첫 번째 변경 사항"

## 추적되지 않은 파일이 포함된 두 번째 스테이지
echo "변경 사항 2" >> README.md
echo "참고 2" >> notes.txt
git stash push -u -m "두 번째 변경 사항"

## 세 번째 스테이지
echo "변경 사항 3" >> README.md
git stash push -m "세 번째 변경 사항"

참고: 이제 git stash push를 단순히 git stash 대신 사용하고 있습니다. push 서브 명령어는 특히 -m 플래그로 사용자 정의 메시지를 추가하려는 경우 최신의 권장 방법입니다. git stashgit stash -u는 여전히 작동하지만 (git stash pushgit stash push -u의 바로 가기임) git stash push를 명시적으로 사용하면 여러 스테이지를 관리할 때 더 많은 제어와 명확성을 제공합니다. 특히 설명적인 메시지가 있는 경우 더욱 그렇습니다.

우리가 한 작업을 자세히 살펴보겠습니다.

  1. README.md 에 대한 변경 사항으로 첫 번째 스테이지를 생성했습니다.
  2. README.md 에 대한 변경 사항과 새로운 추적되지 않은 파일을 모두 포함하는 두 번째 스테이지를 생성했습니다.
  3. README.md 에 대한 또 다른 변경 사항으로 세 번째 스테이지를 생성했습니다.
  4. 설명적인 메시지를 추가하기 위해 -m 플래그를 사용했습니다.
  5. 추적되지 않은 파일을 포함하기 위해 두 번째 스테이지에 -u 플래그를 사용했습니다.

이제 스테이지 목록을 표시해 보겠습니다.

git stash list

다음과 유사한 출력이 표시되어야 합니다.

stash@{0}: master 브랜치에서: 세 번째 변경 사항
stash@{1}: master 브랜치에서: 두 번째 변경 사항
stash@{2}: master 브랜치에서: 첫 번째 변경 사항

스테이지의 내용을 적용하지 않고 검토할 수 있습니다.

git stash show stash@{1}

자세한 내용을 보려면 전체 diff 를 보려면 -p 플래그를 추가합니다.

git stash show -p stash@{1}

더 많은 변경 사항을 관리하는 연습을 위해 두 개의 스테이지를 더 생성해 보겠습니다.

## 네 번째 스테이지
echo "변경 사항 4" >> README.md
git stash push -m "네 번째 변경 사항"

## 다섯 번째 스테이지
echo "변경 사항 5" >> README.md
git stash push -m "다섯 번째 변경 사항"

스테이지 목록을 다시 확인합니다.

git stash list

이제 목록에 다섯 개의 스테이지가 표시되어야 합니다.

stash@{0}: master 브랜치에서: 다섯 번째 변경 사항
stash@{1}: master 브랜치에서: 네 번째 변경 사항
stash@{2}: master 브랜치에서: 세 번째 변경 사항
stash@{3}: master 브랜치에서: 두 번째 변경 사항
stash@{4}: master 브랜치에서: 첫 번째 변경 사항

여러 작업을 동시에 처리할 때 여러 개의 스테이지를 관리하는 것이 유용할 수 있습니다. 그러나 너무 많은 스테이지를 축적하면 혼란스러워질 수 있으므로 주의하십시오. 장기적인 작업에는 브랜치를 사용하는 것이 좋습니다.

참고: 스테이지는 일시적인 것입니다. 스테이지를 오랫동안 유지해야 한다면 기능 브랜치를 사용하거나 변경 사항을 커밋하는 것을 고려하십시오.

Stash 정리

워크플로우에서 stash 를 사용하면서 더 이상 필요하지 않은 stash 가 누적될 수 있습니다. 정리 정돈을 위해 stash 를 정기적으로 정리하는 것이 좋습니다.

단일 stash 를 제거하려면 앞서 살펴본 drop 명령을 사용할 수 있습니다:

git stash drop stash@{2}

이렇게 하면 목록에서 세 번째 stash("Third change" 포함) 가 제거됩니다.

모든 stash 를 한 번에 제거하려면 다음을 사용할 수 있습니다:

git stash clear

이 명령을 사용할 때는 매우 주의하십시오! 모든 stash 를 제거하며 실행 취소할 수 없습니다.

또 다른 유용한 명령은 앞서 살펴본 git stash pop입니다. 이 명령은 가장 최근의 stash 를 적용한 다음 stash 목록에서 제거합니다:

git stash pop

기억하세요, 일반적으로 stash 목록을 짧게 유지하는 것이 좋습니다. Stash 는 진행 중인 작업의 임시 저장용으로 사용됩니다. 많은 stash 가 누적되는 경우, 변경 사항을 더 자주 커밋하거나 장기적인 작업을 위해 기능 브랜치를 생성해야 한다는 신호일 수 있습니다.

요약

축하합니다, Git stash 마스터! Git 툴킷에 강력한 새 도구를 추가했습니다. 지금까지 다룬 주요 개념을 요약해 보겠습니다:

  1. 변경 사항 Stashing (Stashing Changes): git stash를 사용하여 진행 중인 작업을 임시로 저장하는 방법을 배웠습니다.
  2. Stashed 변경 사항 적용 (Applying Stashed Changes): git stash applygit stash pop을 사용하여 stash 된 변경 사항을 다시 가져오는 방법을 배웠습니다.
  3. Stash 에서 브랜치 생성 (Creating Branches from Stashes): git stash branch를 사용하여 stash 된 변경 사항 집합을 새 브랜치로 만드는 방법을 살펴보았습니다.
  4. 여러 Stash 관리 (Managing Multiple Stashes): 필요에 따라 특정 stash 를 적용하고 표시하면서 여러 stash 로 작업하는 방법을 배웠습니다.
  5. Stash 정리 (Cleaning Up Stashes): 개별 stash 를 제거하고 모든 stash 를 정리하는 방법을 배우면서 stash 위생을 실천했습니다.

Git stash 는 아직 완료되지 않은 작업을 커밋하지 않고도 컨텍스트를 빠르게 전환할 수 있게 해주는 매우 유용한 기능입니다. 작업을 빠르게 전환하거나 브랜치를 전환해야 할 때 완벽합니다.

기억하세요, stash 는 유용하지만 임시로 사용하기 위한 것입니다. 장기적인 작업의 경우, 변경 사항을 커밋하거나 새 브랜치를 생성하는 것이 일반적으로 더 좋습니다. stash 를 현명하게 사용하면 워크플로우를 원활하고 유연하게 유지하는 데 도움이 됩니다.