development

힘내 숨김 : "더러운 작업 트리에는 적용 할 수 없습니다. 변경 사항을 준비하십시오"

big-blog 2020. 6. 30. 08:00
반응형

힘내 숨김 : "더러운 작업 트리에는 적용 할 수 없습니다. 변경 사항을 준비하십시오"


이전에 저장 한 변경 사항을 적용 git stash pop하고 메시지를 받으려고합니다.

Cannot apply to a dirty working tree, please stage your changes

그것을 다루는 방법에 대한 제안?


더티 작업 복사본에 숨김 변경 사항을 적용해야하는 경우 (예 : 숨김에서 둘 이상의 변경 세트를 팝업) 다음을 사용합니다.

$ git stash show -p | git apply -3 && git stash drop

기본적으로

  1. 패치를 만듭니다
  2. 적용 명령에 파이프
  3. 충돌이있는 경우 3 방향 병합을 통해 해결해야합니다.
  4. 적용 (또는 병합)에 성공하면 방금 적용된 숨김 항목이 삭제됩니다 ...

위의 한 줄짜리처럼 정확하게 작동 해야하는 -f(강제) 옵션 이없는 이유가 궁금 git stash pop합니다.

그 동안이 하나의 라이너를 자식 별칭으로 추가 할 수 있습니다.

$ git config --global --replace-all alias.unstash \
   '!git stash show -p | git apply -3 && git stash drop'
$ git unstash

-33 방향 병합을 통해 직접 충돌을 해결할 수 있는 매개 변수 를 지적한 @SamHasler에게 감사합니다 .


나는 이런 식으로합니다 :

git add -A
git stash apply

그런 다음 (선택 사항) :

git reset

패치 파일로 원하는 숨김을 내보내고 수동으로 적용하여 현재 변경 사항을 숨기지 않고도이 작업을 수행 할 수 있습니다.

예를 들어, stash @ {0}을 더티 트리에 적용한다고 가정하십시오.

  1. stash @ {0}을 패치로 내보내기 :

    git stash show -p stash @ {0}> Stash0.patch

  2. 변경 사항을 수동으로 적용하십시오.

    자식 적용 Stash0.patch

두 번째 단계가 실패하면 Stash0.patch 파일을 편집하여 오류를 수정 한 다음 git apply를 다시 시도해야합니다.


git reset으로 작업 디렉토리를 정리하거나 변경 사항을 커밋하거나 현재 변경 사항을 숨기려면 다음을 시도하십시오.

$ git stash save "현재 변경 사항 설명"
$ git stash pop stash @ {1}

현재 변경 사항을 숨기고 숨김 스택에서 두 번째 숨김을 팝합니다.


Mathias의 솔루션은 git stash pop --force와 가장 가까운 솔루션입니다 (실제로 citmon Git 개발자는이 옵션을 이미 사용합시다!)

그러나 git 명령 만 사용하여 동일한 작업을 수행하려면 다음을 수행하십시오.

  1. git commit -a -m "Fixme"
  2. 자식 숨김 팝
  3. 자식 커밋 -a --amend
  4. git reset HEAD ~

즉, 현재 변경 사항을 커밋하십시오 (우리는 절대로 밀어 넣지 않을 것입니다). 이제 작업 공간이 깨끗해졌습니다. 이제 이전 변경 사항에 대한 수정 사항으로 숨김 변경 사항을 적용하십시오. 이제 한 번의 커밋 ( "Fixme")으로 두 변경 세트가 결합되었습니다. 결제를 "커밋하기 전에 하나"로 재설정 (-소프트 NOT-단단하지 않으므로 실제로 손실되지 않음)하면 커밋되지 않은 두 가지 변경 사항이 있습니다.

** 편집 * *

실제로는 훨씬 더 쉽다는 것을 깨달았습니다. 3 단계를 완전히 건너 뛸 수 있으므로 ...

  1. git commit -a -m "Fixme"
  2. 자식 숨김 팝
  3. git reset HEAD ~

(현재 변경 사항을 커미트하고 숨김 변경 사항을 제거하고 커밋을 재설정하여 커미트되지 않은 상태에서 두 가지 변경 사항 세트를 결합하십시오.)


오늘 내가했던 것처럼이 상황에서 자신을 발견하면 실제로 이러한 답변 중 아무것도 작동하지 않습니다. git reset --hard내가 한 사람 수에 관계없이 아무 데나 데려갔습니다. 내 대답 (어떻게 든 공식적이 아니었다) :

  1. 숨김의 해시 사용 파악 git reflog --all
  2. 관심있는 지점과 해시를 병합

Mathias Leppich의 솔루션 이 훌륭하게 작동 한다는 것을 알았 으므로 글로벌 .gitconfig에 별칭을 추가했습니다.

[alias]
        apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop

이제 그냥 입력 할 수 있습니다

git apply-stash-to-dirty-working-tree

그것은 나를 위해 잘 작동합니다.

(여러분의 마일리지는이 긴 별칭 이름에 따라 다를 수 있습니다. 그러나 bash 완료와 관련하여 자세한 정보가 필요합니다.)


git add변경 사항을 준비하여 트리를 정리 하여 "더티"트리에 숨김을 적용 할 수 있습니다 . 그런 다음 git stash pop숨김 변경 사항을 문제없이 적용하고 적용 할 수 있습니다 .


You have files that have been modified but not committed. Either:

git reset --hard HEAD (to bring everything back to HEAD)

or, if you want to save your changes:

git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop

I had the same problem but git had zero changed files. Turns out I had a index.lock file that was lying around. Deleting it solved the problem.


I was unable to get most of these to work; for some reason it always thinks I have local changes to a file. I can't apply a stash, patches won't apply, checkout and reset --hard fail. What finally worked was saving the stash as a branch with git stash branch tempbranchname, and then doing a normal branch merge: git checkout master and git merge tempbranchname. From http://git-scm.com/book/en/Git-Tools-Stashing :

If you want an easier way to test the stashed changes again, you can run git stash branch, which creates a new branch for you, checks out the commit you were on when you stashed your work, reapplies your work there, and then drops the stash if it applies successfully

참고URL : https://stackoverflow.com/questions/1360712/git-stash-cannot-apply-to-a-dirty-working-tree-please-stage-your-changes

반응형