들어가기 전에
git commit --allow-empty-message -m ""
( 다른 브랜치 이동 )
( 기존 브랜치 복귀 )
git reset HEAD^
Stash란 안전한 곳에 넣어 둔다는 의미를 지닌다. Git에서 작업을 하다 보면 피치 못하게 브랜치를 이동해야 하는 상황이 생긴다. 하지만 이동할 때마다 commit하고 용무가 끝난 뒤 다시 돌아와서 reset을 하는 것은 과정도 복잡할뿐더러 불편하다. 이러한 경우에 필요한 명령어가 stash이다. 작업 중이던 수정 내용들을 잠시 안전한 곳에 넣어두었다가 필요할 때 다시 꺼내어 사용할 수 있다.
Stash 스택에 저장하기
저장 명령어
git stash
git stash save
-
위의 복잡한 과정을 한 번에 해결해 주는 명령어이다. 작업 영역의 변경 사항들을 stash 스택에 저장하고 작업 영역을 깨끗이 정리한다.
-
명령어 실행 전
-
명령어 실행
-
명령어 실행 후
Stash 메시지 남기기
git stash save <"stash 메시지">
-
Stash 명령어를 실행할 때, 마치 commit 메시지와 같이 메시지를 작성할 수 있다. 이 명령어는 주로 각 stash를 구분하기 위해서 작성한다.
-
명령어 실행 전
-
명령어 실행
-
명령어 실행 후
특정 파일들을 선별하여 stash 실행하기
git stash -k
git stash --keep-index
-
Stage 영역의 파일들을 제외하고 stash를 생성하는 명령어이다.
-
명령어 실행 전
-
명령어 실행
-
명령어 실행 후
git stash -u
git stash --include-untracked
-
Stash 명령어는 기본적으로 추적 중인 파일들(Tracked status)만 stash를 생성한다. 그러나 이 옵션을 사용하면 추적 중이지 않은 파일들(Untracked status) 또한 함께 stash를 생성한다.
-
명령어 실행 전
-
명령어 실행
-
명령어 실행 후
Stash 스택 확인하기
Stash 목록 확인하기
git stash list
- Stash 스택에 존재하는 stash의 목록을 보여주는 명령어이다.
- 각 stash의 이름은 “stash@{목록 번호}” 형태로 순서대로 부여된다. 목록 번호는 가장 최근에 저장된 stash인 Top 요소 stash부터 0으로 시작한다.
- Stash 메시지를 따로 작성하지 않았을 경우 HEAD가 가리키고 있는 commit 메시지를 출력한다.
작업 영역과 stash 사이의 차이점 비교 명령어
git stash show
- Stash 스택의 Top 요소 stash와 작업 영역을 비교하여 변경된 파일들의 상태를 간략하게 보여주는 명령어이다.
git stash show -p stash@{<목록 번호>}
git stash show --patch stash@{<목록 번호>}
- 파일 및 commit 사이의 차이점을 비교하는 diff 명령어와 같이 지정한 stash와 작업 영역을 비교한 차이를 자세하게 보여주는 명령어이다.
Stash 스택에서 작업 꺼내기
저장된 작업 꺼내기
git stash pop
-
Top 요소 stash만 작업 영역으로 꺼내면서 stash 스택에서 삭제한다. Stash를 스택으로부터 꺼내올 때 현재 작업 영역에 이미 다른 변경 사항이 존재할 수 있기 때문에 자동으로 병합을 실행한다.
-
명령어 실행 전
-
명령어 실행
-
명령어 실행 후
git stash pop --index
-
기본적으로 stash를 꺼내올 때 작업 변경 사항만 꺼내온다. 그러나 이 옵션을 사용할 경우 당시 스테이지 상태까지 그대로 꺼내올 수 있다.
-
명령어 실행 전
-
명령어 실행
-
명령어 실행 후
새로운 브랜치 생성하면서 저장된 작업 꺼내기
앞에서 얘기했듯이 현재 작업 영역에 stash를 꺼낼 때 다른 변경 사항이 이미 존재할 수 있고 이에 따라 자동으로 병합 중 conflict가 발생할 수 있는데 이런 경우 stash는 스택의 내용을 아직 삭제하지 않으며 수동으로 병합을 진행하거나 abort 하여 병합을 취소할 수 있다. 하지만 일반적으로 commit을 생성하지 않고 stash로 보관했다는 뜻은 아직 코드 작성이 완료되지 않았음을 의미하므로 당장 수동 병합을 진행하여 commit을 생성하는 것은 뭔가 석연치 않다. 다음의 명령어는 이런 상황에 권장하는 방법이다.
git stash branch <브랜치 이름>
-
지정된 브랜치 이름의 브랜치를 생성하고 HEAD를 이 브랜치로 이동시키며 Top 요소 stash 또는 지정된 stash를 작업 영역으로 꺼내면서 스택에서 삭제하는 명령어이다. 새로 브랜치를 생성하여 작업 사항들을 읽어오기 때문에 conflict가 발생할 일이 없다.
-
명령어 실행 전
-
명령어 실행
-
명령어 실행 후
저장된 작업 불러오기
git stash apply
-
Top 요소 stash를 작업 영역으로 읽어오는 것은 pop 명령어와 같지만 스택의 stash를 삭제하지 않는 명령어이다. 마치 stash를 복사하는 것처럼 동작한다.
-
명령어 실행 전
-
명령어 실행
-
명령어 실행 후
git stash apply stash@{<목록 번호>}
-
Apply 명령어는 pop 명령어와 달리 스택의 중간에 존재하는 지정된 stash를 작업 영역으로 불러올 수 있다. 목록 번호를 작성하지 않을 경우 top 요소 stash를 불러온다.
-
명령어 실행 전
-
명령어 실행
-
명령어 실행 후
Stash 삭제하기
Stash 하나 삭제하기
git stash drop
-
Top 요소 stash를 스택으로부터 삭제하는 명령어이다. Stash 스택은 임시 저장이 목적이므로 작업이 완료된 stash는 그때그때 정리하는 것이 좋다. (stash가 너무 많이 쌓이면 점점 어떤 stash가 언제의 이력인지 헷갈릴 수 있다.)
-
명령어 실행 전
-
명령어 실행
-
명령어 실행 후
모든 stash 삭제하기
git stash clear
-
Stash 스택 안 모든 stash를 삭제하는 명령어이다.
-
명령어 실행 전
-
명령어 실행 및 실행 후
작업 영역 정리하기
git clean
- 작업 영역에 추적 중이지 않은 모든 파일을 삭제하는 명령어이다. 특정 파일들을 모두 삭제하는 위험한 명령어이기 때문에 단독으로 실행할 경우 fatal error가 발생하며 옵션과 함께 실행해야 한다.
git clean -n
git clean --dry-run
- 모의로 삭제를 실행하여 삭제될 파일을 사용자가 확인 할 수 있도록 출력해 준다.
git clean -f
git clean --force
- 강제로 삭제를 실행하는 옵션이다. 현재 경로 내 파일만 삭제할 수 있다.
git clean -d
- 기본적으로 파일만 삭제하는데 디렉토리까지 삭제하는 옵션이다.
git clean -x
- 소문자 x 옵션은 .gitignore 파일에서 무시 중인 파일들 또한 삭제하는 옵션이다.
git clean -X
- 대문자 X 옵션은 .gitignore 파일에서 무시 중인 파일들만 삭제하는 옵션이다.
마무리하며…
이번 포스트에서는 stash 스택을 이용하여 작업 변경 사항을 보관하고 다시 찾아도 보고 정리도 해보며 작업 영역의 관리 방법에 대하여 알아보았다. 이는 다수의 branch를 가진 프로젝트에서 협업할 때 자주 쓰일 수밖에 없는 명령어이므로 알아두면 좋다. 다음 포스트에서는 병합과 리베이스에 관하여 알아보자.
Comments