HOWTO · Git

Git Stash 실행 취소

이 기사에서는 리포지토리를 변경하고 저장하는 방법을 알아봅니다. Git을 사용하면 변경 사항을 로컬에 저장하고 필요할 때 서버에 푸시할 수 있습니다.

이 페이지의 내용

Git stash는 커밋하지 않은 변경 사항을 저장해 작업 트리를 깨끗한 상태로 되돌릴 수 있게 합니다. 저장한 작업을 복원하려면 최신 stash를 적용하고 적용에 성공하면 해당 항목을 제거하는 git stash pop와, 항목을 남겨 둔 채 적용하는 git stash apply 중에서 선택하세요. 복원된 파일을 확인한 뒤에만 stash를 제거하고 싶다면 먼저 적용하고 나중에 제거하세요. 아래 예제에서 stash@{n}는 stash 목록의 특정 항목을 가리킵니다.

원하는 작업에 맞는 명령 선택하기

저장된 항목을 보려면 git stash list를 실행하세요. 보통 최신 항목은 stash@{0}이고, 그다음은 stash@{1}이며 이후 항목도 같은 방식으로 이어집니다. 항목을 선택하기 전에 설명을 읽어 보세요. 번호는 현재 목록에서의 위치이므로 항목을 추가하거나 제거하면 달라질 수 있습니다.

  • 최신 항목을 복원하고 적용에 성공하면 제거: git stash pop.
  • 항목을 복원하되 계속 보관: git stash apply.
  • 적용하지 않고 항목 제거: git stash drop.

stash에는 브랜치의 새 커밋이 아니라 저장된 작업 변경 사항이 들어 있습니다. 기본적으로 stash를 적용하면 변경 사항이 작업 트리에 복원되지만 원래 스테이징 상태까지 복원되지는 않습니다. 인덱스도 함께 복원해 보려면 git stash apply --index를 사용하세요. 실행한 뒤 git status로 무엇이 복원되었는지 확인하세요. 저장된 상태가 다시 필요할지 확실하지 않다면 먼저 apply를 사용하세요. 결과를 검토한 뒤 항목을 제거해도 됩니다.

다음 예제를 실행하세요. 코드의 예시 이름, 커밋 메시지, stash 설명, 파일 내용 같은 문자열은 바이트 일치를 위해 영어 그대로입니다. 예제는 stash에 저장한 파일 내용을 복원하고, 그 내용을 출력합니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import subprocess
import tempfile
from pathlib import Path

with tempfile.TemporaryDirectory() as temp_dir:
    repo = Path(temp_dir)

    def git(*args):
        subprocess.run(
            ["git", *args], cwd=repo, check=True,
            stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
        )

    git("init", "-q")
    git("config", "user.name", "Example User")
    git("config", "user.email", "example@example.com")
    note = repo / "note.txt"
    note.write_text("original\n", encoding="utf-8")
    git("add", "note.txt")
    git("commit", "-q", "-m", "Add note")
    note.write_text("restored change\n", encoding="utf-8")
    git("stash", "push", "-m", "demo", "-q")
    git("stash", "pop", "-q")
    print(note.read_text(encoding="utf-8").strip())

예상 출력:

restored change

최신 stash를 복원하고 제거하기: git stash pop

최신 저장 변경 사항을 복원하면서 stash 항목도 제거하려면 git stash pop를 실행하세요. Git은 목록 맨 위의 항목을 적용하며, 보통 stash@{0}이 이에 해당합니다. 적용에 성공하면 Git이 해당 항목을 제거합니다. 복원된 파일은 작업 트리에 남으므로 stash 항목을 제거해도 이미 적용된 변경 사항이 버려지지는 않습니다.

pop을 사용하기 전에 현재 작업 트리가 저장된 변경 사항을 받을 준비가 되었는지 확인하세요. 실행한 뒤에는 git status를 살펴보고 영향을 받은 파일도 검토하세요. 변경 사항이 예상대로 나타나지 않으면 git stash list로 해당 항목이 남아 있는지 확인하세요. 변경 사항을 깔끔하게 적용하지 못한 stash는 대체로 목록에 남으므로 저장된 복사본을 잃지 않고 충돌을 해결한 뒤 다시 시도할 수 있습니다.

stash를 적용하고 항목은 유지하기: git stash apply

변경 사항을 복원하면서 저장된 항목도 계속 보관하려면 git stash apply를 사용하세요. 최신 항목을 적용하려면 git stash apply를 실행합니다. 이전 항목을 선택하려면 선택자를 덧붙이세요. 예를 들면 git stash apply stash@{2}와 같습니다. 결과를 비교하거나 나중에 다른 작업 트리에서 같은 저장 작업을 복원해야 할 수도 있을 때 유용합니다.

적용한 뒤에는 git status를 확인하고 추가 변경을 하기 전에 파일을 검토하세요. 결과가 깔끔하든 충돌 해결이 필요하든 stash를 적용해도 해당 항목은 제거되지 않습니다. 복원된 작업이 온전하고 저장된 항목이 더는 필요하지 않음을 확인한 다음, 아래 설명처럼 git stash drop로 제거하세요.

복원 후 stash 항목 제거하기: git stash drop

git stash drop는 항목을 적용하지 않고 stash 목록에서 제거합니다. 저장된 복사본을 버리려는 경우에만 사용하세요. 선택자를 지정하지 않으면 최신 항목이 제거됩니다. 특정 항목을 지정하려면 git stash drop stash@{2}처럼 선택자를 제공하세요.

복원한 뒤 신중하게 제거하려면 먼저 원하는 선택자와 함께 git stash apply를 실행하고, 파일을 검토한 다음 git status를 확인하세요. 변경 사항이 복원되었고 stash 복사본이 더는 필요하지 않다면 같은 선택자로 git stash drop를 실행하세요. 제거 직전에 git stash list를 확인하세요. 앞쪽 항목을 제거하면 나머지 항목의 번호가 바뀔 수 있습니다. 대신 git stash pop를 실행하면 적용에 성공했을 때 Git이 적용과 제거를 함께 처리합니다.

stash 항목 선택 및 충돌 처리

git stash list로 항목을 확인한 다음 원하는 stash@{n}를 선택하세요. 적용하기 전에 저장된 패치를 확인하려면 git stash show -p stash@{2}를 사용할 수 있습니다. 여기서 2는 목록에 표시된 항목 번호로 바꾸세요. 항목 설명과 패치는 비슷한 stash를 구별하는 데 도움이 되지만, 작업하기 전에 선택자가 현재 목록과 일치하는지 반드시 확인하세요.

stash를 현재 브랜치의 변경 사항과 함께 적용할 때 충돌이 발생할 수 있습니다. 이 경우 Git은 영향을 받은 파일을 알려 주고 해결해야 할 충돌 표시를 남깁니다. 표시된 파일을 열어 의도한 변경 사항을 선택하고 조합한 다음 충돌 표시를 제거하세요. 이어서 git status와 결과 diff를 확인하세요. 복원이 끝났다고 판단하기 전에 프로젝트에서 평소 사용하는 검사를 수행하세요. 충돌이 발생했을 때 pop이 항목을 제거했다고 가정하지 마세요. Git은 변경 사항을 깔끔하게 적용하지 못하면 stash를 유지합니다. 작업 트리의 충돌을 해결하고 결과를 확인한 뒤 git stash list를 확인하세요. 남은 항목은 더는 필요하지 않을 때만 제거하세요.