[GIT] 스태시

2022. 8. 8. 22:37GIT

작업 브랜치를 변경하려면 워킹 디렉토리는 깨끗한 상태로 정리되어 있어야한다.

워킹 디렉토리에 작업 중인 내용이나 커밋되지 않은 변경 사항들이 있으면 브랜치를 변경할 수 없다.

현재 작업 중인 코드 수정이 끝나지 않은 채로 다른 브랜치에 있는 코드를 수정하려고 한다면 스테시 기능을 사용해야 한다.

 

스테시 기능

깃은 완료되지 않은 작업이 남아 있을 때 현재 작업을 임시로 저장할 수 있는 기능이다.

스태시는 현재 워킹 디렉토리 내역을 별도의 스택 영역에 잠시 보관하는 명령이다.

 

스태시 명령을 실행하면 현재 작업 중인 내용은 임시 저장되고 수정 전 마지막 커밋 상태로 돌아간다.

이전 커밋 후 작업하지 않은 생태의 워킹 디렉토리가 된다.

스테시는 로컬 저장소에서만 사용 가능하다.

 

기존 작업 도중에 새로운 변경 요청

현재 작업을 멈추고 다른 작업을 하려면 새로운 브랜치가 필요하다.

matser 브랜치에서 feature 브랜치를 만들고 feature 브랜치에서 작업 도중 커밋하지 않은 채로 master 브랜치로 체크아웃 시도했다.

커밋을 하거나 스태시하라고 메시지가 출력됩니다.

워킹 디렉토리가 클린한 상태가 아니라 브랜치 이동이 불가능하다.

체크아웃을 하려면 워킹 디렉토리와 스테이지를 정리해야 한다.

하지만 작업이 완료되지 않은 상태이기 때문에 커밋을 할 수 없는 상황일 때 스태시를 활용하면 좋다.

 

스테시 임시 스택 영역에 작업 중인 코드 저장

스태시 명령어는 수정 중인 내역을 커밋하지 않고 브랜치를 이동할 수 있게 워킹 디렉토리를 깨끗이 청소한다.

스태시는 영구적인 커밋 기록 대신 현재 작업들을 임시 스택 영역에 저장한다.

$ git stash

save 명령어를 추가하여 사용하면 스태시 여러 개를 생성할 때 유용하다.

$ git stash save

스태시는 스택 구조로 여러 번 실행하여 저장할 수 있다.

스태시가 여러 개일 때 각각 구별할 수 있도록 메시지도 추가할 수 있다.

$ git stash save "WIP: 메시지 내용"

 

※ WIP

working in process 약어로 직행 중인 작업 의미다.

 

브랜치에서 스태시 명령을 실행하면 작업 중인 내역들이 스택에 저장된다. 

커밋되지 않은 파일이 있지만 stash로 워킹 디렉토리를 정리했다.

워킹 디렉토리에서 작업 중인 임시 파일이 사라져 워킹 디렉토리가 깨끗이 정리되었다.

master 브랜치로 이동하여 다른 작업을 수행할 수 있다.

 

※ 스태시 기능을 사용하지 않는다면

작업 중인 내용을 강제로 커밋하고 다시 리셋해서 복원해야 하는 작업이 필요하다.

복잡하기 때문에 스태시 기능을 사용하는 것이 낫다.

$ git commit -am "임시 커밋"

다른 브랜치에서 작업

$ git reset -soft HEAD^  // 리셋 복원

 

스태시 작업 할 때 스테이지 영역의 파일들을 제외할 수도 있다.

--keep-index 옵션을 사용하면 스테이지 영역의 파일들을 제외하고 스태시를 만든다.

또 스태시는 등록된 파일들만 스태시로 생성한다.

등록되지 않은 untracked 상태의 파일을 스태시로 생성하고 싶다면 --include-untracked 옵션을 사용하면 된다.

 

임시 저장 영역의 스택 목록

스태시의 저장 영역은 스택 구조이다.

깃은 스태시된 객체들을 .git/refs/stash에 저장한다.

스태시에 저장된 스택은 list 옵션을 사용하여 확인할 수 있다.

스태시 목록 확인

스태시 이름은 stash@{번호} 형태로 순차적으로 부여된다.

스태시를 실행한 후 전의 스태시와 현재 워킹 디렉토리 간 차이를 확인해보면

$ git stash show

스태시와 워킹 디렉토리 간 차이 확인

현재 워킹 디렉토리 내용과 스태시된 내용 간 파일 변화를 출력한다.

-p 옵션을 추가하면 상세한 차이점을 알 수 있다.

스태시와 현재 워킹 디렉토리 간 상세한 차이 출력

 

임시 저장한 스태시 불러오기

임시 저장된 내용은 다른 수정 작업을 완료한 후에 다시 불러와 사용할 수 있다.

제일 마지막에 저장된 내요을 읽어 온다.

$ git stash pop

임시 저장된 작업 내용을 읽어왔다.

스태시는 스택에서 내용을 읽어 올 때 현재 브랜치의 워킹 디렉토리와 자동으로 병합한다.

자동 병합이 성공하면 읽어 온 내용을 스택에서 제거한다.

스태시 빈 상태

스태시 pop을 해서 저장된 객체가 없다.

 

※ 스태시와 스테이지 영역

스태시는 스택에 저장할 때 워킹 디렉토리와 스테이지 영역의 파일까지 모두 보관한다.

스태시로 복원할 때는 워킹 디렉토리만 되돌린다.

스테이지에 등록된 스테이지 상태까지 복구하려면 --index 옵션을 사용해야 한다.

$ git stash apply --index

 

스태시 복원으로 충돌

스태시를 복원할 때 워킹 디렉토리 상태는 깨끗해야 한다.

스택에 저장된 스태시 내용이 다시 워킹 디렉토리로 복구 될 때 수정된 작업 내용과 현재 워킹 디렉토리를 병합하기 때문이다. 복구되는 브랜치의 워킹 디렉토리가 깨끗하지 않다면 병합 과정에서 충돌이 발생할 가능성이 많다.

스태시를 복원할 때 같은 파일에서 동일한 부분을 수정했으면 즉시 충돌이 발생한다.

복원하는 도중 충돌이 생기면 스태시는 스택에 저장된 내용을 자동으로 삭제하지 않는다.

직접 충돌을 해결하고 스태시 목록을 수동으로 삭제해야 한다.

스태시 충돌이 예상되면 스태시용 브랜치를 하나 생성해서 작업하는 것을 더 좋다.

 

스태시 스택에 저장된 내용으로 새로운 브랜치를 동시에 생성할 수 있다.

$ git stash branch 브랜치이름

스태시에 저장된 내용이 새로운 브랜치에 있다.

 

※ 스태시는 로컬 저장소에서 브랜치 간 저장과 스태시를 복원할 때 충돌이 발생하는 상황 외에 원격 저장소와 연결하여 작업할 때 충돌이 발생하는 상황에도 사용할 수 있다. 예를 들어 원격 저장소에서 풀 작업을 하면 로컬 저장소는 갱신된다. 이 때 스태시를 복구하면 원격 저장소 내용과 스태시 작업 내용이 충돌할 수 있다.

 

스태시 복사

스태시는 브랜치 작업들을 임시로 저장할 때 사용한다.

임시 저장된 작업을 스태시 명령 이전의 브랜치 상태로 되돌려 놓는다.

스태시를 사용한 저장과 복원은 서로 다른 브랜치에도 가능하다.

스태시 스택에 저장된 항목들은 어느 브랜치에서나 복원이 가능하다.

apply 옵션은 스택에 저장된 항목을 불러와 현재 브랜치로 복원한다.

$ git stash apply

 

스태시 복원에는 pop과 apply 명령어가 있는데

pop 명령어는 스택 내용을 복원하고 나서 스택 목록에서 제거한다.

apply 명령어는 스택 목록을 복원하고 스택 목록을 제거하지 않는다.

apply 명령어는 pop 명령어와 달리 스택 목록을 지정하여 적용할 수 있다.

$ git stash apply stash@{번호}

 

스태시 삭제

스태시는 pop으로 복원할 때 한 번 호출하면 자동으로 스택에서 삭제된다.

충돌이 발생하거나 apply 명령어로 워킹 디렉토리를 복구할 때는 스택에서 자동으로 삭제되지 않는다.

스태시 목록을 삭제하는 명령어가 있다.

$ git stash drop

스태시 목록을 삭제한다.

스태시 목록이 삭제되었다.

 

소스트리에서 스태시 사용

소스트리에서 코드 파일을 수정한 후 커밋하지 않은 내용이 있다면 자동으로 스태시 버튼이 활성화된다.

스태시 버튼을 클릭하면 스태시 메시지를 입력할 수 있다.

메시지까지 입력하면 스태시가 저장된다.

스태시 탭에 보면 스태시를 볼 수 있다.

스태시 목록

 

728x90

'GIT' 카테고리의 다른 글

[GIT] 병합  (0) 2022.08.10
[GIT] 워킹 디렉토리 청소  (0) 2022.08.08
[GIT] 브랜치 삭제  (0) 2022.08.05
[GIT] 브랜치 전송  (0) 2022.08.05
[GIT] 원격 브랜치  (0) 2022.08.05