티스토리 뷰

git

git stash 적극 활용하기

완종쓰 2023. 1. 8. 21:05

안녕하세요. 오늘은 제가 git을 쓸 때 자주 사용하는 기능인 stash에 대해 정리해보는 시간을 가져보겠습니다.

git stash로 구글링을 해보았을 때, 오로지 기본 기능에 대한 설명이 있는 글만 찾게 되었던 경험이 있어서,
제가 자주 사용하는 이유와 사용법에 대해 정리하고 추가적인 부분을 소개해드려보면 좋을 것 같아 글을 쓰게 되었습니다.

stash??

먼저 stash는 구글 번역기로 번역을 해보았을 때, 숨기는 장소(명사), 몰래 챙겨두다(동사)로 찾아볼 수 있는데요,
말 그대로 저는 stash를 stash에 담아둔다, stash를 사용한다 라고 자주 말 하는 것 같네요.

origin의 내용을 tracking 하고 있는 상태이거나(modifed),
staged(staging area로 이동된 상태, git add) 된 상태에서 다른 브랜치로 이동해야할 경우,
commit을 하지 않고는 변경하려는 브랜치의 내용과 confict 되어 의도하지 않은 대로 동작하는 경우가 종종 발생하곤 합니다.

기본 명령어 - stash list / save / pop / apply / drop

% git stash save [{임시저장 행위에 대한 name}]
# name을 지정하지 않으면 해당 브랜치의 HEAD Commit 명으로 저장 된다.

% git stash list      
stash@{0}: On profile_jw: test2
stash@{1}: On profile_jw: test

# test 꺼내고 stash 삭제(apply & drop)
$ git stash pop 1 # index는 위에서 stash@{index}

# 제일 마지막에 넣은 stash 꺼내고 삭제
$ git stash pop

여기서 stash list의 인덱스를 가지고
apply / drop / pop 모두 수행할 수 있습니다.

위의 기본적인 기능은 기본 개념만 숙지하고 있다면 사용하는 git GUI 툴에서 더 쉽고, 안전하게 사용하실 수 있을 것입니다.
저는 소스트리와 인텔리제이 깃을 사용하기 때문에, 두 툴에서 적극적으로 활용하고 있습니다.

아래 이미지는 인텔리제이에서의 git stash 기능 사용 위치입니다.

IntelliJ - 상단 메뉴 - GIt - Uncommitted Changes - Stash / Unstash Changes

Stash를 적극 활용할 수 밖에 없는 내 상황

업무를 할 때 내용 분석, 분석에 따른 설계, 설계에 따른 개발 방향을 잡기 위해 로컬 환경에서 먼저 개발 방향의 틀을 잡아두곤 합니다.

다른 회사 환경에서는 어떨지 모르겠지만,
현재 제 업무 환경의 특성 중 하나로, 명확한 작업 근거(고객의 요구사항에 따른 이슈 관리 번호) 없이는 git에 commit, push가 자유롭지 못합니다.
또한, 1일, 1주일에 단 하나의 일만 할 순 없고, 모듈 여러 개를 맡고 있기 때문에 주 단위에 여러 작업을 동시에 진행할 때가 많습니다.

위와 같은 이유로 로컬의 변경사항을 반영하지 않고 여러 브랜치를 옮겨 다니며 작업을 하고 있습니다.
이럴 때, stash를 적극 활용하면 브랜치끼리의 conflict를 사전에 방지할 수 있어 좋습니다.
(물론 Unstash 시, stash 할 때와 브랜치 상황이 바뀌어 다른 작업 내용과 confict이 일어날 순 있습니다만 여기서는 commit을 안 하고 넘어 다녀야 할 경우에 강력한 기능이란 것을 강조하고 싶습니다.)

더 보기 - 특정 파일만 골라서 stash 적용하는 아래의 방법

이 섹션은 제가 사용한 git GUI 툴 : IntelliJ git, 소스트리에서는 지원하지 않는 기능입니다. 궁금하신 분들은 한번 사용해보시기 바랍니다.

만약, 한 로컬 브랜치에서 여러가지 이슈의 작업을 동시에 하고 있다가. 특정 이슈의 작업만 stash 에 넣고 싶다면 아래의 방법을 사용하면 됩니다.

patch를 통해 선택하기

git 버전 확인 후, 2.14.6 버전 기준으로 아래 두가지 명령어로 나뉩니다

# 버전 확인
git --version

# 명령어
git stash push --patch # since 2.14.6
git stash save --patch # for older git versions

git에서 stash에 넣을지 파일마다 물어보는데
일단 CLI 이다보니 선택하는 Ui가 친절하진 않은 것으로 느꼈고,

프로젝트 구조에 따라, 양에 따라 많이 느릴 수 있습니다.
(저는 실제 업무환경에서 해보고 너무 느려서 쓰지 못하겠더라고요..)

Staging Area - keep index를 이용한 Double Stash

git stash —keep-index

모든 변경사항을 Stash 에 생성
하지만 작업 디렉토리에는 Staged 된 애들은 남아 있기 때문에(-keep-index 옵션),

git stash push -m “Message”

다시 stash 하여,
staged 된 파일들만 “Message”라는 이름으로 stash를 생성할 수 있습니다.

git 버전업 이후 간단히 할 수 있는 방법

git 버전을 확인해 보시고 2.35.0 버전(2022/01/24) 이상의 버전이라면 아래 명령어로 쉽게 가능합니다.

# 명령어
git stash push -S (—staged) -m “Message”

이상 이번 2023년도에도 건강하게 이쁜 코딩하시길 바랍니다. 감사합니다.

Reference

https://git-scm.com/docs/git-stash

'git' 카테고리의 다른 글

[Github] Access token 만들어 적용하기(mac)  (0) 2021.06.30
댓글