[Git] 7장 임시 처리

참조

스태시(Stash)

  • 작업 브랜치를 변경하려면 워킹 디렉터리는 깨끗한 상태로 정리되어 있어야 합니다.
  • 워킹 디렉터리에 작업 중인 내용이나 커밋되지 않은 변경사항들이 남아 있으면 브랜치를 변경할 수 없습니다.
  • 예를 들어 브랜치에서 코드를 수정하는 도중에 새로운 버그가 발견되었습니다. 또는 고객의 긴급한 요청으로 코드를 추가해야 하는 경우가 발생합니다. 하지만 현재 작업 중인 코드 역시 수정이 끝난 것이 아닙니다.
  • 이러한 상황은 실제 개발 작업 과정에서 자주 발생하게 됩니다.
  • 이러한 상황에서 사용하는 기능이 스태시(stash) 입니다. 스태시는 간단히 말해 안전한 보관 입니다.
  • 깃은 완료되지 않은 작업(커밋되지 않은 변경 내용)이 남아 있을 때, 현재 작업을 임시로 저장할 수 있는 스태시(Stash) 기능을 제공합니다.
  • 스태시는 '현재 워킹 디렉터리 내역을 별도의 스택 영역에 잠시 보관하라' 는 명령입니다.
  • 스태시는 브랜치를 이동할 때 작업 중인 내용 때문에 워킹 디렉터리가 충돌하는 것을 방지하는 데 사용합니다.
  • 스태시 명령을 실행하면 현재 작업중인 내용은 임시 저장되고, 수정 전 마지막 커밋 상태로 돌아갑니다.
  • 즉, 이전 커밋 후 작업하지 않은 상태의 워킹 디렉터리가 됩니다.

스태시(Stash) 실습

  • 개발자는 다양한 상황과 마주합니다. 대표적으로 수정 작업을 하는 도중에 또 다른 수정 요청이 있는 경우입니다.
  • 이때 현재 작업은 잠시 멈추고, 또 다른 요청을 반영하려면 새로운 브랜치가 필요합니다.

1. 스태시 실습 위한 브랜치 생성

  • 소스트리를 이용하여 master 브랜치 말고, 새로운 브랜치 하나를 생성합니다.
  • 저는 feature 라는 브랜치 하나를 생성했습니다.

2. 생성한 feature 브랜치에서 index.html 내용 수정 작업

  • 생성된 feature 브랜치에서 index.html 파일을 수정하고, 저장한 후 커밋합니다.

3. feature -> master 브랜치로 checkout 진행

  • feature 브랜치에서 커밋을 완료하였다면, 다시 master 브랜치로 이동합니다.
  • master 브랜치에서 feature 브랜치 내용을 병합합니다.
  • feature 브랜치의 역할은 끝이 났으므로 삭제합니다.
  • 그리고 다시 master 브랜치에서 index.html 내용 수정 작업을 합니다.

4. master 브랜치에서 수정 후, 수정된 index.html 파일 커밋 전 상태

  • master 브랜치에서 수정 진행하였다면 index.html 파일이 워킹 디렉터리 영역에 나타납니다.
  • 아직 커밋은 하지 않은 상태 입니다.

5. 우선순위가 급한 버그 발생

  • master 에서 작업을 한창 진행 중, 우선순위가 제일 급한 버그가 발생했습니다.
  • 아직 master 에서 작업이 진행중이라 index.html 파일은 워킹 디렉터리 영역에 있습니다.
  • 여기서 새롭게 다시 bugRepair 라는 브랜치를 생성합니다.
  • master 브랜치에서 bugRepair 브랜치로 체크아웃 하려고 하니까 경고 문구가 발생합니다.
  • 경고 문구가 나온 이유는, 현재 수정하는 작업들이 체크아웃으로 다른 브랜치의 워킹 디렉터리에 영향을 줄 수 있기 때문입니다.

6. master 브랜치 작업 내용 stash 영역으로 저장

  • 아직 master 브랜치 작업이 끝나지 않은 상태입니다.
  • 여기서 새롭게 bugRepair 라는 브랜치가 생성되었습니다.
  • bugRepair 에서 작업을 하고 master 브랜치랑 향후에 병합을 하게 되면 충돌이 일어날 가능성이 매우 큽니다.
  • 그렇기 때문에 master 브랜치 작업 내용을 잠시 스태시(stash) 영역으로 저장합니다.
$ git stash

7. bugRepair 작업 진행 후 커밋

  • 이제 급한 버그를 bugRepair 브랜치에서 작업을 하여 수정하고 커밋합니다.

8. master 브랜치와 병합

  • bugRepair 브랜치에서 작업이 완료 되면, master 브랜치와 checkout 하고 병합합니다.
  • 병합을 완료하면, bugRepair 브랜치의 역할은 다 했으므로 삭제합니다.

9. stash 다시 불러오기

  • 이제 급한 버그를 수정하였기 때문에 stash 에 저장된 master 작업 내용을 다시 불러 옵니다.

10. 작업 완료

  • stash 영역에 저장된 작업 내용을 다시 가져와 작업을 완료하고 커밋합니다.

임시 저장 영역의 스택 목록

  • 스태시 저장 영역은 스택 구조 입니다.
  • 스택은 FILO(First Input Last Out) 구조로, 마지막에 입력한 자료가 제일 먼저 출력되는 데이터 저장 방식입니다.
  • 스태시에 저장된 스택은 list 옵션을 사용하여 확인할 수 있습니다.
  • 깃은 스태시된 객체들은 .git/refs/stash 에 저장합니다.
$ git stash list
$ cat .git/refs/stash

스태시(Stash) 복원으로 충돌

  • 스태시를 복원할 때 워킹 디렉터리의 상태는 깨끗해야 합니다.
  • 스택에 저장된 스태시 내용이 다시 워킹 디렉터리로 복구될 때, 수정된 작업 내용과 현재 워킹 디렉터리를 병합하기 때문입니다.
  • 복구되는 브랜치의 워킹 디렉터리가 깨끗하지 않다면 병합 과정에서 충돌이 발생할 가능성이 많습니다.
  • 특히 스태시를 복원할 때 같은 파일에서 동일한 부분을 변경했다면 즉시 충돌이 발생합니다.
  • 스태시를 복원할 때 충돌이 생기면 직접 문제 를 해결해야 합니다. 복원하는 도중 충돌이 생기면 스태시는 스택에 저장된 내용을 자동으로 삭제하지 않습니다.
  • 스태시 충돌이 예상된다면 스태시용 브랜치를 하나 생성해서 작업하는 것을 추천합니다.
$ git stash branch 브랜치이름

스태시 복사

  • 스태시는 브랜치 작업들을 임시로 저장할 때 사용합니다.
  • 또 임시 저장된 작업을 스태시 명령 이전의 브랜치 상태로 되돌려 놓습니다.
  • 스태시를 사용한 저장과 복원은 서로 다른 브랜치에도 가능합니다.
  • 반드시 이전에 실행한 브랜치와 같은 브랜치에서 할 필요는 없습니다.
  • 스태시 스택에 저장된 항목들은 어느 브랜치에서나 복원이 가능합니다.
  • apply 옵션은 스택에 저장된 항목을 불러와 현재 브랜치로 복원합니다.
$ git stash apply

스태시 복원 명령 pop

  • pop 명령어는 스택 내용을 복원한 후 스택 목록에서 자동으로 삭제합니다.
  • 즉, pop 명령어는 스택 내용을 워킹 디렉터리로 이동하는 것과 샅습니다.

스태시 복원 명령 apply

  • apply 명령어는 스택 내용을 복원한 후 스택 목록에서 자동으로 삭제하지 않습니다.
  • 스택 목록을 읽은 후 자동으로 삭제하지 않기 때문에 반복적으로 스택에서 스태시 내용을 읽어 올 수 있습니다.
  • apply 명령어는 스태시 내용을 워킹 디렉터리로 복사하는 것과 같습니다.

스태시 삭제

  • 스태시는 복원할 때 한 번 호출하면 자동으로 스택에서 삭제됩니다.
  • 하지만 충돌이 발생하거나 apply 명령어로 워킹 디렉터리를 복구할 때는 스택에서 자동으로 삭제되지 않습니다.
  • 이때는 별도 명령을 실행해야만 스태시 목록에서 삭제됩니다.
$ git stash drop

워킹 디렉터리 청소

  • 개발하는 과정에서는 컴파일 등 임시로 파일들이 생깁니다.
  • 이 파일들은 .gitignore 목록에 넣어 관리할 수도 있지만, 반복해서 불필요하게 생성되는 파일들은 귀찮을 뿐입니다.
  • 이때 clean 명령어를 사용하면 워킹 디렉터리에 있는 추적되지 않는 파일들을 찾아 삭제합니다.
  • clean 명령어를 사용할 때는 주의할 점이 있는데, clean 명령어를 실행하는 순간 워킹 디렉터리의 추적되지 않는 모든 파일을 삭제한다는 것입니다.
$ git clean

정리

  • 깃을 안정적으로 잘 사용하려면 워킹 디렉터리를 항상 깨끗하게 유지 관리해야 합니다.
  • 워킹 디렉터리는 코드를 생성하고 수정하는 모든 작업 공간입니다.
  • 워킹 디렉터리가 정리되어 있지 않으면, 브랜치를 변경하여 다른 작업을 할 수 없습니다.
  • 워킹 디렉터리를 정리하는 방법은 수정된 코드를 스테이지하고, 최종 스냅샷을 생성하여 커밋하는 것입니다.
  • 커밋하지 못할 때는 이번에 배운 스태시(stash) 를 적용하여 작업 내용을 임시로 저장한 후 사용해야 합니다.
728x90

'버전관리' 카테고리의 다른 글

[Git] 9장 복귀  (0) 2022.06.20
[Git] 8장 병합과 충돌  (0) 2022.06.20
[Git] 6장 브랜치  (0) 2022.06.19
[Git] 5장 서버  (0) 2022.06.19
[Git] 4장 커밋  (0) 2022.06.18

이 글을 공유하기

댓글

Designed by JB FACTORY