git-stash 대 git-branch 백업 한 다음 쓰레기

A의 이전 망할 놈의 질문 , 다니엘 Benamy는 망할 놈의 워크 플로우에 대해 얘기했다 :

저는 마스터 작업을하고 일부 작업을 수행 한 다음 그 작업을 보류하기로 결정했습니다. 몇 가지 커밋을 백업 한 다음 쓰레기 작업을 시작하기 전에 분기했습니다.

그는 현재 변경 사항을 잃지 않고 작업 상태를 이전 시점으로 복원하기를 원했습니다. 모든 답변은 다음과 같이 다양한 방식으로 회전했습니다.

git branch -m master crap_work
git branch -m previous_master master

이것은 어떻게 비교 git stash됩니까? 나는 모든 것이 이미 분기에 의해 처리되는 것처럼 보일 때 여기에서 다른 사용 사례를 보려고 약간 혼란 스럽습니다 git stash


@ Jordi Bunster : 감사합니다. “숨김”을 가볍고 이름이없는 가지처럼 생각할 것 같습니다. 그래서 은닉은 무엇이든 할 수 있습니다. 좋은!



답변

‘stash’는 작업 복사본 에서 커밋되지 않은 ” 더티 “항목을 가져 와서 제거하여 깨끗한 작업 복사본을 남깁니다.

실제로 전혀 분기되지 않습니다. 그런 다음 다른 분기 위에 숨김을 적용 할 수 있습니다. 또는 Git 1.6부터 다음을 수행 할 수 있습니다.

git stash branch <branchname> [<stash>]

하나의 명령으로 새 분기 위에 숨김을 적용합니다.

따라서 ” 잘못된 “브랜치에 아직 커밋하지 않은 경우 숨김이 잘 작동합니다 .

이미 약속 한 경우 질문에 설명하는 워크 플로가 더 나은 대안입니다. 그건 그렇고, 당신 말이 맞습니다. Git은 매우 유연하고 그 유연성으로 인해 기능이 겹칩니다.


답변

숨김을 복원하면 변경 사항이 다시 적용되고 코드 작업이 계속됩니다.

현재 변경 사항을 숨기려면

$ git stash save
Saved "WIP on master: e71813e..."

두 개 이상의 숨김을 가질 수도 있습니다. 숨김은 스택처럼 작동합니다. 새 보관함을 저장할 때마다 스택 맨 위에 놓입니다.

$ git stash list
stash@{0}: WIP on master: e71813e..."

메모 stash@{0}부분을? 그것은 당신의 숨김 ID입니다. 나중에 복원 할 때 필요합니다. 지금 당장 해봅시다. 숨김 ID는 모든 숨김으로 변경됩니다. stash @ {0}는 마지막으로 만든 숨김을 나타냅니다.

숨김을 적용하려면

$ git stash apply stash@{0}

적용한 후에도 숨겨져있는 것을 알 수 있습니다. 더 이상 필요하지 않은 경우 드롭 할 수 있습니다.

$ git stash drop stash@{0}

또는 숨김이 스택처럼 작동하기 때문에 마지막으로 저장 한 숨김을 제거 할 수 있습니다.

$ git stash pop

모든 보관함을 지우려면 ‘clear’명령을 실행하십시오.

$ git stash clear

그다지 자주 스테이시를 사용하지 않을 수도 있습니다. 나중에 복원하기 위해 변경 사항을 신속하게 숨기려면 숨김 ID를 생략 할 수 있습니다.

$ git stash
...
$ git stash pop

정말 중요한 작업에 사용하기 전에 숨김으로 실험 해보세요.

내 블로그에 더 심층적 인 버전이 게시되어 있습니다.


답변

나는 항상 git stash를 조심합니다. 몇 번 숨기면 일이 지저분 해지는 경향이 있습니다. git stash list는 생성 한 은닉 목록을 표시하고 메시지를 제공 한 경우 메시지와 함께 표시합니다.하지만 문제는 잔인한 git stash clear (모두 제거)를 제외하고는 은닉을 정리할 수 없다는 사실에 있습니다. . 그래서 당신이 당신의 은닉 물에 대한 초-설명적인 메시지를 제공하는 데 항상 항문이 아니라면 (좀은 은닉의 철학에 위배됩니다), 당신은 이해할 수없는 묶음으로 끝납니다.

내가 아는 유일한 방법은 gitk –all을 사용하고 스테이시를 발견하는 것입니다. 적어도 이것은 숨김이 생성 된 커밋과 해당 숨김에 포함 된 모든 항목의 차이점을 볼 수 있습니다.

내가 자식 1.5.4.3을 사용하고, 나는 1.6 생각합니다 내가 선택한 은닉을 적용 할 것 같아요 자식 숨김 팝, 추가 목록에서 제거합니다. 훨씬 깨끗해 보입니다.

지금은 한 시간 안에라도 같은 날에 그 은닉처로 돌아갈 거라고 절대적으로 확신하지 않는 한 항상 분기를 시도합니다.


답변

git stash보다 더 적합 할 수있는 워크 플로를 찾는 경우 git-bottle 을 살펴볼 수 있습니다 . 다양한 git 작업 상태를 일반 git 커밋으로 저장하고 복원하기위한 유틸리티로, 작업 트리의 현재 및 관련 상태와 git 상태 아래에 표시된 모든 다양한 파일 상태를 효과적으로 스냅 샷합니다 .

다음과의 주요 차이점 git stash:

  • git stash더티 git 상태를 좁게 저장 (수정 된 파일 및 인덱스에 추가 된 파일)하는 반면 ,와 다른 모든 것을 git-bottle저장하도록 설계되었으며 수정, 수정 및 추가되지 않음, 추가되지 않음, 병합되지 않은 경로를 보존하는 방식으로 구별됩니다. 및 전체 리베이스 / 병합 상태 (아래 경로 만 저장되지 않음).HEAD.gitignore
  • git stash별도로 추적해야하는 숨김 개체에 저장합니다. 나는 2 주 전에 뭔가를 은닉하는 경우 반면에 나는 그것을 기억하지 않을 수 있습니다 git-bottle로 저장 현재 브랜치에 임시 커밋으로 합니다. 역동 작은 팝 git-unbottle과 동일합니다 git stash. 저장소간에 이러한 커밋을 푸시하고 공유 할 수 있습니다. 이는 원격 빌드에 유용 할 수 있습니다. 원격 서버에 다른 리포지토리가있어 빌드하거나 충돌 해결을 위해 다른 사람과 공동 작업 할 때 유용 할 수 있습니다.