code

Git stash: "더러운 작업 트리에 적용할 수 없습니다. 변경 사항을 스테이징하십시오."

starcafe 2023. 10. 25. 23:26
반응형

Git stash: "더러운 작업 트리에 적용할 수 없습니다. 변경 사항을 스테이징하십시오."

이전에 숨겨두었던 변경 사항을 적용하려고 합니다.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. apply 명령에 연결할 파이프
  3. 충돌이 있을 경우 3자 병합을 통해 해결해야 합니다.
  4. apply(또는 merge)가 성공하면 방금 적용된 스테이시 항목이 삭제됩니다.

왜 없는건지 궁금합니다.-f(강제) 옵션git stash pop위의 외줄과 똑같이 행동해야 합니다

그 사이에 이 원라이너를 깃 별칭으로 추가할 수 있습니다.

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

지적해주신 @Sam Hassler 감사합니다.-33-way 병합을 통해 직접 충돌을 해결할 수 있는 매개 변수입니다.

저는 이런 식으로 합니다.

git add -A
git stash apply

다음(선택 사항):

git reset

원하는 스테이시를 패치 파일로 내보내고 수동으로 적용하여 현재 변경 내용을 스테이시할 필요 없이 이 작업을 수행할 수 있습니다.

예를 들어, 지원하고 싶다고 말합니다.stash@{0}더러운 나무에게:

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

    git stash show -p stash@{0} > Stash0.patch
    
  2. 변경사항을 수동으로 적용합니다.

    git apply Stash0.patch
    

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

git reset으로 작업 디렉토리를 정리하거나 변경사항을 커밋하거나 현재 변경사항을 저장하려면 다음을 시도합니다.

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

이렇게 하면 현재 변경 내용이 저장된 다음 스택에서 두 번째 스택이 팝업됩니다.

Mathias의 해결책은 확실히 A에 가장 가깝습니다.git stash pop --force(그리고 정말로, Gitdevs 여러분, 이 옵션을 이미 얻읍시다!)

그러나 Git 명령만 사용하여 동일한 작업을 수행하려면 다음을 수행할 수 있습니다.

  1. git commit -a -m "Fixme"
  2. git stash pop
  3. git commit -a --amend
  4. git reset HEAD~

다시 말해, 현재의 변경 사항에 대해 (절대로 적용하지 않을) 커밋을 수행합니다.작업 공간이 깨끗해졌으니, 숨김을 터뜨리십시오.이제 이전 커밋에 대한 수정사항으로 숨겨진 변경사항을 커밋합니다.이 작업을 완료하고 한 번의 커밋("Fixme")으로 두 가지 변경 사항을 모두 결합했습니다.git reset(--soft것은 아니다.--hard따라서 실제로 손실되는 것은 없습니다. 체크아웃을 "커밋 전에 하나"로 변경하면 이제 완전히 커밋되지 않은 변경사항이 두 개 모두 있습니다.

편집

3단계를 완전히 건너뛸 수 있다는 사실을 깨달았을 뿐입니다.

  1. git commit -a -m "Fixme"
  2. git stash pop
  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 complete와 함께 나오는 약간의 장황함을 좋아합니다.)

"더러운" 트리에 스테이시를 적용할 수 있습니다.git add당신이 한 모든 변화를 무대에 올려 나무를 치우는 것입니다.그러면 가능합니다.git stash pop그리고 숨겨진 변경사항을 적용합니다. 문제없습니다.

수정되었지만 커밋되지 않은 파일이 있습니다.둘 중 하나:

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

또는 변경 내용을 저장하려면 다음을 수행합니다.

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

저도 같은 문제가 있었는데 변경된 파일이 전혀 없었습니다.알고 보니 주변에 있던 인덱스.lock 파일이 있었어요삭제하면 문제가 해결됩니다.

대부분의 파일을 작동시킬 수 없었습니다. 어떤 이유에서인지 파일에 로컬 변경사항이 있다고 항상 생각합니다.은닉처를 적용할 수도 없고 패치도 적용되지 않을 겁니다.checkout그리고.reset --hard를 나뭇가지로 하는 것이 효과가 있었어요. 마침내 작동한 것은 그 창고를 가지로 저장하는 것이었습니다.git stash branch tempbranchname, 그런 다음 일반 분기 병합을 수행합니다.git checkout master그리고.git merge tempbranchname. http://git-scm.com/book/en/Git-Tools-Stashing 에서:

스테이징된 변경 사항을 다시 테스트하는 더 쉬운 방법을 원한다면 git stash 분기를 실행할 수 있습니다. 이 분기를 통해 새 분기를 생성하고 작업을 스테이징할 때 사용했던 커밋을 확인한 다음 작업을 해당 분기에 다시 적용한 다음 성공적으로 적용되면 스테이징을 삭제합니다.

그것이 제게 문제없이 작용한 문제에 대한 저의 의견입니다.

git stash show | patch -p1

물론 그것은 부분적으로 외부의 명령에 의존합니다.gits 패밀리.

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

반응형