본문 바로가기
Git

git stash

by oncerun 2023. 7. 3.
반응형

git stash에 대해 알아보기 이전 참고 글을 통해 몇 가지 지식을 얻었다.

 

commit의 단위

 

commit의 단위에 대한 나만의 기준이 없었다. 오늘 분량을 끝내서 commit을 하거나, 로컬의 변경사항이 급하게 적용되어야 하는 경우 main branch에 병합하기 위해 사용했던 것 같다.

 

 

git의 Commit의 기준을 논리적 단위라고 했을 때 이 논리적 단위의 자세한 내막은 어떻게 될까?

 

변경 사항이 특정 작업이나 기능과 관련된 경우, 새로운 작업 및 기능이 추가된 경우 해당 작업이나 기능에 대한 사항을 하나의 commit으로 묶을 수 있습니다. 

 

즉 프로젝트의 기능 단위로 변경사항을 구성하고, 의미 있는 작업 단위로 버전 관리를 할 수 있도록 구성하는 것입니다.

 

이 기준은 개발팀이 정할 수 있습니다. 그렇기에 정답은 없지만 기본적으로 논리적인 단위로 작업을 끝 맞췄을 때 커밋을 하는 습관을 들여야겠습니다. 

 

 

stash 활용

 

좋은 예시가 git-scm.com에 존재합니다. 

 

이슈로 인해 작업 중인 브랜치에서 이슈 브랜치를 변경을 진행해야 할 때 입니다. 

 

아직 완료하지 않은 부분을 커밋하는 것은 불편합니다. 이를 임시로 저장하고 이슈 브랜치로 이동하여 해당 문제를 해결한 후 다시 돌아와 작업을 이어서 하고 싶을 때 "git stash"  명령어는 도움이 될 수 있습니다.

 

stash 명령을 사용하면 작업 디렉토리에서 수정한 파일들만 저장합니다. 

 

 

하지만 제 상황은 조금 달랐습니다.

 

원격 저장소에서 직접 파일을 삭제하고 이후 로컬에서 pull을 하지 않고 작업을 진행하여 문제가 발생했습니다.

 

이는 Git의 작동방식과 관련이 있습니다.

 

Git은 변경사항을 관리하기 위해 각각의 commit을 참조하고, commit은 파일의 스냅샷을 저장합니다.

원격 저장소에서 파일을 삭제하게 되면 커밋이 발생하게 되고, 삭제된 파일의 커밋도 존재하지 않게되어 원격 저장소와 로컬 저장소 간의 일관성을 유지할 수 없게 됩니다.

 

gitignore에 추가된 파일을 지우려다 발생한 문제인데, 실제 원격의 커밋과 로컬의 커밋 차이가 발생하는 상황이었고  pull을 수행하지 않고 push 하려다 발생한 문제였습니다. 

 

error: Your local changes to the following files would be overwritten by merge

 

이는 원격 저장소에 있는 파일이 로컬 파일을 덮어써 문제가 발생할 수 있음을 경고 메시지와 push 할 때는  non-fast-forward 오류가 발생한 것이였습니다.

 

그래서 git stash를 통해 Modifed이면서 Tracked 상태인 파일과 Staging Area에 있는 파일을 임시 저장했습니다.

 

이후 git pull을 통해 원격과 로컬의 차이를 메꿨고 git stash apply를 통해 이를 다시 적용해 원격 저장소에 저장하였습니다.

 

 

 

정리하면 다음과 같습니다.


1. git stash를 사용하여 수정된 파일과 스테이징 영역에 있는 파일을 임시로 저장합니다. 이로써 현재의 수정사항을 보존하면서 원활한 pull 작업을 수행할 수 있습니다.

2. git pull 명령을 사용하여 원격 저장소의 최신 변경사항을 가져옵니다. 

3. git stash apply를 사용하여 이전에 저장한 임시 변경사항을 다시 적용합니다. 이 단계에서  충돌이 발생할 수 있으며, 필요한 경우 충돌을 해결해야 합니다.

4. 충돌을 해결한 후에는 git add와 git commit을 사용하여 변경사항을 스테이징하고 커밋합니다. 이렇게 하면 로컬 저장소와 원격 저장소의 일관성을 유지하면서 변경사항을 반영할 수 있습니다.

 

[고민사항]


- 충돌이 발생하면 충돌을 해결하는 과정에서 파일을 신중하게 확인해야 합니다. 올바르게 충돌을 해결하지 않으면 잘못된 코드 또는 데이터 손실이 발생할 수 있습니다.


- git stash를 사용하여 임시로 저장한 변경사항은 stash 목록에 남아 있을 수 있습니다. 필요한 경우 git stash drop을 사용하여 stash를 삭제하거나, git stash apply 대신 `git stash pop`을 사용하여 stash를 적용한 후 자동으로 삭제할 수 있습니다.



 

 

 

참고[https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Stashing%EA%B3%BC-Cleaning]

참고[https://worker-k.tistory.com/entry/git-stash-%EC%82%AC%EC%9A%A9%EB%B2%95-%EA%B9%83-%EC%8A%A4%ED%83%9C%EC%8B%9C%EB%8A%94-%EC%96%B4%EB%96%A4%EC%83%81%ED%99%A9%EC%97%90%EC%84%9C-%ED%95%84%EC%9A%94%ED%95%A0%EA%B9%8C-branch-commit%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EB%8B%A8%EC%9C%84]

반응형

'Git' 카테고리의 다른 글

git commit 되돌리기  (0) 2023.07.03
브랜치 .Refactoring  (0) 2022.08.14
Git Branch(4)  (0) 2021.02.11
Git Branch(3)  (0) 2021.02.11
Git Branch(2)  (0) 2021.02.11

댓글