답변:
최신 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 add -N .
두 파일의 경로를 제공하면 색인 및 추적되지 않은 파일의 파일을 비교할 수 있다고 생각합니다.
git diff --no-index tracked_file untracked_file
git diff --no-index untracked_file_1 untracked_file_2
을 얻는 데 사용할 수 있습니다 git diff
... 아름답습니다.
/dev/null
대신 다음을 사용할 수 있습니다 git diff --no-index -- /dev/null <untracked_file>
..
cat untracked_file_1
또는 아마도 printf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"
녹색 출력이 필요한 경우. :) (더 진지한 설명이 있지만 명령 대체는 파일에서 후행 줄 바꿈을 제거한다는 점에 유의하십시오.)
대화 형 일일 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
나중에 기능이 추가 될 예정이라면 여기에 메모를 남겨주세요!git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
해결 방법 내가 나이가 GITS에 대한 제안은 하지 와 작업을 git stash
사용하려고 시도하여 이미 dB 예에 e69de29bb있어 가정, add -N
이전에. 그래서 분명히 git add -N
어떤 식 으로든 정확하게 동일하지는 않습니다 .tbh 어떻게 모르겠습니다.
test
명령을 사용하여 숫자 평등 검사 대신 문자열 비교를 수행 하고 있습니다. 아무것도 영향을 미치지 않아야하지만 test "$#" -eq 0
더 정확하게 의도 된 것입니다.
less
있으므로 q
각 파일 을 누를 필요가 없으며 파일 git diff
당 페이지 매김 ( -P
) 을 제거 하고 나중에 다시 추가하여 정확히 느낌 ( | less
), 색상 유지 ( --color=always
) 및 색상 ( less -r
또는 less -R
) 으로 해석합니다 . 그래서 그것은 전부입니다 :do git -P diff --color=always -- /dev/null "$i"; done | less -r
test -t 1
(예를 들어 if [ -t 1 ]; then color_arg=--color; fi
또는 무엇인가) 쉘이 출력이 터미널인지 여부를 확인하는 방법으로 색상을 결정하는 유용한 방법입니다. 그리고 xargs
while 루프를 제거하는 방법을 제공 할 수도 있습니다. 당신은 여전히 필요합니다 -n 1
아직 출시 시간을 잔뜩 이눔 아, 아직 방법은,하지만 ...이 못된 것을 짝이 될해야합니다, 그래서 그것에 while
그리고 read
어쩌면,의 더 나은 그?!? 나는 그것을 독자에게 맡깁니다.
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 명령을 사용할 수도 있습니다.
git diff /dev/null <untracked_tile>
파일을 "그냥"하는 것이 아니라 패치 형식으로 패치를 실행 하고 얻을 수 있습니다.
이것은 나를 위해 작동합니다 :
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
한 파일의 경우 :
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 }
일반적으로 원격 위치 팀과 작업 할 때 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'를 구성합니다.
로컬 커밋이 없다고 가정하면
git diff origin/master
git diff
은 추적되지 않은 파일을 포함 하는 명령을 요구 합니다. 이 명령에는 포함되지 않습니다. 또한 로컬 커밋이 존재하는지 여부는 질문과 전혀 관련이 없습니다.
git merge --squash mybranch
, 그리고 git diff master
추적되지 않은 파일의 변경 사항을 보여주었습니다.
git diff
추적되지 않은 파일에는 차이점이 표시되지 않습니다. 추적되지 않았기 때문에 정의에 따라 표시 할 차이점이 없습니다. Git이 작동하는 방식 일뿐입니다. :)