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


133

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

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

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

답변:


196

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

$ 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 stash show -p | git apply와 다른 가요 git stash apply?
Factor Mystic

1
Jo Factor git stash apply는 작업 복사본이 더러운 경우 숨김 변경 사항을 적용하지 않습니다. 따라서 git stash show -p | git apply일종의 강제 숨김이 적용되는 것을 볼 수 있습니다.
muhqu

1
도움이되지 않지만 도움이됩니다 : git reset HEAD 및 그 후에 변경 사항을 취소하십시오.
Roger Alien

4
파일 중 하나에 대해 "오류 : 패치 실패 ... 패치가 적용되지 않습니다"가 표시됩니다. 병합 충돌이 발생하기를 바랍니다.
Aleksandr Dubinsky

1
이 솔루션은 저에게 효과가 없었으며 error: <file> does not match index수정 된 모든 파일에 실패했습니다 . 그러나 다른 솔루션이 효과가있었습니다.
silvenon

57

나는 이런 식으로합니다 :

git add -A
git stash apply

그런 다음 (선택 사항) :

git reset

2
+1! 패치를 생성하거나 커밋을 수정하는 다른 솔루션보다 간단하며 변경 사항이 제대로 병합 될 때까지 로컬 변경 사항을 적용된 숨김 변경 사항과 안전하게 격리시킵니다.
peterflynn

나는 오류 "... 이미 더 체크 아웃 ... 숨겨 놓은에서 추적 된 파일을 복원 할 수 없습니다 존재"
알렉산드르 Dubinsky

2
내가 사용하는 git add -u같은 인 -A은 비 추적 파일을 추가하지 않습니다 제외.
Brad Cupit

9

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

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

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

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

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

    자식 적용 Stash0.patch

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


이것은 디렉토리에서 리팩토링을 수행하고 (제거하고 이름이있는 심볼릭 링크를 만든 경우) 실용적이고 실행 가능한 것입니다. 힘내는 작업 복사본 변경 내용을 알 수 없었습니다.
yclian

1
이것은 훌륭하게 작동했습니다. 작업 트리가 깨끗하다고 ​​확신하더라도 숨김을 적용 할 수 없었습니다.
Shiki

예, 이진 파일에 대한 줄을 제거해야했습니다.
Dorian

8

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

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

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


5
그러나이 사람은 두 개의 스 태쉬가 적용되기를 원합니다!
Elazar Leibovich

@Elazar 당신은 질문을 읽고 있습니다. OP는 단순히 이전 숨김을 적용하려고합니다. 현재 변경 사항을 유지해야하는 것이 정확하면 솔루션을 반복 할 수 있습니다 (팝, 커밋, 반복).
William Pursell

나는 그가 둘 다 헌신하지 않기를 원한다고 생각한다. 그러나 그는 다시 두 번 커밋하고 단일 커밋으로 스쿼시 할 수 있습니다.
Elazar Leibovich

나는 오류 "... 이미 더 체크 아웃 ... 숨겨 놓은에서 추적 된 파일을 복원 할 수 없습니다 존재"
알렉산드르 Dubinsky

6

Mathias의 솔루션은 git stash pop --force와 가장 가까운 솔루션입니다 (실제로 citmon Git devs,이 옵션을 이미 사용하십시오!)

그러나 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 ~

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


4

오늘 내가했던 것처럼 당신이 이런 상황에 처해 있다면이 답변들 중 어느 것도 실제로 효과가 없습니다. git reset --hard내가 한 사람 수에 관계없이 아무 데나 데려갔습니다. 내 대답 (어떻게 든 공식적이 아니었다) :

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

1
고마워요 지금 당장 Git이 로컬 리포지토리에서 이상하게 동작하는 방식에 좌절했습니다.
yclian은

4

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 완료와 관련하여 자세한 정보를 원합니다.)


3

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


2

수정되었지만 커밋되지 않은 파일이 있습니다. 어느 한 쪽:

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

1
@ MikeCooper-커밋하기 전에 추가하려는 모든 것을 추가해야한다고 생각합니다.
sscirrus

0

나는 같은 문제가 있었지만 git은 0으로 변경된 파일을 가지고있었습니다. 내가 누워있는 index.lock 파일이 있다는 것이 밝혀졌습니다. 삭제하면 문제가 해결되었습니다.


0

나는 이것들의 대부분을 작동시킬 수 없었다. 어떤 이유로 든 항상 파일에 로컬 변경 사항이 있다고 생각합니다. 나는 은닉을 적용 할 수 없습니다, 패치가 적용되지 않습니다 checkoutreset --hard실패합니다. 무엇 결국 일을하는 것은 분기로 숨김을 저장했다 git stash branch tempbranchname, 다음 일반 지점 병합을 수행 : git checkout mastergit merge tempbranchname. 에서 http://git-scm.com/book/en/Git-Tools-Stashing :

숨김 변경 사항을 다시 테스트하는 더 쉬운 방법을 원하면 git stash 브랜치를 실행하여 새 분기를 작성하고 작업을 숨김 상태로 만들 었는지 확인하고 작업을 다시 적용한 다음 삭제합니다. 그것이 성공적으로 적용되면 숨어

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.