분류 Git

git stash 명령 사용에 대한 실용적인 가이드

컨텐츠 정보

  • 조회 440 (작성일 )

본문

git stash 명령을 사용하는 방법과 사용해야 하는 시기를 알아 봅니다.


버전 제어는 소프트웨어 개발자의 일상 생활에서 분리 할 수 없는 부분입니다. 버전 관리 도구를 사용하지 않고 소프트웨어를 개발하는 팀은 상상하기 어렵습니다. Git과 함께 일하지 않았거나 적어도 들어 본 적이 있는 개발자를 상상하는 것도 똑같이 어렵습니다. 2018 년 Stackoverflow 개발자 설문 조사에서 74,298 명의 참가자 중 87.2 %가 버전 제어에 Git을 사용합니다.


Linus Torvalds는 2005 년 Linux 커널 개발을 위해 git을 만들었습니다. 이 기사에서는 git stash 명령을 살펴보고 변경 사항을 숨기는 데 유용한 몇 가지 옵션을 살펴 봅니다. Git 개념에 대한 기본적인 지식과 작업 트리, 스테이징 영역 및 관련 명령을 잘 이해하고 있다고 가정합니다.


git stash가 중요한 이유는 무엇입니까? 


가장 먼저 이해해야 할 것은 Git에서 변경 사항을 숨기는 것이 중요한 이유입니다. Git에 변경 사항을 숨기는 명령이 없다고 가정합니다. A와 B라는 두 개의 브랜치가 있는 저장소에서 작업한다고 가정합니다. A와 B 브랜치는 꽤 오랫동안 서로 갈라졌고 헤드가 다릅니다. 분기 A의 일부 파일을 작업하는 동안 팀은 분기 B의 버그를 수정하도록 요청합니다.

A에 대한 변경 사항을 신속하게 저장하고 git checkout B를 사용하여 브랜치 B를 체크 아웃하려고 합니다. Git은 즉시 작업을 중단하고 "다음 파일에 대한 로컬 변경 사항이 체크 아웃으로 덮어 쓰여집니다. 변경 사항을 커밋하거나 숨기십시오. 분기를 전환하기 전에. "


이 경우 분기 전환을 활성화하는 몇 가지 방법이 있습니다.


  • 분기 A의 해당 지점에 커밋을 만들고 변경 사항을 커밋하고 푸시하여 B의 버그를 수정 한 다음 A를 다시 확인하고 git reset HEAD^를 실행하여 변경 사항을 되돌립니다.
  • Git에서 추적하지 않는 파일의 변경 사항을 수동으로 유지합니다.

두 번째 방법은 나쁜 생각입니다. 첫 번째 방법은 일반적으로 보이지만 완료되지 않은 저장된 변경 사항이 아직 진행 중인 패치가 아닌 체크 포인트로 처리되기 때문에 유연성이 떨어집니다. 이것은 git stash가 설계된 시나리오의 종류입니다.


Git stash는 커밋 되지 않은 변경 사항을 로컬에 저장하여 변경, 분기 전환 및 기타 Git 작업 수행을 허용합니다. 그런 다음 필요할 때 숨겨진 변경 사항을 다시 적용 할 수 있습니다. 숨김은 로컬 범위이며 git push에 의해 원격으로 푸시되지 않습니다.


git stash 사용 방법 


다음은 git stash를 사용할 때 따라야 할 순서입니다.


  1. 분기 A에 대한 변경 사항을 저장합니다.
  2. git stash를 실행하십시오.
  3. 지점 B를 확인하십시오.
  4. 분기 B의 버그를 수정합니다.
  5. 커밋하고 (선택적으로) 원격으로 푸시합니다.
  6. A 지점 확인
  7. git stash pop을 실행하여 숨겨진 변경 사항을 다시 가져옵니다.


Git stash는 작업 디렉토리에 대한 변경 사항을 로컬 (프로젝트의 .git 디렉토리, 정확히 말하면 /.git/refs/stash 내부)에 저장하고 필요할 때 변경 사항을 검색 할 수 있습니다. 컨텍스트간에 전환해야 할 때 편리합니다. 나중에 필요할 수 있는 변경 사항을 저장할 수 있으며 변경 사항을 그대로 유지하면서 작업 디렉토리를 정리하는 가장 빠른 방법입니다.


stash을 만드는 방법 


변경 사항을 숨기는 가장 간단한 명령은 git stash입니다.


git stash
Saved working directory and index state WIP on master; d7435644 Feat: configure graphql endpoint 


기본적으로 git stash는 커밋 되지 않은 변경 사항 (스테이지 및 언스테이지 된 파일)을 저장 (또는 "스태시")하고 추적 되지 않고 무시 된 파일을 간과합니다. 일반적으로 추적 되지 않고 무시 된 파일을 숨길 필요는 없지만 때로는 코드베이스에서 수행하려는 다른 작업을 방해 할 수 있습니다.


추가 옵션을 사용하여 git stash가 추적 되지 않고 무시 된 파일을 처리하도록 할 수 있습니다.


  • git stash -u 또는 git stash --include-untracked stash untracked files.
  • git stash -a 또는 git stash-모든 추적 되지 않은 파일과 무시 된 파일을 숨깁니다.

특정 파일을 숨기려면 git stash -p 또는 git stash –patch 명령을 사용할 수 있습니다.


git stash --patch
diff --git a/.gitignore b/.gitignore
index 32174593..8d81be6e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
 # dependencies
 node_modules/
 /.pnp
+f,fmfm
 .pnp.js

 # testing
(1/1) Stash this hunk [y,n,q,a,d,e,?]? 


stashes 나열 


git stash list 명령을 사용하여 보관함을 볼 수 있습니다. 스태시는 후입 선출 (LIFO) 방식으로 저장됩니다.


git stash list
stash@{0}: WIP on master: d7435644 Feat: configure graphql endpoint 


기본적으로 숨김은 숨김을 만든 지점과 커밋의 맨 위에 WIP로 표시됩니다. 그러나 이 제한된 양의 정보는 보관함이 여러 개인 경우 기억하거나 내용을 개별적으로 확인하기가 어려워 지므로 도움이 되지 않습니다. 숨김에 설명을 추가하려면 git stash save <description> 명령을 사용할 수 있습니다.


git stash save "remove semi-colon from schema"
Saved working directory and index state On master: remove semi-colon from schema

git stash list
stash@{0}: On master: remove semi-colon from schema
stash@{1}: WIP on master: d7435644 Feat: configure graphql endpoint 


숨겨진 변경 사항 검색 


git stash apply 및 git stash pop 명령을 사용하여 숨김 변경 사항을 다시 적용 할 수 있습니다. 두 명령 모두 최신 숨김 (즉, stash @ {0})에 저장된 변경 사항을 다시 적용합니다. 숨김은 변경 사항을 다시 적용하는 반면 pop은 숨김에서 변경 사항을 제거하고 작업 복사본에 다시 적용합니다. 숨겨진 변경 사항을 두 번 이상 다시 적용 할 필요가 없는 경우 팝핑이 선호됩니다.


마지막 인수로 식별자를 전달하여 팝하거나 적용 할 숨김을 선택할 수 있습니다.


git stash pop stash@{1} 


또는


git stash apply stash@{1} 


Cleaning up the stash 


더 이상 필요하지 않은 보관함은 제거하는 것이 좋습니다. 다음 명령을 사용하여 수동으로 수행해야 합니다.


  • git stash clear는 모든 숨김을 제거하여 숨김 목록을 비웁니다.
  • git stash drop <stash_id>는 숨김 목록에서 특정 숨김을 삭제합니다.

Checking stash diffs 


git stash show <stash_id> 명령을 사용하면 숨김의 차이점을 볼 수 있습니다.


git stash show stash@{1}
console/console-init/ui/.graphqlrc.yml        |   4 +-
console/console-init/ui/generated-frontend.ts | 742 +++++++++---------
console/console-init/ui/package.json          |   2 +- 


더 자세한 차이점을 얻으려면 --patch 또는 -p 플래그를 전달하십시오.


git stash show stash@{0} --patch
diff --git a/console/console-init/ui/package.json b/console/console-init/ui/package.json
index 755912b97..5b5af1bd6 100644
--- a/console/console-init/ui/package.json
+++ b/console/console-init/ui/package.json
@@ -1,5 +1,5 @@
 {
"name""my-usepatternfly",
"name""my-usepatternfly-2",
  "version""0.1.0",
  "private"true,
  "proxy""http://localhost:4000"
diff --git a/console/console-init/ui/src/AppNavHeader.tsx b/console/console-init/ui/src/AppNavHeader.tsx
index a4764d2f3..da72b7e2b 100644
--- a/console/console-init/ui/src/AppNavHeader.tsx
+++ b/console/console-init/ui/src/AppNavHeader.tsx
@@ -9,8 +9,8 @@ import { css } from "@patternfly/react-styles";

interface IAppNavHeaderProps extends PageHeaderProps {
- toolbar?: React.ReactNode;
- avatar?: React.ReactNode;
+ toolbar?: React.ReactNode;
+ avatar?: React.ReactNode;
}

export class AppNavHeader extends React.Component<IAppNavHeaderProps>{
  render() 


Checking out to a new branch 


브랜치와 숨김의 변경 사항이 분기 되어 숨김을 다시 적용하려고 할 때 충돌이 발생하는 상황이 발생할 수 있습니다. 이것에 대한 깨끗한 수정은 git stash branch <new_branch_name stash_id> 명령을 사용하는 것입니다.이 명령은 숨김이 생성 된 커밋을 기반으로 새 분기를 만들고 숨김 된 변경 사항을 팝합니다.


git stash branch test_2 stash@{0}
Switched to a new branch 'test_2'
On branch test_2
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .graphqlrc.yml
modified: generated-frontend.ts
modified: package.json
no changes added to commit (use "git add" and/or "git commit -a")
Dropped stash@{0} (fe4bf8f79175b8fbd3df3c4558249834ecb75cd1) 


Stashing without disturbing the stash reflog 


드물지만 숨김 참조 로그 (reflog)를 그대로 유지하면서 숨김을 만들어야 할 수도 있습니다. 이러한 경우는 구현 세부 사항으로 숨길 스크립트가 필요할 때 발생할 수 있습니다. 이것은 git stash create 명령으로 수행됩니다. stash 항목을 생성하고 stash reflog에 푸시하지 않고 객체 이름을 반환합니다.


git stash create "sample stash"
63a711cd3c7f8047662007490723e26ae9d4acf9 


때로는 git stash create를 통해 생성 된 stash 항목을 stash reflog에 푸시하기로 결정할 수 있습니다.


git stash store -m "sample stash testing.." "63a711cd3c7f8047662007490723e26ae9d4acf9"
git stash list
stash @{0}: sample stash testing.. 


결론 


이 기사가 유용하고 새로운 것을 배웠기를 바랍니다. 숨김 사용에 대한 유용한 옵션을 놓친 경우 의견을 통해 알려주십시오.


https://opensource.com/article/21/4/git-stash