은닉에 대한 Git diff


답변:


1871

가장 최근의 숨김을 확인하십시오.

git stash show -p

임의의 숨김을 참조하십시오.

git stash show -p stash@{1}

로부터 git stash맨 :

기본적으로이 명령은 diffstat를 표시하지만 git diff로 알려진 형식 (예 : git stash show -p stash @ {1})을 사용하여 두 번째 최신 숨김을 패치 형식으로 표시합니다.


72
stash@{0}기본값입니다. 이전 보관소를 보려면 인수 만 필요합니다.
Cascabel

52
권리. 나는 단지 그것 이외의 다른 은신처를 보는 방법을 분명히하기 위해 단지 그것을 제공했다 {0}.
Amber

74
이것은 숨김과 현재 작업 디렉토리 사이의 차이를 나타내지 않지만 숨김과 원래 부모 사이의 차이를 표시합니다. 권리? 맨 페이지에서 : "숨김 상태와 원래 부모 사이의 차이로 숨김에 기록 된 변경 사항을 표시하십시오."
Magne

14
@Amber-사실, 현재 작업중 인 트리가 더러워지면 중요하고 조금 더 복잡합니다. 나는 그 각도에서 그것을 얻었고 아래 답변에서 공유하는 절차를 찾았습니다.
Magne

6
무엇 -p을 의미합니까?
Gerald

308

가장 최근 숨김을 보려면 :

git stash show -p

임의 숨김을 보려면

git stash show -p stash@{1}

또한 git diff를 사용하여 숨김을 분기와 비교합니다.

당신이 사용할 수있는:

git diff stash@{0} master

지점 마스터와 비교 한 모든 변경 사항을 볼 수 있습니다.


또는 다음을 사용할 수 있습니다.

git diff --name-only stash@{0} master

변경된 파일 이름 만 쉽게 찾을 수 있습니다.


10
이것은 특정 질문에 대한 답변이 아닙니다. 마스터에서 숨김을 생성 한 경우 (나중에 작업을 저장하기 위해) 마스터에서 다른 작업에 대한 커밋을 수행 한 다음 수행 git diff stash@{0} master하면 현재 마스터 (스 태시 후 마스터에서 수행 된 작업 포함)에 대한 숨김을 얻습니다. 숨김이 변경 될 파일 / 줄이 아니라 질문에 대한 내용입니다.
Tom De Leu

52
정확한 질문에 대한 답변이 아니더라도 질문에 답변 해 주셔서 감사합니다. 더 많은 정보를 제공했으며 지점과 비교하려는 다른 지점 사이에 차이점을 얻는 방법을 아는 것이 좋습니다. 나는 또한 --name-only flag :)를 배우는 것을 좋아했습니다.
Rebekah Waterbury

6
이를 통해 맞춤형 diff 뷰어를 사용하여 차이점을 확인할 수도 있습니다.git difftool --tool=... stash@{0} HEAD
Andre Holzner

9
@TomDeLeu 좋은 관찰과 중요한 포인트. 숨김 항목을 부모 항목과 비교하려면 다음과 같이 작동합니다.git diff stash@{0}^ stash@{0}
erikprice

1
또한 파일 이름 git diff stash@{0} master -- filename을 추가하여 특정 파일을 변경할 수 있습니다.
David

104

보관 된 변경의 기반이되는 분기가 그 동안 변경된 경우이 명령이 유용 할 수 있습니다.

git diff stash@{0}^!

이것은 숨김을 기반으로 한 커밋과 비교합니다.


그래서 좋은 나는 별명을 추가했습니다 ~/.gitconfig:laststash = diff stash@{0}^!
sbeam

5
퍼펙트 페어 : git difftool stash^!커밋에 git difftool stash HEAD대한 마지막
스태프

17
나와 같았고 ^를 본 적이없는 사람들을 위해! 전에 : 커밋 ^! 범위 지정자입니다.이 커밋은 있지만 부모는 없습니다.
Jonathan Gawrych

"git diff stash @ {0} ^!" "git diff stash @ {0} ^ stash @ {0} ~ 1 ^ stash @ {0} ~ 2 ......."로 요약되지만 git diff는 2 개의 커밋 만 수행하므로 숨김 사이의 diff를 표시합니다. @ {0} 및 ^ stash @ {0} ~ 1이며 2 차 커밋 시작시 ^가 다르지 않으며 git은 무시합니다.
나가 키란

선호하는 diff 도구 (Beyond Compare 물론!)를 사용할 수 있도록이 버전을 선호합니다. 이것은 위의 주석 "git diff stash @ {X} ^ stash @ {X}"에서 언급 된 대안과는 달리 원래의 질문이라고 생각되는이 숨김의 변화를 보여줍니다.
user107172

44

작업 트리가 더러 우면 먼저 더티 작업 트리를 커밋 한 다음 스 태시와 비교하여이를 스 태시와 비교할 수 있습니다. 나중에 더티 작업 트리를 사용하여 커밋을 취소 할 수 있습니다 (커밋 로그에 더티 커밋을 원하지 않을 수도 있음).

다음 방법을 사용하여 두 스 태쉬를 서로 비교할 수 있습니다 (이 경우 스 태쉬 중 하나만 처음에 팝).

  • 더러운 작업 트리를 커밋하십시오.

    git add .
    git commit -m "Dirty commit"
    
  • 커밋으로 숨겨 놓으십시오.

    git diff HEAD stash@{0}
    
  • 그런 다음 커밋을 되돌리고 작업 디렉토리에 다시 넣을 수 있습니다.

    git reset --soft HEAD~1
    git reset .
    

이제 당신은 더러워진 나무를 숨겨 놓았으며, 처음 있던 곳으로 돌아 왔습니다.


이것을 할 수있는 방법이 있습니까, 숨김 상태의 파일에 의해 변경되는 파일의 차이점 만 볼 수 있습니까?
lagweezle

2020에는 이 방법이 훨씬 간단합니다. 내 최신 답변을 확인하십시오 .
David Deprost

흥미 롭습니다 git stash show -l . 작업중 인 (더러운) 사본과 최신 숨김을 비교합니까? 얻지 않고 어떻게 사용 error: switch l requires a value합니까?
마그네

예, 실제로 (더러워진) 작업 복사본과는 다릅니다. 을 입력하면됩니다 git stash show -l. 왜 그것이 당신을 위해 작동하지 않는지에 관해서는, 당신이 git의 이전 버전에있을 것이라고 추측 할 수 있습니까? git v2.20.1을 사용 중이며 오류없이 완벽하게 작동합니다.
David Deprost

25

@Magne의 답변 은 질문에 대한 가장 유연하고 유용한 해석에 대답 하는 유일한 (매우 늦은) 날짜이지만 필요한 것보다 상당히 복잡합니다. 커밋하고 재설정하는 대신 작업 복사본을 숨기고 비교 한 다음 고정 해제하십시오.

git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop

즉, 작업 폴더 변경 사항을 임시 스택의 최상위 스택 (stash @ {0})으로 만들고 원래의 최상위 스택을 아래로 이동하여 (stash @ {1}) 숨김 스택의 상단과 작업 폴더의 차이점을 보여줍니다. ) 그런 다음 '새 세트'위치에서 원래 상단을 사용하여 비교하여 현재 작업 위에 적용했을 때의 변경 사항을 확인할 수 있습니다.

"하지만 현재 작업이 없다면 어떻게해야합니까?" 그렇다면 당신은 정상적인 지루한 경우에 있습니다. @ Amber의 답변을 사용하십시오.

git stash show

또는 @czerasz의 답변

git diff stash@{0}

어쨌든 스 태싱 및 스 태싱이 빠르고 쉽다는 것을 인정하십시오. 변경 사항을 스 태싱하고 검사하십시오. 현재 원하지 않는 경우 버립니다 (현재 색인 / 작업 폴더 변경). 그게 다야

git stash apply
git diff
git reset
git checkout

3
이 간단한 접근 방식 (스 태쉬 한 후 다른 숨김과 비교)은 안전하고 이해하기 쉽습니다. 일부 사용 사례의 경우git stash save -u
mleonard

19

이것은 git 버전 1.8.5.2에서 작동합니다.

git diff stash HEAD

2
오해의 소지가 있습니다! 문제는 : 비스 태딩 변경 사항이 현재 작업 트리에 미치는 영향을 어떻게 알 수 있습니까? 이것은 스 태쉬와 HEAD 사이의 차이점을 보여줍니다 git stash apply.
MikeJansen

"적용하기 전에 어떤 변화가 있을지 알고 싶습니다!"라는 질문에 대한 자세한 내용을 읽으십시오. 이에 대한 빠른 답변을 제공하고 있습니다.
yerlilbilgin

또한 다른 모든 답변이 현재 헤드 (또는 작업 세트)를 숨김과 비교하는 방법에 대해 알 수 있습니다. 왜 내 답변 만 오해의 소지가 있습니까? 그건 불공평 해.
yerlilbilgin

@yerlilbilgin 아래 답변에 대한 제 답변을 참조하십시오.
MikeJansen

기본적으로 HEAD를 생략 할 수 있습니까?
Al.G.

10

작업 트리와 숨김에서 파일을 비교하려면 아래 명령을 사용하십시오.

git diff stash@{0} -- fileName (with path)

9

diff 도구가있는 경우 (비교를 넘어서)

git difftool stash HEAD

1
오해의 소지가 있습니다! 문제는 : 비스 태딩 변경 사항이 현재 작업 트리에 미치는 영향을 어떻게 알 수 있습니까? 이것은 스 태쉬와 HEAD 사이의 차이점을 보여줍니다 git stash apply.
MikeJansen

1
이것이 잘못되었다고 생각되면 다른 모든 답변을 확인하십시오. 그건 불공평 해!
yerlilbilgin

1
같은 주석을 다른 답변에 복사하여 오도 된 것처럼 들었습니다 (거의 동일한 답변). 이미 비슷한 의견을 가진 다른 답변들도 혼자 남았습니다. git stash의 작동 방식을 이해하면 HEAD에 대한 숨김을 확산시키는 것이 적용되는 것이 아니라는 것을 알 수 있습니다 (OP가 요구하는 것). 실제 "스 태쉬 (stash)"는 숨김 커밋과 이전 커밋 사이의 차이입니다. 이 패치는 HEAD에 적용됩니다. 따라서 OP가 무엇을 요청했는지 알고 싶다면 스 태쉬와 커밋 사이의 차이점을 표시해야합니다.
MikeJansen

1
이것은 다른 (필수없이) 긴 답변보다 더 직접적으로 질문에 대답하고 OP가 요청한 것을 정확하게 제거 HEAD합니다. HEAD를 제거하기 위해 @yerlilbilgin의 대답을 수정할 수는 있지만 git을 사용하는 사람은 그 부분을 알아낼 수 있으며 대답을 길게하면 읽을 수 없게됩니다. @yerlibilgin에 대한 책임은 없습니다.
Sridhar Sarnobat

4

아무것도 움직이지 않고이 작업을 수행하는 한 가지 방법은 patchgit diff를 읽을 수 있다는 사실을 활용하는 것입니다 (기본적으로 통합 diffs)

git stash show -p | patch -p1 --verbose --dry-run

패치가 일반적으로 수행하는 작업에 대한 단계별 미리보기가 표시됩니다. 이것에 대한 추가 이점은 어떤 이유로 든 수정하기 전에 커밋을 종료하고 계속 진행하여 --dry- 자세한 지침을 실행하고 따르십시오.


2

나는이 스레드와에서 배운 것을 결합 이 하나의 내가 "숨김 안에 무엇인지"를 참조 할 때, 내가 먼저 실행 :

git stash show stash@{0}

수정 된 파일이 표시됩니다. 그런 다음 difftool에서 멋진 시각적 차이를 얻으려면 다음을 수행하십시오.

git difftool --dir-diff stash@{0} stash@{0}^

주어진 숨김에 대해 부모와의 모든 차이점을 한 번에 표시합니다.

Meld~/.gitconfig 등을 사용하여 diff 도구를 구성 할 수 있습니다 .

...
[diff]
    tool = meld

1

FWIW 이것은 다른 모든 답변에 약간 중복 될 수 있으며 허용되는 답변과 매우 유사합니다. 하지만 어쩌면 누군가를 도울 것입니다.

git stash show --help필요한 모든 것을 줄 것입니다. 숨김 쇼 정보 포함

[<stash>] 표시

숨김 상태와 원래 부모 사이의 차이로 숨김에 기록 된 변경 사항을 표시하십시오. 아무 것도 주어지지 않으면 가장 최근의 것을 보여줍니다. 기본적으로이 명령은 diffstat를 표시하지만 git diff로 알려진 형식 (예 : git stash show -p stash @ {1})을 사용하여 두 번째 최신 숨김을 패치 형식으로 표시합니다. stash.showStat 및 / 또는 stash.showPatch 구성 변수를 사용하여 기본 동작을 변경할 수 있습니다.


1

그녀는 숨겨둔 목록

git stash list 
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2

따라서 숨김 번호를 얻고 다음을 수행하십시오.

넌 할 수있어:

 git stash show -p stash@{1}

그러나 diff를 원한다면 (이것은 숨김을 표시하는 것과 다릅니다.이 대답을 쓰는 이유입니다. Diff분기의 현재 코드를 고려하고 show적용 할 내용을 보여 주십시오 )

당신이 사용할 수있는:

git diff stash@{0}

또는

git diff stash@{0} <branch name>

또 다른 흥미로운 일은 :

git stash apply
git stash apply stash@{10}

이렇게하면 숨김을 목록에서 제거하지 않고 적용 할 수 있습니다. git checkout .변경 사항을 제거하거나 목록에서 숨김을 제거 할 수 있습니다 git stash drop stash@{10}.

여기에서 내가 사용하는 것이 좋습니다 적이 git stash pop과의 조합을 사용 git stash apply하고 git stash drop잘못된 지점에 은닉을 적용하면 ... 물론 가끔 코드를 복구하기가 어렵습니다.


1

(/ 머리는 로컬 작업 트리 / 부모 커밋 커밋) 당신이 마리화나를 비교하려는 작업에 따라 사용할 수있는 여러 가지 명령은 거기에 실제로있는 사이 좋은 오래된 git diff, 그리고 더 구체적으로 git stash show:

╔══════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Compare stash with ↓ ║ git diff                      ║ git stash show    ║
╠══════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Local working tree   ║ git diff stash@{0}            ║ git stash show -l ║
║----------------------║-------------------------------║-------------------║
║ Parent commit        ║ git diff stash@{0}^ stash@{0} ║ git stash show -p ║
║----------------------║-------------------------------║-------------------║
║ HEAD commit          ║ git diff stash@{0} HEAD       ║   /               ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝

언뜻 git stash show보기에 사용자에게 친숙해 보이지만 git diff실제로는 초점이 다른 diff에 파일 이름을 지정할 수 있다는 점에서 더 강력합니다. zsh git plugin 에서 이러한 모든 명령에 대한 별명을 개인적으로 설정했습니다 .

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