Do.

Git - 작업하던 내용 브렌치 옮기기! Git Stash 본문

General Dev

Git - 작업하던 내용 브렌치 옮기기! Git Stash

Hey_Hen 2022. 4. 12. 00:35

소개

이제 막 현업에서 일을 하게 되었는데, Git-flow가 아직 습관이 안되어서, Feature 브랜치에 작성 할 내용을 실수로 Develope 브랜치에서 작성 해버렸습니다. 작성 내용이 생각보다 많아서, 이를 복사해놓고, 초기화 하고 브랜치를 또 새로 파서 거기에 붙여넣고 하자니 시간이 너무 오래걸릴 것 같더라구요.

그래서 찾아보니 Stash를 통해 간단히 해결할 수 있었습니다.

Stashes

우선 Stash는 은닉이라는 뜻입니다. 커밋하기 전 내용을 로컬 저장소에 잠깐 임시저장 할 수 있는 기능이죠.

커밋 전 내용을 왜 잠시 저장해 두어야 할까요?

예를 들어서 특정 기능을 개발하고 있는데, 해당 기능 동작이 아직 완성 되지 않았는데, 다른 기능을 작성해야 한다고 합니다. 이때 다른 브랜치로 이동하거나 해야 하는데, 그렇다고 커밋을 치자니 기능이 완성이 되지 않아 커밋 룰에 어긋납니다.

잠깐 저장을 할 필요가 있죠, 물론 수동으로 할 수 있습니다. 작성한 내용을 따로 빼 두고, 내용을 초기화 합니다.

하지만 만약, 그래야 하는 내용이 너무나 많다면? 또 그 과정에서 실수가 없을까요?

하지만 Git은 Stash라는 기능을 제공해서 편하게 이 고민을 해결해 줄 수 있습니다.

우선 작업하던 내용은 저장하고 나오세요. 그리고 커밋은 하지 않습니다.

git stash

그리고 terminal에 위와 같이 입력합니다.

그러면 아래 처럼 메시지가 출력되는데, 메시지가 아래처럼 출력이 되고 나면, Modified 이어야 할 작성 하던 파일이, 편집되기 전 상태로 돌아갑니다.

Saved working directory and index state WIP on master: 780e259 git init

이 때 작업물이 사라져서 당황할 수 있지만, 다행히 작업물은 사라지지 않고, 로컬 디렉토리 어딘가에 저장되어 있는 상태입니다.

어디 있을까요?

cd .git/refs/

위 디렉토리로 이동해 보면
stash 라는 파일이 있을 겁니다. stash 파일을 읽으보면

9001f55f2bacf55a47505ae4329cef5c9669e87f

commit id 처럼 해시 값이 하나 존재하고 있는 것을 볼 수 있습니다.

이 내용을 읽어보면

git cat-file -p 9001f55
tree c05ce9e072776b110d4c2b5c6e0a1bc80b899581
parent 780e259d5d9ae0c524095a2156f50efcc265abf9
parent 84396b3b0c28fe16cf6915d85b0ca5b1ddbd0e7f
author urijan44 <teamsva360@gmail.com> 1649688251 +0900
committer urijan44 <teamsva360@gmail.com> 1649688251 +0900

뭔가 내용이 많네요

tree 해시값을 다시 봐보면

git cat-file -p c05ce9e
100644 blob ab983e11d9f77aee6ffc1f1317fa7832dc0e1ee7    README.md

해당 커밋에서 작업 된 내용을 볼 수 있습니다.
여기서 해시값을 또 읽어보면 stash했을 때 내용을 볼 수가 있습니다.

stash한 기록은

git stash list

를 통해 읽어 볼 수 있는데요

stash@{0}: WIP on master: 780e259 git init

위와 같은 형태로 나타납니다.
여기서 stash@{0}은 stash의 이름을 나타낸다고 보면 됩니다. culry brace 안에 숫자는 stash의 index를 나타내는데, 새로 들어오는 stash는 가장 빠른 Index 즉 0이 됩니다. stack 형태로 저장이 되는 겁니다.

그런데, 위 내용만 보고서는 어떤 내용을 stash했는지 알기가 어렵죠. 해시값 하나하나 읽어가며 내용을 파악하는 것은 시간 낭비가 큽니다.
따라서 Commit 할때 메시지를 같이 입력하듯, stash도 메시지를 함께 입력할 수 있습니다.

git stash push -m "main.swift write"

위와 같이 입력하면 stash 할때 메시지를 같이 전달할 수 있고, stash list를 통해 보면

stash@{0}: On master: main.swift write
stash@{1}: WIP on master: 780e259 git init

message에 쓴 내용을 볼 수가 있습니다.

Stash Apply

이제 Stash한 내용을 가져와서 적용해봅시다.

앞서 제가 Feature Branch에 작업할 내용을 실수로 Develope 브랜치에다가 작업을 했다고 했죠?

Develope 브랜치에서 작업한 내용을 우선 Stash 했다면 Feature Branch로 Checkout 합니다.

git stash apply stash@{0}

그리고 apply 명령어와 stash 이름으로 현재 브랜치에 stash 내용을 적용할 수 있습니다.

이렇게 하면 현재 브랜치의 상태가 stash에 저장한 작업하던 내용을 그대로 불러올 수 있습니다.

 

이를 통해서 다른 브랜치 커밋을 어지럽히거나!, 수고스럽게 파일을 초기화 했다 붙여넣을 필요가 없어졌습니다

 

Stash Clear

stash를 apply를 통해 작업이 끝났으면, stash를 지워주는게 좋을 것입니다.

stash list를 통째로 날려버리는 명령어는 아래와 같습니다.

git stash clear

 

만약 특정 stash만 지우고 싶다면

git stash -q drop stash@{0}

0에다 stash를 인덱스만 갈아 끼워넣어주면, 특정 stash를 삭제할 수 있습니다.

 

Reference

raywenderlich: Advanced Git

https://hyuna-tech.tistory.com/entry/github-일종의-임시저장-git-stash-사용법

Comments