git에서 숨김을 적용하지 않고 추적되지 않은 숨김 파일을 표시하는 방법이 있습니까?


100

을 실행하면 git stash -u추적되지 않은 파일을 숨길 수 있습니다. 그러나 추적되지 않은 파일은 git stash show stash@{0}. 숨김을 적용하지 않고 추적되지 않은 숨김 파일을 표시하는 방법이 있습니까?

답변:


121

추적되지 않은 파일은 숨김 커밋의 세 번째 부모에 저장됩니다. (이것은 실제로 문서화 아니지만, 꽤 분명하다에서 에 -u 기능, 787,513 ... 소개하는 커밋 하고 끝까지 설명서의 나머지git-stash 문구의 일을 ... 아니면 그냥 수행하여 git log --graph stash@{0})

다음을 통해 숨김의 "추적되지 않은"부분 만 볼 수 있습니다.

git show stash@{0}^3

또는 다음을 통해 "추적되지 않은"트리 자체 만 :

git show stash@{0}^3:

또는 다음을 통해 트리의 특정 "추적되지 않은"파일 :

git show stash@{0}^3:<path/to/file>

안타깝게도 모든 staged + unstaged + untracked와 "current"상태 간의 차이점을 요약 할 수있는 좋은 방법은 없습니다. 즉 : git show stash@{0}추적되지 않은 파일을 포함하도록 만들 수 없습니다. 라고하는 숨김 커밋 자체의 트리 개체 stash@{0}:에는 세 번째 "무단계"부모의 변경 내용이 포함되지 않기 때문입니다.

이는 보관함이 다시 적용되는 방식 때문입니다. 추적 된 파일은 패치로 쉽게 적용 할 수있는 반면 추적되지 않은 파일은 이론상 "전체 파일"로만 적용 할 수 있습니다.


따라서 stash 커밋의 부모는 (1. Commit stash가 2. Index 3. Untracked working copy에 대해 만들어집니다), stash commit 자체에 추적 된 작업 사본이 포함되어 있습니까? git stash show작업 복사본과 # 1 ( git diff ${FLAGS:---stat} $b_commit $w_commit$ b_commit이 # 1이고 $ w_commit이 숨김 커밋 인 git-stash.sh :의 관련 코드) 사이의 차이점을 보여주는 것처럼 보입니다 . git stash show# 3도 포함 하는 내장 방법이 있습니까?
Max Nanasy

당신이 말했듯이, 나는 숨김의 단일 요약보기를 얻는 방법을 찾지 못했지만, 당신은 하나의 명령으로 완전한 정보를 볼 수 있습니다 : git log --graph --topo-order -m -u. matthewlmcclure.com/s/2014/01/10/…
Matt McClure

4
실제로 해당 숨김에 추적 되지 않은 파일 이없는fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree. 경우 (하지만 그렇게 생각한 경우) 추악한 오류 ( )가 표시됩니다 .
Randall

2
@antak : 아니, git stash show않습니다 하지 (적어도 자식 2.7.4 마찬가지) 비 추적 파일을 보여줍니다
노 베르트 Bérci

1
참고 (2.13.2-linux) : git stash pop먼저 추적되지 않은 파일 복원을 시도한 다음 추적 된 파일 복원을 시도합니다. 후자의 작업이 실패하면 (예 : 충돌) 첫 번째 작업은 롤백되지 않습니다 (추적되지 않은 파일 숨김은 그대로 유지되지만 파일은 디스크에서 제거되지 않음). 충돌을 수정하더라도 다음 팝은 실패합니다. 어쨌든.
Marinos An

22

다음 명령을 사용하여 모든 숨김 커밋을 나열 할 수 있습니다.

git rev-list -g stash

스 태시는 HEAD의 3 방향 병합 커밋, 인덱스 및 추적되지 않은 파일의 부모없는 "루트"커밋으로 표시되므로 위의 출력을 다음으로 파이프하여 추적되지 않은 파일 스 태시를 나열 할 수 있습니다.

git rev-list -g stash | git rev-list --stdin --max-parents=0

위의 유용한 응용 프로그램 :

추적되지 않은 숨김 파일 만 표시

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat

물론 --stat파일의 내용을 보려면를 제거 하십시오.

특정 파일 찾기

git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>

추적되지 않은 파일 Grep

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>

모든 숨김의 모든 내용 나열

git rev-list -g stash | git rev-list --stdin | xargs git show --stat

10

숨김에있는 추적되지 않은 파일을 나열하려면 :

git ls-tree -r stash@{0}^3 --name-only

추적되지 않은 모든 파일 (콘텐츠 포함)의 전체 차이점을 표시하려면 :

git show stash@{0}^3

이 명령은 마지막 (가장 최근) 숨김을 읽습니다. 이전 보관함의 경우 "stash @"뒤의 숫자를 stash@{2}늘립니다 ( 예 : 마지막 보관함의 두 번째 보관함).

이유이 작품 즉 git stash병합 같이 참조 될 수있는 각각의 은닉, 커밋 만들고 stash@{0}, stash@{1}이를 제 부모가 은닉시의 HEAD 커밋 등 번째 상위 추적 파일에 대한 변경을 포함하고, 세 번째 (존재하지 않을 수 있음)는 추적되지 않는 파일의 변경 사항입니다.

이것은 "토론"맨 페이지에 부분적으로 설명되어 있습니다.


5

숨김에있는 모든 파일 (추적 및 추적되지 않음)을 보려면이 별칭을 내 구성에 추가했습니다.

showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"

보려는 숨김에 대한 단일 인수 가 필요합니다. 여전히 두 개의 연속 목록에 표시됩니다.

if...fi부분은 bash는 인수를 변경 아무것도 전달되지 않은 경우 0으로 $ 1.


5

해결 방법 : 파일을 은닉하기 전에 스테이징 git stash show -p하면 예상대로 작동합니다.

git add .
git stash save

참고 : 이렇게하면 대화 형 부분을 추가하는 기능도 제공됩니다. 방법은 다음과 같습니다 .
주의 : 이전에 준비한 작업이 없는지 확인하십시오. 그렇지 않으면 구별 할 수 없습니다.
이것은 유용 할 수 있습니다.

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