오픈소스SW

오픈소스SW_Chapter07_임시 처리

강용민 2022. 10. 24. 01:23

스태시

 작업 브랜치를 변경하려면 워킹 디렉터리는 정리된 상태여야 한다. 즉 워킹 디렉터리에 작업 중인 내용이나 커밋되지 않은 변경 사항들이 남아있으면 브랜치를 변경할수 없다.

대신 현재 수정 작업을 멈추고, 다른 브랜치에 있는 코드를 수정하려면 스태시 기능을 사용할 수 있다.

스태시는 현재 워킹 디렉터리 내역을 별도의 스택 영역에 잠시 보관하라는 명령이다. 이는 브랜치를 이동할 때 작업 중인 내용 때문에 워킹 디렉터리가 충돌하는 것을 방지하는데 사용된다. 스태시 명령을 실행하면 현재 작업 중인 내용은 임시 저장되고, 수정 전 마지막 커밋 상태로 돌아간다. 즉, 이전 커밋 후 작업하지 않은 상태의 워킹 디렉터리가 된다.

 

실행법

git stash

 

  • save "메시지" : 스태시 여러 개를 생성할 때
  • list : 스태시에 저장된 스택을 볼 수 있음
    • 스태시 이름은 stash@{번호}형태로 순차적으로 부여되며 번호는 0부터 시작한다.
  • show : 워킹 디렉터리와 스태시 비교 정보를 출력한다.
    • -p : 상세정보
  • pop : 스태시를 다시 불러온다.
    • 스태시의 저장 영역은 스택 구조라 가장 최근 스태시를 출력한다.
    • 스택에서 내용을 읽어 올 때 현재 브랙치의 워킹 디렉터리와 자동으로 병합된다.
  • branch 브랜치이름
    • 스태시 스택에 저장된 내용으로 새로운 브랜치를 동시에 생성
  • apply
    • 스택에 저장된 항복을 불러와 현재 브랜치로 복원
    • 복원 후에도 스택 목록에서 삭제되지 않음.
    • stash@{번호}로 원하는 스택으로 복원할 수 있다. 물론 번호를 명시하지 않으면 스택 특징에 따라 가장 최신 스태시로 복원한다.
  • drop
    • 스택목록 삭제
  • --keep-index : 스테이지 영역의 파일들을 제외하고 스태시를 만듦
  • --include-untracked : untracked상태의 파일을 포함해 스태시로 생성

 

스태시 충돌

 스태시를 복원할 때 워킹 디렉터리의 상태는 깨끗해야 한다. 스택에 저장된 스태시 내용이 다시 워킹 디렉터리로 복구될 때, 수정된 작업 내용과 현재 워킹 디렉터리를 병합하는데 깨끗하지 않다면 병합 과정에서 충돌이 발생할 가능성이 많기 때문이다.

 병합 과정에서 충돌이 나면 개발자가 직접 문제를 해결해야하며, 스태시는 스택에 저장된 내용을 자동으로 삭제하지 않기에 개발자는 충돌 해결 후 스태시 목록을 수동으로 삭제해야 한다 스태시용 브랜치를 하나 생성해서 브랜치끼리 합치는 방법으로 해결할 수 있다.

 

스태시 복사

 스태시 스택에 저장된 항목들은 어느 브랜치에서나 복원이 가능하다. 즉, 스태시를 사용한 저장과 복원은 서로 다른 브랜치에도 가능하다는 의미이다.

 

pop vs apply

pop과 apply 옵션은 스태시 복원할 때 사용한다는 공통점이 있다. 그럼 이 둘의 차이점은 무엇일까? 답은 스택 목록에서 삭제 유무와 불러오는 순서에 있다.

 pop의 경우 스택 내용을 복원한 후 스택 목록에서 자동으로 삭제를 한다. 하지만 apply의 경우 스택 내용을 복원한 후에도 스택 목록에 여전히 남아 있다. pop은 스태시 내용을 워킹 디렉토리로 이동하는 것과 같으며, apply는 스태시 내용을 워킹 디렉토리에 복사하는 것과 같다.

 또 pop의 경우 스택의 특징에 따라 가장 최신의 스태시를 이동시키는 것에 반해 apply는 stash@{번호}로 스태시 리스트 중 원하는 목록의 스태시를 복사한다. 물론 apply에 번호를 안 넣는다면 가장 최신의 스태시를 복사한다.

apply는 이러한 특징을 이용하여 여러 브랜치의 워킹 디렉터리로 스태시의 임시 작업 내용을 복사할 수 있다.

 

워킹 디렉터리 청소

clean 명령어는 워킹 디렉터리에 있는 추적되지 않는 파일들을 찾아 삭제한다.

git clean
  • -f : 강제 청소
  • -n : 잘못 삭제하는 것을 미연에 방지하고자 파일을 가상으로 미리 처리해보고 사용자에게 확인 요청
  • -d : untracked 상태의 파일만 삭제함
  • -x : gitignore을 무시하고 삭제함

 

문제.

스태시는 원격 저장소에도 사용가능하다. 맞는가?

아니다. 스태시는 로컬 저장소에만 사용 가능하다.

 

스태시를 저장할 때 추적되지 않은 파일까지 포함해 메시지를 넣기위해서는 어떤 명령어를 사용하는가?

git stash --include-untracked save "메시지" 

 

스태시에 저장된 스택을 보려면 어떤 명령어를 사용하는가?

git stash list

 

스택에 2번째에 있는 스태시와 현재 워킹 디렉토리와 구체적으로 어떤 차이가 있는지 비교를 하려면 어떤 명령어를 사용하는가?

git stash show -p stash@{1}

 

pop과 apply의 공통점과 차이점을 서술하시오.

pop과 apply는 둘 다 스태시를 복원한다는 공통점을 갖고 있다.

하지만 pop은 일종의 이동개념으로 워킹디렉토리로 복원이 완료되면 스택에서 자동으로 삭제된다. 또한 스택의 가장 위.즉 최신 스태시만을 가져올 수 있다. 

apply는 일종의 복사 개념으로 워킹디렉토리로 복원이 완료되도 스택에 여전히 남아있다. 또한 apply뒤에 stash@{번호}를 붙히면 원하는 목록의 스태시를 가져올 수 있다. 만약 스택에서 삭제하고 싶다면 drop을 이용해 스택의 목록을 삭제할 수 있다.

 

만약 스태시 복원 시 충돌이 나면 해결할 수 있는 방법은 어떤 것이 있는가?

'git stash branch 브랜치명'을 통해 스택에 있는 내용을 새로운 브랜치에 옮겨놓고 기존의 브랜치와 merge하는 방법이 있다.

 

 

'오픈소스SW' 카테고리의 다른 글

오픈소스SW_Chapter09_복귀  (0) 2022.12.05
오픈소스SW_Chpater08_병합과 충돌  (0) 2022.10.24
오픈소스SW_Chapter05_서버  (0) 2022.10.10
오픈소스SW_Chapter04_커밋  (0) 2022.10.10
오픈소스SW_Chapter03_깃 시작  (0) 2022.10.10