은닉에 대한 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.