본문 바로가기
Git

[Git 깃] git stash

by 까망 하르방 2021. 3. 13.
반응형

git stash 명령 모음

작업 내용 stash에 저장

git stash

 

stash 목록 확인

git stash list

 

추적되지 않는 파일 포함해서 stash에 저장

git stash -u

 

특정 명칭을 지정해서 저장

git stash svae {명칭}

 

가장 최근에 저장한 stash 적용

git stash apply

 

staged 상태까지 적용(복원)

git stash apply --index

 

특정 Stash 선택해서 적용

git stash apply {Stash ID}

 

가장 최근 stash 제거하기

git stash drop

 

특정 stash 제거

git stash drop {stash ID}

 

apply + drop을 한번에 하는 수행하는 명령어 pop

git stash pop

 

모든 stash 목록 삭제

git stash clear

 

Stash 적용한 Branch 만들기

git stash branch {New Branch Name}

 

기능

▶ 작업 하고 있던 변경내역을 임시로 저장할 수 있는 명령어

- 옵션에 따라 다르지만 기본적으로 commit 되기 이전 변경 내역을 stash 영역에 보관한다.

    ※ commit 되기 이전 = Staging Area 영역(After git add) + Working Directory (Before git add)

    ※ commit 과는 또다른 의미의 (임시) 저장

 

- 파일을 최초 생성하고 git add 하지 않은(아직 git 에서 추적되지 않는) 내용은 stash 영역에 저장되지 않는다.

    ※ "-u" 옵션을 통해서 추적되지 않는 변경내용도 저장 가능

        (git add 처리해서 추적하고 git stash 할 수도 있을 것이다. )

 

- Stash 저장한 내역은 Branch 구분없이 Push / Pop 할 수 있다.

    내용에 따라서는 충돌(Conflict)이 발생할 수 있다.

 

- Stack 구조이기에 가장 먼저 저장된 Stash가 가장 나중에 삭제된다. (LIFO (Last In First Out))

    ※ 특정 Stash를 지정해서 처리 가능하다.

 

상황 예시

특정 Branch A 에서 작업을 하다가 잠깐 다른 Branch B로 이동하여 작업할 때,

현재 변경내용을 commit 하기 애매한 경우가 있다.

아직 완료하지 않은 작업을 commit 하는 것은 유쾌하지 않다.

ex) 현재 Branch에서 작업을 했지만 다른 Branch에 적용하고 싶은 경우

      (무심코 다른 Branch에서 작업하던 것을 알아차린 경우)

ex) 특정 기능 구현 중이고, 아직 commit을 하기에는 애매한 단계라고 했을 때,

    다른 Branch에서 발생한 버그를 고쳐야 하는 경우

ex) 동료가 최신 상태 코드가 이상하다고 요청하는 경우

 

작업 내용을 저장하기 전에 다른 Branch로 이동하지 못하는 상황

 

이때, 현재까지의 변경 내용을 임시 저장하고, 다른 Branch에서 작업 후 돌아와서

다시 꺼내서 사용하는 용도로 주로 이용된다.

 

시뮬레이션

작업 내용 stash에 저장

git stash

기본 명칭은 "WIP"로 저장된다.

(A) Modify → Add → Commit → Push    = Remote Repository

(B) Modify → Add → Commit               = Local Repository

(C) Modify → Add                              = Staging Area (Index)

(D) Modify                                        = Working Directory

 

git stash 처리한 후에는

 

아래와 같이 commit 이전까지의 내역들은 stash에 보관되어 사라진다.

남아있는 내용

(A) Modify → Add → Commit → Push    = Remote Repository

(B) Modify → Add → Commit                 = Local Repository

 

stash 목록 확인

git stash list

▶ 명시적으로 삭제하지 않으면 목록에 계속 남아 있다.

 

추적되지 않는 파일 포함해서 stash에 저장

git stash -u

ex) 최초 파일 생성 후 아직 git add 하지 않은 내용

 

특정 명칭을 지정해서 저장

git stash svae {명칭}

 

가장 최근에 저장한 stash 적용

git stash apply

▶ 목록에는 사라져 있지 않으면 목록까지 관리하기 위해서는 "drop"이나 "pop" 필요

 기존에 add 했던 내용도 복원(적용)시에는 git add 하지 않은 상태로 복원된다.

    staged 처리 상태까지 복원하려면 --indexed 옵션 사용

▶ 충돌이 발생하는 경우에는 해당 파일에서 알려준다.

 

staged 상태까지 적용(복원)

git stash apply --index

▶ git add 처리한 상태까지 반영되어 적용된다.

 

특정 Stash 선택해서 적용

git stash apply {Stash ID}

▶ {Stash ID}는 git stash list에서 보여지는 첫번째 단어

    ex) stash@{0}

 

가장 최근 stash 제거하기

git stash drop

▶최근에 stash 등록될 수록 낮은 인덱스 숫자에 위치한다.

    Stack 구조이기에 LIFO(Last In First Out) 처리로 최근에 stash 등록된 stash@{0} 이 삭제된다.

    (인덱스는 자동적으로 감소되는 것을 확인할 수 있다.)

▶ apply 옵션은 stash를 적용하는 것이기에 해당 stash는 스택에 여전히 남아있다. 

    스택에 남아 있는 stash를 삭제하려면 drop을 사용할 수 있다.

 

특정 stash 제거

git stash drop {stash ID}

{stash ID} 은 list 명령어로 보이는 첫번째 단어

    ex) stash@{0} 

 

apply + drop을 한번에 하는 수행하는 명령어 pop

git stash pop

최신 stash를 적용하면서 목록에서 제거해주는 수행을 해준다.

 

stash를 적용하면서 충돌이 발생한 경우에는 목록에서 제거되지 않고 남아 있다.

이때는 충돌된 내용을 해결하고, 목록에서는 drop 처리해주면 된다.

 

모든 stash 목록 삭제

git stash clear

 

Stash 적용한 Branch 만들기

git stash branch {New Branch Name}

▶ Stash 목록에 저장된 내역이 있어야 한다.

▶ Stash 할 당시의 커밋을 Checkout 한 후 새로운 브랜치를 만들고 여기에 적용합니다. 

    이 모든 것이 성공하면 Stash를 삭제합니다.

    (새로운 Branch 생성 및 checkout → stash 적용 및 목록 삭제)

 

Rerference

Git 목록 

[Git] [CMD] git clean

[Git] [CMD] git branch

[Git] [CMD] git status

[Git] [CMD] git add

[Git] [CMD] git checkout

 

 

반응형

'Git' 카테고리의 다른 글

[Git 깃] git add  (0) 2021.03.13
[Git 깃] git status  (0) 2021.03.13
[Git 깃] git push  (0) 2021.03.13
[Git 깃] git log  (0) 2021.03.13
[Git 깃] git init  (0) 2021.03.13

댓글