자식 숨김에서 단일 파일 (또는 파일 변경)을 어떻게 추출합니까?


772

숨김 변경 세트를 팝하지 않고 git stash에서 단일 파일 또는 파일의 diff를 추출 할 수 있는지 알고 싶습니다.

누구든지 이것에 대한 제안 / 아이디어를 제공 할 수 있습니까?

답변:


1130

자식 숨김 맨 당신은 (그냥 "옵션"설명을 한 후, "토론"섹션에서) 읽을 수 있습니다 :

스 태시는 트리가 작업 디렉토리의 상태를 기록하는 커밋으로 표시되며 첫 번째 상위는 스 태시가 작성 될 때 HEAD의 커밋입니다.

따라서 숨김 (예 : stash@{0}첫 번째 / 맨 위 숨김)을 병합 커밋으로 취급하고 다음을 사용할 수 있습니다.

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

설명 : stash@{0}^1주어진 숨김의 첫 번째 상위를 의미하며, 위 설명에서 설명한대로 변경 사항이 무시 된 커밋입니다. stash@{0}/ refs/stash는 머지 커밋 이기 때문에이 형식의 "git diff"(두 개의 커밋 포함)를 사용 하며 git에게 어떤 부모를 비교할 것인지 알려 주어야합니다. 더 비밀스러운 :

$ git diff stash@{0}^! -- <filename>

작동해야합니다 ( "범위 지정"섹션 의 구문에 대한 설명 은 git rev-parse 맨 페이지를 참조하십시오 rev^!).

마찬가지로 git checkout 을 사용 하여 숨김 파일에서 단일 파일을 확인할 수 있습니다 .

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

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

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

또는

$ git show stash@{0}:./<relative filename> > <newfile>

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


stash@{0}쉘 확장으로부터 보호해야 할 수도 있습니다 ( 예 : "stash@{0}"또는) 'stash@{0}'.


8
이것은 매우 멋지다 ... 나는 당신의 대답을 읽을 때까지 숨김이 어떻게 작동했는지 실제로 이해 하지 못했다 . gitsh를 수행 할 때 git은 TWO 커밋을 저장합니다. 하나는 인덱스 상태와 다른 하나는 인덱스와 원래 HEAD 사이의 병합 인 작업 복사본 상태입니다. 이것은 숨김이있을 때 "gitk --all"로 저장소를 시각화 할 때 본 이상한 트리를 설명합니다.
Pat Notz

4
주로 git checkout 응용 프로그램이 내가하고 싶은 일을 수행하는 가장 좋은 방법이라고 생각합니다. 그러나 나는 호기심이 많고 git checkout의 맨 페이지를 다시 확인했습니다. 파일을 다른 위치에 놓을 수 없습니다. 이에 대한 참조는 stackoverflow.com/questions/888414/…
Danny

84
$ git checkout stash @ {0}-<filename>은 매우 유용합니다. 감사
중력

43
git checkout접근 방식 은 숨김 파일에서 정확한 파일을 복사합니다 git stash apply. 작업 디렉토리에있는 파일과 병합되지 않습니다 . (따라서 스 태쉬가 작성된베이스에서 변경 사항이 있으면 손실됩니다.)
peterflynn

4
위해서는 참고 git stash apply파일이 은닉 된 이후에 작업 트리에 수정 된 파일의 변경 내용을 병합하는, 작업 트리에서 해당 파일이 개최되어야한다. 자동 병합이 작동하려면 작업 사본과 병합 될 병합 사본에서 동일한 파일을 수정할 수 없습니다. 마지막으로 숨김 적용은 숨김에서 항목을 제거하지 않습니다 git stash pop.
Ville

46

git stash apply대신에 사용하면 git stash pop작업 트리에 숨김을 적용하지만 여전히 숨김을 유지합니다.

이 작업이 완료, 당신은 수 add/ commit파일이 당신이 원하는 다음 나머지 변경 내용을 다시 설정.


2
: 특정 숨겨 놓은 팝업 git stash pop stash@{0}(목록 은닉 변경 git stash list)
MrYoshiji

숨김 파일의 다른 파일이 병합 충돌을 일으키는 경우 git을 사용하여 원하는 파일을 커밋 할 수 없습니다. (
cambunctious

33

스 태쉬를 포함하여 모든 브랜치에서 변경 사항을 얻는 쉬운 방법이 있습니다.

$ git checkout --patch stash@{0} path/to/file

여러 부분으로 패치하려는 경우 파일 사양을 생략 할 수 있습니다. 또는 단일 파일에 대한 모든 변경 사항을 가져 오려면 패치 (경로는 아님)를 생략하십시오. 교체 0에서 숨김 번호 git stash list는 하나 이상있는 경우. 이와 같 으며 분기 간의 모든 차이점 diff을 적용 할 수 있습니다. 단일 커밋 / 스 태시에서만 변경 사항을 얻으려면를 살펴보십시오 .git cherry-pick --no-commit


이것은 숨김 파일에서 정확한 파일을 복사합니까, 아니면 병합합니까? 복사의 경우 숨김이 작성된 후 변경 사항이 있으면 변경 사항이 유실됩니다.
Danijel

2
@Danijel 읽기 git help checkout. --patch대화식 병합, 쉘에서 승인 한 모든 덩어리 (또는 e패치 를 제거하기로 선택한 경우 저장 한 모든 것 )를 적용합니다. 경로만으로 "모든 변경 사항"을 쓴 것처럼 파일을 덮어 씁니다.
Walf

1
약간의 개선 : git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")' -그런 다음 git applydiffat stash@{4}숨김과 부모 사이에서 변경된 파일 만 사용합니다.
마크

25

짧은 답변

전체 파일을 보려면 git show stash@{0}:<filename>

diff를 보려면 git diff stash@{0}^1 stash@{0} -- <filename>


1
나는 특정 파일에 대한 숨김을 보는 것에 관심이 없다고 생각합니다.
Amalgovinus

1
이것이 내가 찾던 것입니다. 그럼 당신은 대체 할 수 diff와 함께 difftool당신의 마음에 드는 외부 DIFF을 사용합니다.
Peet Brits

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

노트:

  1. "-" 와 파일 이름 매개 변수 뒤에 공백두십시오.

  2. 0 (0)을 특정 숨김 번호로 바꾸십시오. 숨김 목록을 얻으려면 다음을 사용하십시오.

    git stash list
    

Jakub Narębski의 답변을 바탕으로 -짧은 버전


11

" git show stash@{0}" 를 사용하여 숨김에 대한 diff를 얻을 수 있습니다 (또는 숨김 수에 관계없이 "git stash list"참조). 단일 파일의 diff 섹션을 쉽게 추출 할 수 있습니다.


2
나 같은 마음을 위해 더 간단합니다 : git show stash최상위 스 태쉬 (일반적으로 당신이 가진 유일한)를 보여주기 위해 사용 하십시오. 마찬가지로 현재 분기와 숨김 사이의 차이를로 표시 할 수 있습니다 git diff head stash.
Dizzley

5

비록 가장 좋은 것은 아니지만 이해하기위한 가장 간단한 개념은 세 개의 파일이 변경되었고 하나의 파일을 숨기고 싶다는 것입니다.

당신이 경우에 git stash, 그들 모두를 은닉하기 위해 git stash apply다시하고 다시을 가지고 git checkout f.c에 문제의 파일에 효율적으로 다시 설정합니다.

해당 파일 실행을 해제하려는 경우 a를 수행 한 git reset --hard다음 git stash apply다시 실행 git stash apply하여 숨김 스택에서 diff를 지우지 않는 사실을 이용하십시오 .


1

숨김 파일이 현재 버전과 병합되어야하는 경우 diff를 사용하여 이전 방법을 사용하십시오. 그렇지 않으면 파일 git pop을 숨김 해제 git add fileWantToKeep하거나 파일을 준비 git stash save --keep-index하고 무대에있는 것을 제외한 모든 것을 숨기는 데 사용할 수 있습니다 . 이 방법과 이전 방법의 차이점은 파일을 숨김에서 "팝핑"한다는 것입니다. 이전 답변 git checkout stash@{0} -- <filename>은 필요에 따라 유지됩니다 .


0

다음을 사용하여 숨김 파일의 변경 사항을 작업 트리에 적용하십시오.

git diff stash^! -- <filename> | git apply

git checkout숨김을 생성 한 후 파일에 대한 변경 내용을 잃지 않으므로 일반적으로 사용하는 것보다 낫습니다 .


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