[Git] Fork시 Stash 활용법

Simon·2024년 9월 14일
0
post-thumbnail

Git fork & git Stash

팀 프로젝트 repo를 fork 하여 로컬에서 clone 한 뒤 프로젝트를 진행 중에 git checkout [브랜치 이름] 명령어로 작업 중인 브랜치를 이동하였는데 이동하기 전 브랜치에 작업 파일들에 대한 변경 사항들이 그래도 보이길래 왜 그럴까라는 궁금증을 시작으로 글을 작성한다.

브랜치 변경 시 변경 사항 유지?

Git은 브랜치를 바꿀 때 커밋 되지 않은 변경 사항을 그대로 유지한다. 예를 들어, b라는 브랜치에서 작업을 하고 main 브랜치로 이동했을 때, b 브랜치에서 커밋 하지 않은 변경 사항들이 여전히 존재하면 main 브랜치에서 변경 사항을 볼 수 있다.

다른 브랜치에서 변경 사항을 보길 원치 않는 경우

  1. 브랜치를 바꾸기 전에 변경 사항 커밋하기

    작업한 내용을 해당 브랜치에서 커밋하고 나면, main 브랜치로 이동했을 경우 변경 사항이 더 이상 보이지 않는다.

  2. 변경 사항 임시 저장 (stash) 하기
    만약 변경 사항을 커밋 하지 않고 다른 브랜치로 이동하고 싶다면, Git의 stash 명령어를 사용해 변경 사항을 임시로 저장할 수 있다.

# b 브랜치에서 변경 사항을 stash로 임시 저장
git stash

# main 브랜치로 이동
git checkout main

# 다시 b 브랜치로 돌아와서 변경 사항 복원
git checkout b
git stash pop
  1. 강제로 브랜치 변경하기
    만약 변경 사항이 필요 없어졌고, 버리기 위해 강제로 브랜치를 바꾸고 싶으면, 변경 사항을 삭제하고 브랜치를 바꿀 수도 있다.
    git checkout main --force

git stash 명령어 실행

바로 적용해 보기 위해 git stash 명령어를 실행하였는데 아래와 같은 메시지가 나타났다. 뭔가 잘못됐나 싶었지만 그건 아니었다.

Saved working directory and index state WIP on Feat/progressCard: 887177c chore: Jest 테
스트를 위한 SVGR 설정 추가

메세지의 의미를 해석하면 다음과 같다.

  1. Saved working directory and index state WIP
    작업 중인 디렉토리와 인덱스 상태를 저장했다는 의미이다. 여기서 "WIP"는 "Work In Progress"의 약자로, 진행 중인 작업을 저장했다는 뜻이다.

  2. on Feat/progressCard
    현재 작업 중이었던 브랜치 이름이 Feat/progressCard였다는 뜻이다. 즉, Feat/progressCard 브랜치에서 변경 사항을 저장한 것이다.

  3. 887177c chore: Jest 테스트를 위한 SVGR 설정 추가
    마지막 커밋의 해시 (887177c)와 그 커밋 메시지입니다. 즉, 마지막 커밋이 "Jest 테스트를 위한 SVGR 설정 추가"라는 내용을 담고 있었으며, 그 이후에 진행한 작업들이 현재 stash에 저장되었음을 의미합니다.

이 상황에서의 의미

  • 현재 브랜치 (Feat/progressCard)에서 작업 중이던 내용이 커밋되지 않은 상태로 존재했는데, 이 내용을 임시로 stash에 저장
  • stash는 언제든 복원 가능하며, 다른 브랜치에서 작업을 마친 후 다시 해당 브랜치로 돌아와 git stash pop을 실행하면 stash에 저장한 내용을 복원 가능

주의 사항

만약 파일들을 add(스테이징) 하지 않고 git stash 명령어를 수행한다면 여전히 그대로 변경 사항이 보일 것이다. 왜냐하면 stash 명령어는 정확히 말하면 추적된 파일의 변경사항만 저장한다.

만약 Untracked files (Git에서 아직 추적되지 않는 파일들)도 함께 stash하고 싶다면 git stash -u명령어를 실행한다.

stash 파일들은 특정 브랜치만 사용?

여기서 궁금증이 하나 생긴다. 만약 내가 b라는 브랜치에서 파일 작업을하고 git stash -u 명령어를 사용하여 파일들을 숨기고 main 브랜치로 이동한 뒤 git stash pop 명령어를 실행하면 어떻게 될까?

두 가지가 경우로 생각할 수 있다.

  1. 정상적으로 적용되는 경우: b 브랜치에서 작업한 파일들이 main 브랜치에서 충돌 없이 적용된다. 이 경우, git stash pop을 통해 저장한 변경 사항들이 그대로 반영된다.

  2. 충돌 발생: 만약 main 브랜치에서 변경된 파일이 b 브랜치에서 stash한 파일과 겹칠 경우, 충돌이 발생할 수 있다. 이 경우 Git이 충돌 메시지를 표시하며, 충돌을 해결한 후에야 계속 작업을 진행할 수 있다.

즉, git stash는 브랜치에 한정되지 않게 저장소 전체에서 관리가 되고 다른 브랜치로 이동해도 stash 내용을 복원할 수 있다.

다음에 작업할 때도 비슷한 상황을 마주한다면 당황하지 않고 stash 명령어를 활용하여 잘 처리할 수 있을 것 같다. 어디서 한 번쯤 들어본 명령어였는데 이번 기회에 잘 알게 되었다.

profile
포기란 없습니다.

0개의 댓글

관련 채용 정보