git stash가 추가 된 파일을 덮어 쓰도록 강제


223

git에서 추적되지 않은 파일이 있습니다. 몇 가지 사항을 변경하여 커밋하고 싶었지만 수정하지 않은 파일을 먼저 체크인하지 않았다는 것을 깨달았습니다. 그래서 파일을 숨기고 수정되지 않은 버전을 추가했습니다.

그런 다음 숨김을 저장소에 적용하면 파일이 이미 추가되어 충돌이 발생합니다.

숨김을 적용하고 숨김의 버전이 저장소의 원본보다 우선적으로 사용되도록하려면 어떻게해야합니까?

감사


7
누군가 더 나은 것을 얻을 때까지 추악한 해결책 : git rm수행하기 전에 새 파일을 제거하십시오 git stash apply.
tom

그 역사를 잃지 않을까요? 수정되지 않은 버전을 추가 한 이유는 기록을 유지하기위한 것입니다.
Stefan

1
아닙니다. 역사를 잃지 않을 것입니다. 파일을 제거하면 작은 수정으로 파일을 다시 추가 한 다음 커밋 git하면 작은 수정으로 처리됩니다.
tom

답변:


364

git checkout대신에 사용하십시오 git stash apply:

$ git checkout stash -- .
$ git commit

현재 디렉토리의 모든 파일을 숨김 버전으로 복원합니다.


작업 디렉토리에 유지해야하는 다른 파일에 대한 변경 사항이있는 경우 다음과 같은 방법을 사용하십시오.

$ git merge --squash --strategy-option=theirs stash

인덱스에 변경 사항이 있거나 병합이 로컬 변경 사항이있는 파일을 만지면 git은 병합을 거부합니다. 개별 파일을 사용하여 숨김에서 체크 아웃 할 수 있습니다

$ git checkout stash -- <paths...>

또는 대화식으로

$ git checkout -p stash

이 중 어느 것도 내 유스 케이스에서 작동하지 않았습니다. 연구 결과 및 내 솔루션은 현재 stackoverflow.com/a/26685296/496046 -이 너무 @AlexanderBird을 상황을 해결한다
tremby

2
git checkout stash -- .이 명령은 내가 그것을 실행할 때 문자 그대로 아무 것도하지 않았습니다.
Rotsiser Mho

3
@RotsiserMho Git은 확인 메시지를 제공하는 데별로 좋지 않습니다. 아무것도하지 않았습니까? 나를 위해 잘 작동했습니다.
Sinjai

5
git checkout stash -- .변경 사항이 포함 된 최상위 폴더에서 실행해야했습니다 . 그렇지 않으면 명령을 실행 한 폴더에만 변경 사항이 적용되었습니다.
Leo

1
@ 레오 : 맞습니다. .현재 디렉토리를 지정 하기 때문입니다 (디렉토리를 변경하는 대신 다른 경로로 바꿀 수 있습니다). 더 명확하게하기 위해 답변을 업데이트했습니다.
tom

13

git stash show -p | git apply

그리고 git stash drop당신은 은닉 아이템을 드롭합니다.


2
참고 : 그렇지 않으면 당신은 얻을 것이다, 제대로 작동이에 대한 저장소의 루트에 있어야 .
Ruslan

@PengheGeng 보시다시피 NetEmmanuel
Hasan TBT

@Ruslan 내 레포의 루트에있는 동안 그것을 얻고 있습니다 🤔
Leo

6

git stash pop이 명령 을 강제로 실행 하려면

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

1

TL; DR :

git checkout HEAD path/to/file
git stash apply

긴 버전 :

덮어 쓰려는 커밋되지 않은 변경으로 인해이 오류가 발생합니다. 으로 이러한 변경 사항을 취소하십시오 git checkout HEAD. 을 사용하여 특정 파일에 대한 변경을 취소 할 수 있습니다 git checkout HEAD path/to/file. 충돌 원인을 제거한 후 평소처럼 신청할 수 있습니다.

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