맛보기
우리가 어떤 작업을 하다가 branch를 변경하거나 새로운 작업을 pull 하고 싶을 때가 있을 것이다.
이때, commit 하기에는 작업이 마무리되지 않아 애매한 상황이라면 어떻게 하는 것이 좋을까??
git stash란?
Use git stash when you want to record the current state of the working directory and the index, but want to go back to a clean working directory
Git 문서에 나온 것처럼 우리가 working directory을 기록하고 싶은데 깨끗한 상태로 돌아가고 싶을 때 사용하라고 나와있다. 즉, 아직 commit 하지 않았고 마무리되지 않은 작업을 잠시 저장했다가 나중에 사용할 수 있게 하는 명령어이다.
git stash 문법
1. git stash (하던 작업 임시로 저장하기)
git stash
git stash 뒤에 아무것도 쓰지 않으면 git stash push랑 같은 의미이다.
위 명령어를 통해 기존에 작업하던 파일들을 stash에 저장한다.
git stash 명령어는 기본적으로 staged 상태에 있거나 modified되었고 tracked인 파일을 대상으로 실행된다.
그래서 위 상황에서 git stash를 실행하면 hello.txt, hi.txt가 stash에 저장되고 world.txt는 저장되지 않게 된다. 그렇게 되면 이제 working directory는 HEAD에 있는 것과 같은 상태가 된다.
추가적으로 stash 할 때 untracked 파일도 같이 저장하고 싶다면 -a, -u 옵션을 사용하면 된다.
ex) git stash -u
2. git stash list & show (stash 목록 확인하기)
git stash list
위 명령어는 현재 stash 되어 있는 목록을 보여주는 명령어이다.
우리가 stash를 통해 저장한 파일들을 다시 가져올 때 stash list를 통해 목록을 확인하고 가져올 수 있게 된다.
git stash show
자신이 stash한 것들의 자세한 정보를 알고 싶다면 위 명령어를 사용하면 된다.
그러면 몇개의 파일이 변경되었고 코드 변경에 대한 기록이 나오게 된다.
// 특정 버전의 stash와 비교.
git stash show stash@{<revision>}
// patch 형태로 비교.
git stash show -p stash@{<revision>}
3. git stash apply & pop (stash 다시 가져오기)
git stash를 이제 다시 복구하는 방법이다.
git stash apply
위의 명령어는 저장되어 있던 작업을 복구하는 명령어이다.
git stash apply // 가장 최근 stash를 받아온다.
git stash apply stash@{<revision>} // revision 번호에 해당하는 stash를 받아온다.
- git stash apply
- 아래를 확인해보면 변경했던 파일들이 정상적으로 돌아왔지만 처음 형태와는 다른 것을 알 수 있다. 이 명령어를 입력하게 되면 모든 파일들이 modified 되었고 tracked인 상태로 돌아오게 된다. 여기서 처음 우리가 원하는 상태로 돌아오려면 하나의 옵션을 넣어줘야 한다.
git stash apply
- 아래를 확인해보면 변경했던 파일들이 정상적으로 돌아왔지만 처음 형태와는 다른 것을 알 수 있다. 이 명령어를 입력하게 되면 모든 파일들이 modified 되었고 tracked인 상태로 돌아오게 된다. 여기서 처음 우리가 원하는 상태로 돌아오려면 하나의 옵션을 넣어줘야 한다.
- git stash apply --index
- --index 옵션을 넣어주면 우리가 처음 있던 상태로 돌아오게 된다. 이 옵션은 단순히 변경 사항만 복원하는 것이 아니라 상태까지 원래대로 복원하는 옵션이다. 그래서 staged 상태와 modified 되었고 tracked인 상태를 구분하여 복원하게 된다.
git stash apply --index
- --index 옵션을 넣어주면 우리가 처음 있던 상태로 돌아오게 된다. 이 옵션은 단순히 변경 사항만 복원하는 것이 아니라 상태까지 원래대로 복원하는 옵션이다. 그래서 staged 상태와 modified 되었고 tracked인 상태를 구분하여 복원하게 된다.
git stash pop (git stash apply + git stash drop)
위의 명령어는 git stash apply와 동시에 해당 stash를 지우는 작업이다.
git stash apply는 stash 목록에 여전히 기록이 남아있지만 이것의 기록을 가져오면서 지우기 위해 사용된다.
4. git stash drop & clear (stash 지우기)
이제 마지막으로 저장되어 있는 stash들을 지우는 단계이다.
git stash drop
하나의 stash entry를 삭제하는 명령어이다.
git stash drop // 가장 최근 stash를 삭제한다.
git stash drop stash@{<revision>} // revision 번호에 해당하는 stash를 삭제한다.
git stash clear
모든 stash entry를 삭제하는 명령이다.
5. git stash 되돌리기
잘못된 stash를 받아왔을 때 해당 명령을 다시 되돌리는 방법이다.
show 명령어에 -p를 추가해주면 stash에서 변경된 것들을 patch 형태로 보여준다.
그래서 이것을 이용해 git apply를 적용해주면 원래 상태로 이동할 수 있다.
// 가장 최근 stash를 patch로 만들어 되돌린다.
git stash show -p | git apply -R
// revision번째의 stash를 patch로 만들어 되돌린다.
git stash show -p stash@{<revision>} | git apply -R
git stash 사용 예시
git pull을 하려는데 pull이 안 되는 상황.
즉, 여기서는 우리가 수정한 파일과 원격 저장소에서 수정한 파일이 conflict이 발생한 경우이다.
이 상황에서는 배운 내용을 바탕으로
- git stash
- git pull
- git stash pop
을 통해서 문제를 해결할 수 있게 된다.
여전히 conflict은 발생하지만 이것은 로컬에서 해결한 후에 다시 commit 하면 되기 때문에 쉽게 해결할 수 있다.
Reference
1. https://git-scm.com/docs/git-stash
'Git' 카테고리의 다른 글
[Git] .gitignore 사용법 및 중간에 적용하기 (0) | 2021.12.29 |
---|