특정 파일 만 숨기는 방법?


385

나는 변화를 막았다. 이제 숨김 파일에서 일부 파일 만 해제하고 싶습니다. 어떻게해야합니까?


4
나는 전체 숨김을 적용해야한다고 생각하지만 선택적으로 다시 숨길 수 있습니다.
Richard

4
@AbdouTahiri 은닉에 무엇이 문제입니까?
alex

32
@AbdouTahiri Uhhhh .. git stash는 합법적 인 기능이며 매우 유용합니다. 매일 사용합니다. 동료가 무언가를 검토해야하지만 복잡한 변경 작업을 진행하고 있다고 가정 해 보겠습니다. 깨진 코드 더미를 커밋하지 않아서 분기를 전환 할 수 있습니다. 나는 숨기고, 가지를 바꾸고, 검토하고, 다시 바꾸고, 불안정하게 할 것입니다. git stash가 "권장되지 않는" 사람 또는 이유 에 대해 자세히 설명하고 싶습니까? 그냥 있기 때문에 당신의 자식 숨김 역사가 뭉개지 읽기 어려운되지 평균 모두의를 elses는 않습니다. 지저분한 깃 숨김 세트는 Git의 결함이 아닌 나쁜 워크 플로우입니다.
dudewad

6
@alex 아무것도 없습니다. 자식 숨김에는 문제가 없습니다. 계속 사용하십시오.
dudewad

답변:


460

아래 에서 언급 하고 " git stash에서 단일 파일 (또는 파일의 변경 사항)을 추출하는 방법은 무엇입니까? "에 자세히 설명되어있는 것처럼 사용 git checkout하거나 git show특정 파일을 복원 할 수 있습니다 .

git checkout stash@{0} -- <filename>

즉 않습니다 덮어 쓰기 filename : 메이크업 확실히 당신은 로컬 수정을하지 않았거나 병합 할 수 있습니다 대신 은닉 파일을 .

( Jaime M.의 설명 에 따르면 특수 문자를 이스케이프 해야하는 tcsh와 같은 특정 쉘의 경우 구문은 다음과 같습니다. )git checkout 'stash@{0}' -- <filename>

또는 다른 파일 이름으로 저장하려면 :

git show stash@{0}:<full filename>  >  <newfile>

(여기서는 <full filename>프로젝트의 최상위 디렉토리에 상대적인 파일의 전체 경로 이름입니다 (생각 :) stash@{0}.

유서의견에서 제안 합니다 :

해당 파일에서 적용 할 변경 사항을 수동으로 선택하려는 경우 :

git difftool stash@{0}..HEAD -- <filename>

Vivek은 다음 과 같이 주석을 추가합니다 .

" git checkout stash@{0} -- <filename>"는 숨김이 수행 된 시점의 파일 버전을 복원하는 것처럼 보입니다. 해당 파일에 대한 숨김 변경 사항은 적용 되지 않습니다 .
후자를하려면 :

git diff stash@{0}^1 stash@{0} -- <filename> | git apply

(같은 주석 에 의해 peterflynn , 당신은해야 할 수도 있습니다 | git apply -p1(하나를 제거, 어떤 경우에는 p1) 전통은 diff 경로에서 선도적 인 슬래시)


주석이 달린 "unstash"( git stash pop) :

  • 색인에 보관할 항목을 추가하십시오 ( git add).
  • 나머지를 숨기십시오 : git stash --keep-index

마지막 요점은 다른 파일을 숨기면서 파일을 유지할 수있게하는 것입니다.
" 변경된 여러 파일 중 하나의 파일 만 숨기는 방법 "에 설명되어 있습니다.


5
git stash pop파일 충돌로 인해 작동하지 않으면 작동하지 않습니다 . Balamurugan A의 대답은 그 경우 나를 위해 속임수를 사용했습니다.
Andrey

1
해당 파일에서 적용 할 변경 내용을 수동으로 선택하려는 경우 git difftool stash @ {0}을 사용할 수 있습니다
..HEAD-

5
"git checkout stash @ {0}-<filename>"은 숨김이 수행 된 시간을 기준으로 파일 버전을 복원하는 것처럼 보입니다. 해당 파일에 대한 숨김 변경 사항이 적용되지 않습니다. 후자를하기 위해 : "git diff stash @ {0} ^ 1 stash @ {0}-<filename> | git apply"
Vivek

1
@JaimeM. 감사합니다. 더 많은 가시성을 제공하기 위해 귀하의 의견을 답변에 포함 시켰습니다.
VonC

1
그 가정 unstash수단을 pop아마 것 대부분의 경우,이 부분적으로 만 질문에 대한 답을 나에게 보인다. 그런 다음 나머지 변경 사항을 표시 할 때 나중에 충돌 및 / 또는 혼란을 피하기 위해 숨김에서 선택적으로 적용된 조각을 어떻게 제거합니까?
DylanYoung

115
git checkout stash@{N} <File(s)/Folder(s) path> 

예 : 마지막 숨김에서 ./test.c 파일 및 ./include 폴더 만 복원하려면

git checkout stash@{0} ./test.c ./include

12
이것이 정답입니다! 특정 파일의 숨김 변경 사항 만 적용하는 한 줄 명령은 매력처럼 작동합니다!
레벨

1
"git diff stash @ {N} ^ 1 stash @ {N}-<filename> | git apply"
Vivek

이것은 나에게도 효과적입니다. 숨김에서 사용하는 데 필요한 파일을 선택적으로 체크 아웃하면 완료됩니다. 나는 이것에 갇혀 있었고 -a, 은신처를 만드는 동안 깃발을 사용했습니다 .
Rajeev Ranjan

1
@ 4levels "적용된 변경 사항 적용"이 발생하지 않는다고 생각합니다. "스 태쉬 사본으로 무엇이든 덮어 쓰기"가 일어난 것 같습니다.
msouth

35

VonC의 대답은 아마도 당신이 원하는 것이라고 생각하지만 선택적인 "git apply"를 수행하는 방법이 있습니다.

git show stash@{0}:MyFile.txt > MyFile.txt

4
경우에 따라 원하는 작업 일 수도 있지만 작업중인 디렉토리 변경 사항과 병합하지 않고이 명령이 덮어 쓰기에 주의하십시오 .
Rhubbarb

이것은 단지 숨김 파일에만 존재하고 checkout아무것도 신경 쓰지 않는 파일을 복사하고 싶기 때문에 저에게 효과적입니다 .
Tom Russell

1
Windows PowerShell의 경우 : git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt-PS가 중괄호를 특수하게 해석하지 않으려면 백틱이 필요하며 PS 연산자는 기본적으로 UTF-16 (실제 UCS-2)으로 설정 되어 있기 때문에sc 필요 합니다. @Balamurugan A의 대답은 이러한 문제로 고통받지 않습니다. >
Ian Kemp

19

먼저 모든 스 태쉬를 나열하십시오.

git stash list

stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'

그런 다음 숨김에있는 파일을 표시하십시오 (숨김 1을 선택하십시오).

git stash show 1 --name-only

//Hint: you can also write
//git stash show stash@{1} --name-only

 ajax/product.php
 ajax/productPrice.php
 errors/Company/js/offlineMain.phtml
 errors/Company/mage.php
 errors/Company/page.phtml
 js/konfigurator/konfigurator.js

그런 다음 원하는 파일을 적용하십시오.

git checkout stash@{1} -- <filename>

또는 전체 폴더 :

git checkout stash@{1} /errors

없이도 작동 --하지만 사용하는 것이 좋습니다. 게시물을 참조하십시오 .

옵션 해석을 중지하고 다음의 모든 인수를 문자 그대로 처리하기위한 신호로 이중 하이픈을 인식하는 것도 일반적입니다.


1
이 편집으로 더 명확합니다. +1
VonC

1
나는 여러 가지 방법을 시도했고이 방법은 내가 필요한 방법이었다. git stash pop추적되지 않은 파일에 오류 가 발생하는 문제에 직면했습니다 . 감사합니다.
Ramin Firooz

10

당신이 git stash pop(충돌하지 않고) 적용되면 숨김을 제거합니다. 그러나 git stash apply패치를 숨김 목록에서 제거하지 않고 적용합니다. 그런 다음 원치 않는 변경 사항을 되돌릴 수 있습니다.git checkout -- files...


2
이 게시물의 충돌 부분을 명확히하기 위해 충돌이있는 경우 git stash pop수동으로 수정해야하며 숨김이 제거되지 않습니다.
Thomas McCabe

6

한 가지 더 방법 :

git diff stash@{N}^! -- path/to/file1 path/to/file2  | git apply -R

2
이것이 유일한 정답 IMO입니다. 사용 checkout또는 것은 show맹목적으로 단지 변경 사항을 적용하지 않고 파일을 덮어 쓰게됩니다. "하나 더 방법"은 과소 평가입니다.
camuncctious

1
path/to/file2작업 공간의 동일한 파일과 비교하여 원하는 것을 얻지 못했습니다 . 두 번째 길을 떠나면 나에게 잘 작동합니다. - -R옵션을 사용하여 오류 메시지가 나타납니다 ( "패치를 역으로 적용", 숨김 버전을 패치하려고 합니까 ?!). 그래서 내 작업 버전은 다음과 같습니다 git diff stash@{N}^! -- path/to/file | git apply -.
ThomasH

"패치 실패"? 3 방향 병합을 시도하십시오. ...| git apply -3 -
존 미

6

Windows 사용자의 경우 중괄호는 PowerShell에서 특별한 의미를 갖습니다. 작은 따옴표로 묶거나 백틱으로 이스케이프 처리 할 수 ​​있습니다. 예를 들면 다음과 같습니다.

git checkout 'stash@{0}' YourFile

그렇지 않으면 오류가 발생할 수 있습니다.

Unknown switch 'e'


3
이번 달에 가장 도움이되지 않은 사용자 메시지를 PowerShell에 표시했습니다.
holdenweb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.