추적되지 않은 파일에 git diff를 사용할 수 있습니까?


270

git diff에게 diff 출력에 추적되지 않은 파일을 포함하도록 요청할 수 있습니까? 또는 내가 만든 새 파일과 내가 편집 한 기존 파일을 추가하고 사용하는 것이 가장 좋습니다.

git diff --cached

?

답변:


267

최신 git 버전을 사용 git add -N하면 파일 (또는 --intent-to-add)을 사용하여 길이가 0 인 얼룩을 해당 위치의 인덱스에 추가 할 수 있습니다. 결론은 "추적되지 않은"파일이 이제이 길이가 0 인 파일에 모든 내용을 추가하기위한 수정이되어 "git diff"출력에 표시된다는 것입니다.

git diff

echo "this is a new file" > new.txt
git diff

git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file

슬프게도 지적했듯이 파일이 이와 같이 보류중인 git stash동안에는 할 수 없습니다 --intent-to-add. 숨겨야 할 경우 새 파일을 추가 한 다음 숨겨야합니다. 또는 에뮬레이션 해결 방법을 사용할 수 있습니다.

git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt

(별명 설정은 여기의 친구입니다).


내 Git 사본이 최근에 -N을 추가하기에 충분하지 않은 것으로 판명되었지만 내 질문에 대답합니다.
Andrew Grimm

1
당신은 (? 내가 틀린 답에 넣어 관리 않았다 방법) "자식 갱신 지수는 100,644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt --cacheinfo --add"와 "-N new.txt을 추가 힘내"에뮬레이션 할 수 있습니다
araqnid


1
새 파일이 많으면 파일을 모두 추가 한 다음 쉽게 비교할 수있는 방법이 있습니까?
Vic

1
@Vicgit add -N .
네이선

92

두 파일의 경로를 제공하면 색인 및 추적되지 않은 파일의 파일을 비교할 수 있다고 생각합니다.

git diff --no-index tracked_file untracked_file

3
마지막 커밋 이후에 생성 한 추적되지 않은 파일이 둘 이상있는 경우에도 작동합니까?
Andrew Grimm

12
네, 정답입니다! 그런 다음 diffs에서 구문 채색 등 git diff --no-index untracked_file_1 untracked_file_2을 얻는 데 사용할 수 있습니다 git diff... 아름답습니다.
콜린 D 베넷

40
추적 된 파일을 관련이없는 추적되지 않은 파일과 비교하는 이유를 이해하지 못합니다 . 추적되지 않은 파일에 대해 diff 출력을 얻으려면 /dev/null대신 다음을 사용할 수 있습니다 git diff --no-index -- /dev/null <untracked_file>..

4
또는 그냥 cat untracked_file_1또는 아마도 printf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"녹색 출력이 필요한 경우. :) (더 진지한 설명이 있지만 명령 대체는 파일에서 후행 줄 바꿈을 제거한다는 점에 유의하십시오.)
Wildcard

8
이것은 받아 들일만한 대답이어야합니다 .git의 인덱스를 변경할 필요는 없습니다. 원래 저자가 말한대로, 그 단점이있는
DIMMSum

38

대화 형 일일 gitting (작업 트리를 HEAD와 항상 비교하고 diff에 포함 된 추적되지 않은 파일을 갖고 싶은 경우) add -N/--intent-to-add깨지기 때문에 사용할 수 없습니다 git stash.

여기 내 git diff교체품이 있습니다. 특히 깨끗한 솔루션은 아니지만 대화 형으로 만 사용하기 때문에 해킹으로도 괜찮습니다.

d() {
    if test "$#" = 0; then
        (
            git diff --color
            git ls-files --others --exclude-standard |
                while read -r i; do git diff --color -- /dev/null "$i"; done
        ) | `git config --get core.pager`
    else
        git diff "$@"
    fi
}

타이핑 d하면 diff에 추적되지 않은 파일이 포함되며 (워크 플로에서 신경 쓰이는 d args...것) regular과 같이 작동합니다 git diff.

노트:

  • 여기서는 실제로 git diff개별 diff가 연결 d되어 있다는 사실을 사용하므로 추적되지 않은 모든 파일이 마지막으로 정렬된다는 사실을 제외하고는 "실제 diff" 의 출력 을 말할 수 없습니다 .
  • 이 기능의 유일한 문제점은 경로 재 지정된 경우에도 출력이 색상 화된다는 것입니다. 그러나 나는 그것에 대한 논리를 추가하기 위해 귀찮게 할 수 없습니다.
  • 에 대한 매끄러운 인수 목록을 어셈블하여 추적되지 않은 파일을 얻는 방법을 찾을 수 없었습니다 git diff. 누군가이 작업을 수행하는 방법을 알아 내거나 git나중에 기능이 추가 될 예정이라면 여기에 메모를 남겨주세요!

4
아이러니하게도, 내 git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt해결 방법 내가 나이가 GITS에 대한 제안은 하지 와 작업을 git stash사용하려고 시도하여 이미 dB 예에 e69de29bb있어 가정, add -N이전에. 그래서 분명히 git add -N어떤 식 으로든 정확하게 동일하지는 않습니다 .tbh 어떻게 모르겠습니다.
araqnid

2
그런데 test명령을 사용하여 숫자 평등 검사 대신 문자열 비교를 수행 하고 있습니다. 아무것도 영향을 미치지 않아야하지만 test "$#" -eq 0더 정확하게 의도 된 것입니다.
와일드 카드

1
그래, 여전히 당신이 그것을 한 쌍으로 해야하는 것처럼 보이지만 ... 하나로 가짜로 만들 수 less있으므로 q각 파일 을 누를 필요가 없으며 파일 git diff당 페이지 매김 ( -P) 을 제거 하고 나중에 다시 추가하여 정확히 느낌 ( | less), 색상 유지 ( --color=always) 및 색상 ( less -r또는 less -R) 으로 해석합니다 . 그래서 그것은 전부입니다 :do git -P diff --color=always -- /dev/null "$i"; done | less -r
hyperpallium

미래에 귀찮게하고 싶을 경우 test -t 1(예를 들어 if [ -t 1 ]; then color_arg=--color; fi또는 무엇인가) 쉘이 출력이 터미널인지 여부를 확인하는 방법으로 색상을 결정하는 유용한 방법입니다. 그리고 xargswhile 루프를 제거하는 방법을 제공 할 수도 있습니다. 당신은 여전히 필요합니다 -n 1아직 출시 시간을 잔뜩 이눔 아, 아직 방법은,하지만 ...이 못된 것을 짝이 될해야합니다, 그래서 그것에 while그리고 read어쩌면,의 더 나은 그?!? 나는 그것을 독자에게 맡깁니다.
lindes

28

100 %가 아니지만 어떤 이유로 든 허용되는 대답에서 제안한대로 파일을 색인에 추가하지 않으려는 경우 다른 옵션이 있습니다.

파일이 추적되지 않으면 diff는 전체 파일이므로 분명히 적은 수로 볼 수 있습니다.

less $(git ls-files --others --exclude-standard)

와 그들 사이를 탐색 :n하고 :p다음 및 이전을위한 ..

주석에서 업데이트 : 패치 형식이 필요한 경우 다음과 결합 할 수도 있습니다 git diff.

git ls-files --others --exclude-standard | xargs -n 1 git --no-pager diff /dev/null | less

이 경우 출력을 파일로 리디렉션하거나 다른 diff 명령을 사용할 수도 있습니다.


6
또한 git diff /dev/null <untracked_tile>파일을 "그냥"하는 것이 아니라 패치 형식으로 패치를 실행 하고 얻을 수 있습니다.
SimSimY

2
git diff와 결합 된이 답변은 완벽한 솔루션입니다.
iwind

22
git add -A
git diff HEAD

필요한 경우 패치를 생성 한 후 다음을 수행하십시오.

git reset HEAD

이것은 모든 것을 추가함으로써 이전 (사전) 작업을 잃을 가능성이 있습니다. 특히 사람이 git add -p매우 자주 사용하는 경우 (저는 일반적으로 권장합니다) ... 이것은 기본적인 일을하는 방법을 제공합니다. 효과.
lindes

13

이것은 나를 위해 작동합니다 :

git add my_file.txt
git diff --cached my_file.txt
git reset my_file.txt

마지막 단계는 선택 사항이며 파일을 이전 상태로 유지합니다 (추적되지 않음)

패치를 작성하는 경우에도 유용합니다.

  git diff --cached my_file.txt > my_file-patch.patch

이 추가 / 리셋 쌍의 특이성은 stackoverflow.com/a/50486906/313756 의 샷건 접근법과는 대조적 입니다.
lindes

9

이 명령으로 스테이징 및 비 스테이징 된 경우 변경이 작동합니다. 준비되면 새 파일이 작동합니다.

$ git diff HEAD

준비되지 않은 경우 파일 차이 만 표시됩니다.


26
HEAD기본값 이므로 git diff문제를 해결하지 않는 것과 동일 합니다.
Iulian Onofrei

4
git add추적 할 수없는 모든 파일 이 필요 합니다
SilvioQ

이 답변을 포함하도록이 답변을 편집하면 유스 케이스가 방금 추가 / 추가하려는 항목을 확인하는 것이 git add가장 간단 합니다.
KCD

8

한 파일의 경우 :

git diff --no-index /dev/null new_file

모든 새 파일의 경우 :

for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done;

별명으로 :

alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;"

하나의 명령으로 결합 된 모든 수정 및 새 파일의 경우 :

{ git --no-pager diff; gdnew }

2

일반적으로 원격 위치 팀과 작업 할 때 git stages untrack-> staged-> commit을 수행하기 전에 bash 스크립트를 작성하기 전에 동일한 파일에서 다른 팀이 수행 한 변경 사항에 대해 사전 지식이 있어야합니다. 원격 팀과의 불필요한 병합 병합 충돌을 피하거나 새로운 로컬 지점을 만들고 주요 지점에서 비교 및 ​​병합하도록 도와줍니다.

#set -x 
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | grep "modified" | awk "{print $2}" `
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool FETCH_HEAD $file ;
done

위의 스크립트에서 나는 원격 메인 브랜치 (마스터 브랜치가 필요하지 않음)를 FETCH_HEAD로 가져 와서 수정 된 파일의 목록 만 만들고 수정 된 파일을 git difftool과 비교합니다.

여기에 git에서 지원하는 많은 difftool이 있으며, GUI 비교를 위해 'Meld Diff Viewer'를 구성합니다.


-9

로컬 커밋이 없다고 가정하면

git diff origin/master

8
질문 git diff은 추적되지 않은 파일을 포함 하는 명령을 요구 합니다. 이 명령에는 포함되지 않습니다. 또한 로컬 커밋이 존재하는지 여부는 질문과 전혀 관련이 없습니다.
toon81

JFTR, I git merge --squash mybranch, 그리고 git diff master추적되지 않은 파일의 변경 사항을 보여주었습니다.
muammar

2
불가능합니다. "추적되지 않은"의 의미에 대해 혼란스러워하는 것 같습니다. 추적되지 않음은 파일이 한 지점에서 추적되고 다른 지점이 아니라는 것을 의미하지 않으며 어떤 방식 으로든 "Git"에 있지 않다는 것을 의미합니다. 스쿼시 여부는 차이가 없습니다. git diff추적되지 않은 파일에는 차이점이 표시되지 않습니다. 추적되지 않았기 때문에 정의에 따라 표시 할 차이점이 없습니다. Git이 작동하는 방식 일뿐입니다. :)
toon81
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.