준비된 변경 사항을 어떻게 표시합니까?


2138

나는 몇 가지 변화를 저질렀다. 다음 커밋을 위해 준비된 모든 파일의 차이점을 어떻게 알 수 있습니까? git status에 대해 알고 있지만 준비된 파일 이름뿐만 아니라 실제 diff를보고 싶습니다.

나는 것을보고 자식-DIFF (1) 매뉴얼 페이지를 말한다

자식 차이 [-옵션] [-] […]

이 양식은 인덱스 (다음 커밋의 스테이징 영역)와 관련하여 변경 한 내용을 확인하기위한 것입니다. 즉, 차이점은 인덱스에 추가하도록 git에 지시 할 있지만 여전히 그렇지 않습니다. git-add (1)을 사용하여 이러한 변경 사항을 준비 할 수 있습니다.

불행히도, 나는 이것을 이해할 수 없다. 별명을 만들 수있는 편리한 하나의 라이너가 있어야합니다.


76
git status -v작동합니다. 아래 답변을
VonC

3
@VonC 나는 이것을 항상 사용하지만 다음 less과 같이 파이프로 연결됩니다 . git status -v | less– 관리 가능한 덩어리 :)
Mr Office

답변:


2610

그냥 있어야합니다 :

git diff --cached

--cached의미는 현재에 대한 캐시 / 인덱스의 변경 (즉, 단계적 변경)을 나타 HEAD냅니다. --staged의 동의어입니다 --cached.

--staged--cached가리 키지 않고 HEAD단지에 대한 차이 만 HEAD있습니다. git add --patch(또는 git add -p)를 사용하여 커밋 할 것을 선택하면 --staged준비된 내용을 반환합니다.


35
파일 이름 만 원한다면 stackoverflow.com/a/4525025/255187git diff --name-only --cached 에서 게시물 당 다음을 수행하십시오.
Michel Hébert

4
각 파일에서 기본 시각적 차이 도구를 시작하는 git difftool --staged대신 이 옵션을 사용하십시오 git diff --staged. 다른 인수로 difftool대체 할 수도 있습니다 diff.
LightCC

그리고 git difftool --staged -d한 번에 하나의 파일이 아닌 시각적 도구로 두 디렉토리를 비교하는 데 사용할 수 있습니다 .
Robert Bernstein

이것은 답변으로 표시되어 있고 맨
앞에

그리고 단일 스테이지 파일에서 변경 사항을 보려면 다음이 작동합니다.git diff --cached -- <stagedfile>
ObviousChild

1604

간단한 그래픽은 이것을 명확하게합니다.

간단한 힘내 diffs

자식 차이

작업 디렉토리와 색인 사이의 변경 사항을 표시합니다. 변경된 사항을 표시하지만 커밋을 위해 준비되지 않았습니다.

자식 diff-캐시

인덱스와 HEAD (이 분기의 마지막 커밋) 사이의 변경 사항을 표시합니다. 이것은 인덱스에 추가되어 커밋을 위해 준비된 것을 보여줍니다.

git diff HEAD

작업 디렉토리와 HEAD (색인의 변경 사항 포함) 사이의 모든 변경 사항을 표시합니다. 커밋을 위해 준비되었는지 여부에 관계없이 마지막 커밋 이후의 모든 변경 사항이 표시됩니다.

또한 :

365Git 에 대한 자세한 내용이 있습니다.


8
이것은 순진합니다. (보통 git 설명과 마찬가지로) 두려워합니다. 당신은 로컬 수정 사항이있는 경우 foo.c와 수행하지 않는 git add foo.c, 다음 foo.c입니다 인덱스에없는 ; 커밋을 위해 준비되지 않았습니다. 경우 git diff foo.c순진 작업에 비해 foo.c인덱스에, 그것은 빈 / 존재하지 않는 파일의 전체 내용 사이에 거대한 DIFF를 표시해야합니다 foo.c. 실제로, 파일이 색인에 존재하지 않으면 git diff해당 파일에 대해 HEAD사본 사용시 대체됩니다.
Kaz

9
@Kaz 엄밀히 말하면, 색인은 빈 슬레이트 가 아닙니다 . HEAD단계적 변경 사항이 적용되는 가상 사본입니다 . Git은 전체 파일을 저장하지 않고 변경 사항을 저장하여 작동합니다. 파일을 준비하면 변경 사항 만 저장됩니다. 인덱스가 비어있는 것처럼 인덱스에 변경 내용을 저장하는 방법을 모르고 전체 파일을 "새로 추가"로 저장해야합니다. 이는 잘못된 것입니다.
ADTC

8
@Kaz 인덱스와 의지 모두 HEAD변경되지 않은 foo.c파일 버전 을가집니다 (물리적 사본이 아니라 단지 당신과 나에게 논리적 사본입니다. Git은 그 파일과 관련된 모든 커밋이 참조하는 것과 동일한 데이터 스트림입니다 ). 그래서 당신이 할 때 git diff완전히 unstaged foo.c에 정말 떨어지는 아니에요 다시 HEAD실제로 (같은 파일의 동일한 버전을 포함 일어나는 지수와 DIFF하고있어 HEAD수행을). 그래픽이 맞습니다.
ADTC

2
안녕하세요, 이 문맥에서 " index "가 무엇을 의미하는지 알고 싶습니다 . 감사!
Gab 是 好人

2
@TomRussell git status -vgit diff --cached( git status물론)
wisbucky

54

시각적으로 나란히보기에 관심이 있다면 확산 시각적 차이 도구를 사용하면됩니다. 모든 변경 사항이 준비되지 않은 경우에도 세 개의 창이 표시됩니다. 충돌이 발생하면 네 개의 창이 있습니다.

단계적 편집 및 비 단계적 편집을 통한 확산 스크린 샷

로 불러

diffuse -m

Git 작업 카피에.

당신이 저에게 묻는다면, 10 년 동안 내가 본 최고의 시각적 차이가 있습니다. 또한 Git에만 국한되지는 않습니다 : SVN, Mercurial, Bazaar 등 다양한 VCS와 상호 운용됩니다 ...

참조 : git diff에서 단계별 트리와 작업 트리를 모두 표시 하시겠습니까?


1
고마워, 이것은 좋은 도구처럼 보입니다. 지금까지 Meld가 Linux에서 최고의 시각적 diff 도구라는 것을 알았지 만 클립 보드에서 텍스트를 구별 할 수 없었습니다. Meld는 입력 할 파일이 필요합니다. 확산은 수동 정렬뿐만 아니라이를 가능하게합니다. 잠시 동안 사용해보십시오.
Drew Noakes

spread.sourceforge.net에 대한 링크가 끊어 졌습니다. 지금 sourceforge.net/projects/diffuse 를 사용하십시오 .
user1133275

1
brew install diffuseOS X에서 작동합니다. 비 단계적 및 단계적 변경이 모두있는 경우 3 개의 창을 표시하지 않습니다. 아직 인덱스에없는 변경을 의미 했습니까?
브렌트 파우스트

어떤 버전의 확산이 있습니까? 예-파일을 추가 한 후 로컬로 수정하면 세 개의 창이 표시됩니다.
krlmlr 2016

또한 확산 을 기본 difftool 로 설정 하고 내장 메커니즘 / 도구 / 별칭을 사용 하여이를 확산 시킬 수 있습니다 . 여기에 내 대답을 참조하십시오 : < stackoverflow.com/a/45684512/6501141 >
LightCC

50

참고 git status -v 또한 (가) 변화를 개최 보여줍니다! ( git add단계적 변경 이 필요하다는 것을 의미합니다 .-일부 변경 사항. 단계적 변경 사항, 차이점이 없습니다 git status -v. 2006 년 2 월 Git 1.2.0
이후로 수행 됩니다 . )

긴 형식 (기본값) git status에는 문서화되지 않은 "verbose"옵션이 있으며 실제로 HEAD와 인덱스 사이의 차이를 표시합니다.

그리고 더 완전 해 지려고합니다 : " git diff에 단계별 및 작업 트리 표시? "(git 2.3.4+, 2015 년 2 분기) :

git status -v -v

마지막 줄은git diff HEAD
artur

2
@artur 왜? 대답의 요점은 git status -vv또한 무엇을 포함하는지 언급하는 것 git diff HEAD입니다.
VonC

작동하지 않습니다 git version 1.8.3.1. 나는 그것이 오래되었다는 것을 알고 있지만 가능하면이 플래그가 언제 소개되었는지 확인하십시오.
onebree

2
@onebree 1.8.3.1은 실제로 2013 년 6 월입니다. 그러나 git status -v더 오래되었습니다 ( github.com/git/git/commit/… , git 1.2.0, February 2006!). 인덱스HEAD: 사이에 diff를 표시합니다. 인덱스 에 아무것도 추가하지 않은 경우 (no git add) git status -vdiff가 표시되지 않습니다. git status -v -v더 최근입니다 (Git 2.3.4, 2015 년 3 월)
VonC

@VonC 그건 내 실수 였어 git diff -v.
onebree

25

이 명령을 사용할 수 있습니다.

git diff --cached --name-only

--cached의 옵션 git diff수단이 파일을 개최하려면 및 --name-only옵션 수단은 파일의 이름을 얻을 수 있습니다.


2
자세한 내용으로 편집하십시오. 검색 가능한 콘텐츠가 포함되어 있지 않으며 누군가 "이 작업을 시도해야하는 이유"를 설명하지 않기 때문에 코드 전용 및 "이 작업을 시도"답변은 권장되지 않습니다.
abarisone

2
왜 내가 이것을 원하는지 --name-only잘 모르겠습니다 . 옵션을 사용하여 일반 규칙을 사용할 수도 있습니다.git status
Simon Forsberg

16

버전 1.7 이상에서는 다음과 같아야합니다.

git diff --staged

15

VISUAL DIFF 도구 사용

기본 답변 (명령 줄에서)

여기에 가장 적합한 답변은 캐시 된 / 단계적 변경 사항을 보는 방법을 올바르게 보여줍니다 Index.

$ git diff --cached

또는 $ git diff --staged별칭입니다.


대신 시각적 차이 도구 시작

기본 응답은 git bash (예 : 명령 줄 또는 콘솔)에서 diff 변경 사항을 뱉어냅니다. 단계별 파일 차이의 시각적 표현을 선호하는 사람들을 위해, git 내에 사용 가능한 스크립트가 있습니다 difftool.

$ git difftool --staged

문제는이 같은 작업을 수행합니다 git diff --staged언제든지 제외은 diff 도구를 실행 (즉 때마다 파일이 DIFF에 의해 처리된다),이 (내 환경에서 이것이 기본 시각은 diff 도구를 시작합니다 kdiff3 ).

도구가 시작된 후 git diff 스크립트는 시각적 diff 도구가 닫힐 때까지 일시 중지됩니다. 따라서 다음 파일을 보려면 각 파일을 닫아야합니다.


git 명령 difftool대신 항상 사용할 수 있습니다diff

모든 시각적 차이 요구 git difftool에 대해 git diff모든 옵션을 포함한 모든 명령 대신 작동 합니다.

예를 들어, 각 파일마다 수행 할 것인지 묻지 않고 시각적 차이 도구를 시작하려면 -y옵션을 추가하십시오 (보통 당신이 원할 것이라고 생각합니다 !!) :

$ git difftool -y --staged

이 경우 시각적 차이 도구에서 각 파일을 한 번에 하나씩 끌어 올려서 도구를 닫은 후 다음 파일을 불러옵니다.

또는 다음에서 준비된 특정 파일의 차이점을 살펴보십시오 Index.

$ git difftool -y --staged <<relative path/filename>>

모든 옵션에 대해서는 매뉴얼 페이지를 참조하십시오.

$ git difftool --help


Visual Git Tool 설정

기본값 이외의 시각적 자식 도구를 사용하려면 다음 -t <tool>옵션을 사용하십시오 .

$ git difftool -t <tool> <<other args>>

또는 다른 기본 시각적 차이 도구를 사용하도록 git을 구성하는 방법은 difftool 매뉴얼 페이지를 참조하십시오.


.gitconfigdiff / merge 도구로 vscode에 대한 예제 항목

difftool 설정의 일부는 .gitconfig파일을 장면 뒤에서 변경하거나 직접 편집하는 git 명령을 통해 파일을 변경하는 것입니다.

.gitconfig홈 디렉토리 (예 : ~Unix 또는 c:\users\<username>Windows의 경우) 에서 찾을 수 있습니다 .

또는을 사용 .gitconfig하여 기본 Git 편집기에서 사용자 를 열 수 있습니다 git config -e --global.

다음은 .gitconfigVS 코드에 대한 글로벌 사용자의 diff 도구 및 병합 도구의 예제 항목입니다 .

[diff]
    tool = vscode
    guitool = vscode
[merge]
    tool = vscode
    guitool = vscode
[mergetool]
    prompt = true
[difftool "vscode"]
    cmd = code --wait --diff \"$LOCAL\" \"$REMOTE\"
    path = c:/apps/vscode/code.exe
[mergetool "vscode"]
    cmd = code --wait \"$MERGED\"
    path = c:/apps/vscode/code.exe

14

준비 영역 대 리포지토리 (마지막 커밋) 비교 사용

 $git diff --staged

이 명령은 staged ( $ git add fileName) 변경 사항을 마지막 커밋 과 비교합니다 . 다음 커밋에 들어갈 스테이지를 확인하려면 git diff --staged를 사용할 수 있습니다. 이 명령은 단계적 변경 사항을 마지막 커밋과 비교합니다.

작업 대 준비 비교 사용

$ git diff 

이 명령은 작업 디렉토리에있는 내용과 준비 영역에있는 내용을 비교합니다. git diff 자체는 마지막 커밋 이후에 작성된 모든 변경 사항을 표시하지 않으며 아직 스테이지되지 않은 변경 사항 만 표시합니다. 모든 변경 사항 ( $ git add fileName)을 준비했다면 git diff는 출력을 제공하지 않습니다.

또한 파일 ( $ git add fileName)을 준비한 다음 편집하면 git diff를 사용하여 준비된 파일의 변경 사항과 준비되지 않은 변경 내용을 볼 수 있습니다.


"Working vs Repository 비교 사용 $ git diff" . 나는 git diffWorking과 Staging을 비교할 것이라고 확신 합니다.
wisbucky

8

원격 리포지토리를 푸시 대상으로 설정하고 커밋 변경 로그의 첫 번째 패스가 불완전한 경우이를 푸시하기 전에 커밋 문을 수정할 수 있습니다.

토지 상에서

... 일부 변경 ...

git diff # look at unstaged changes

git commit -am"partial description of changes"

... 커밋에서 언급되지 않은 더 많은 변경 사항을 기억하십시오 ...

git diff origin / master # 단계적이지만 푸시되지 않은 변경 사항을 살펴보십시오

... 단계적 커밋 진술 수정 ...

git commit --amend -m"i missed mentioning these changes ...."

git push

7

단계적 변경 사항이있는 파일이 둘 이상인 경우을 사용하는 것이 더 실용적 일 수 있습니다 git add -i. 그런 다음을 선택 6: diff하고 원하는 파일을 선택하십시오.


6

기본적으로 git diff 는 git 업데이트 된 파일 목록에 추가되지 않은 변경 사항을 표시하는 데 사용됩니다. 그러나 추가되거나 변경 된 변경 사항을 표시하려면 추가 옵션을 제공하여 git에 추가되거나 추가 된 파일 diff에 관심이 있음을 알려줍니다 .

$ git diff          # Default Use
$ git diff --cached # Can be used to show difference after adding the files 
$ git diff --staged # Same as 'git diff --cached' mostly used with latest version of git 

$ git diff 
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
--- a/x/y/z.js 
+++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

-        if (a)
+        if (typeof a !== 'undefined')
             res = 1;
         else
             res = 2;

$ git add x/y/z.js
$ git diff
$

파일을 추가하면 기본값 인 'git diff'를 사용할 수 없습니다.

$ git diff --cached
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
    --- a/x/y/z.js 
    +++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

    -        if (a)
    +        if (typeof a !== 'undefined')
                 res = 1;
             else
                 res = 2;

2

git gui그리고 git-cola당신이 확인하고 인덱스를 조작 할 수 그래픽 유틸리티입니다. 둘 다 준비된 파일에 대한 간단한 시각적 차이를 포함 git-cola하고보다 정교한 병렬 시각적 차이 도구를 시작할 수도 있습니다.

git의 인덱스에서 파일을 제거하는 방법 에서 밀접하게 관련된 답변을 참조하십시오 . 또한 Git-GUI 클라이언트 의이 공식 카탈로그입니다 .


0

gitkgit과 함께 제공되는 도구 에 대해 생각 하고 변경 사항을 보는 데 매우 유용합니다.

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