Git diff'ü izlenmeyen dosyalarda kullanabilir miyim?


270

Git diff'ten izlenmemiş dosyaları diff çıktısına eklemesini istemek mümkün müdür? Ya da oluşturduğum yeni dosyaları ve düzenlediğim mevcut dosyaları eklemek ve kullanmak için gitmem gereken en iyi şey

git diff --cached

?

Yanıtlar:


267

Son git sürümlerinde , o konumdaki dizine sıfır uzunlukta bir damla ekleyen git add -Ndosyayı (veya --intent-to-add) yapabilirsiniz . Sonuç, "izlenmemiş" dosyanızın artık bu içeriği sıfır uzunluktaki dosyaya eklemek için bir değişiklik haline gelmesi ve "git diff" çıktısında gösterilmesidir.

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

Ne yazık ki, belirtildiği gibi, böyle bekleyen git stashbir --intent-to-adddosyanız varken yapamazsınız . Her ne kadar saklamanız gerekiyorsa, yeni dosyaları ekleyip saklayabilirsiniz. Veya öykünme geçici çözümünü kullanabilirsiniz:

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

(bir takma ad oluşturmak arkadaşınızdır).


Git kopyamın -N ekleyecek kadar yeni olmadığı ortaya çıkıyor, ancak bu sorumu cevaplıyor.
Andrew Grimm

1
"Git add -N new.txt" yi "git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt" ile taklit edebilirsiniz (bunu yanlış yanıta koymayı nasıl
başardım

Özellik 1.6.1'de
MarcH

1
çok fazla yeni dosyanız varsa, hepsini eklemenin ve fark etmenin kolay bir yolu var mı?
Vic

1
@Vicgit add -N .
Nathan

92

Her iki dosyanın yolunu da girerek dizininizdeki ve izlenmeyen dosyalarınız arasında değişiklik yapabileceğinize inanıyorum.

git diff --no-index tracked_file untracked_file

3
Son işlemden bu yana oluşturduğunuz birden fazla izlenmemiş dosyanız varsa bu işe yarar mı?
Andrew Grimm

12
Evet, mükemmel cevap! Sonra diffs üzerinde sözdizimi renklendirme vb git diff --no-index untracked_file_1 untracked_file_2almak için kullanabilirsiniz git diff... güzel.
Colin D Bennett

40
İzlenen bir dosyayı neden alakasız izlenmemiş bir dosyayla karşılaştırdığınızı anlamıyorum . Sadece izlenmeyen dosyası için fark çıktı almak istedim, sadece kullanabilirsiniz /dev/nullyerine: git diff --no-index -- /dev/null <untracked_file>.

4
Ya da cat untracked_file_1, ya da belki de printf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"gerçekten yeşil çıktıya ihtiyacınız varsa. :) (Daha ciddi bir notta olmasına rağmen, komut değiştirmenin sondaki yeni satırları dosyanızdan kaldıracağını lütfen unutmayın.)
Wildcard

8
Bu kabul edilen cevap olmalıdır - git'in dizinini değiştirmeyi gerektirmez; Orijinal yazarın dediği gibi, dezavantajı var
DIMMSum

38

Etkileşimli günlük gitme için (çalışma ağacını HEAD'a her zaman ayırdığımda ve diff'de izlenmeyen dosyaların olmasını istiyorum) add -N/--intent-to-addkullanılamıyor çünkü kırılıyor git stash .

İşte benim yerim git diff. Özellikle temiz bir çözüm değil, ama gerçekten sadece etkileşimli olarak kullandığım için, bir hack ile iyiyim:

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
}

Yazmak sadece ddiff içinde izlenmemiş dosyaları içerecektir (iş akışımda umursadığım şey) ve d args...normal gibi davranacak git diff.

Notlar:

  • Burada git diffgerçekten sadece bireysel diffs birleştirilmiş olan gerçeği kullanıyoruz , bu yüzden dtüm izlenmeyen dosyaları son sıralanan dışında - "gerçek bir fark" çıktı söylemek mümkün değildir .
  • Bu işlevle ilgili tek sorun, yeniden yönlendirildiğinde bile çıktının renklendirilmesidir; ama bunun için mantık eklemekle uğraşmam.
  • Sadece kaygan bir argüman listesi birleştirerek dahil edilmeyen dosyaları almak için herhangi bir yol bulamadım git diff. Birisi bunun nasıl yapılacağını anlarsa ya gitda gelecekte bir noktada bir özellik eklenirse , lütfen buraya not bırakın!

4
İronik olarak, benim git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txtgeçici çözüm Yaşım gits için önerilen yapar ile çalışmalarını git stashkullanmaya çalışarak zaten db, örneğin içinde e69de29bb var varsayarak, add -Ndaha önce. Görünüşe göre bir şekilde tam olarak eşdeğer değil git add -N: tbh Nasıl olduğundan emin değilim.
araqnid

2
Bu testarada, komutunuzla sayısal eşitlik denetimi yerine dize karşılaştırması yapıyorsunuz . Hiçbir şeyi etkilememelidir, ancak test "$#" -eq 0daha kesin olarak amaçlanan şeydir.
Wildcard

1
Evet, yine de çift olarak yapmanız gerekiyor gibi görünüyor ... ancak her dosya lessiçin basmanız gerekmeyecek şekilde sahte olabilir qve dosya git diffbaşına sayfalandırmayı ( -P) kaldırarak , daha sonra tekrar ekleyerek tam olarak hisseder ( | less), rengi koruma ( --color=always) ve renk olarak yorumlama ( less -rveyaless -R ) . Yani tamamen:do git -P diff --color=always -- /dev/null "$i"; done | less -r
hyperpallium

Gelecekte rahatsız edilmek istiyorsanız, test -t 1(örneğin if [ -t 1 ]; then color_arg=--color; fiya da bir şey) kabuğun çıktısının bir terminal olup olmadığını kontrol etmesinin bir yoludur, bu da renklendirmeye karar vermenin yararlı bir yoludur. Ve xargswhile döngüsünden kurtulmak için bir yol verebilir. Yine de buna ihtiyacınız -n 1olacak, bu yüzden git birkaç kez git başlatacak ve hala bu şekilde çift olmalı, ama ... kurtuluyor whileve readbelki de daha iyi?!? Bunu okuyucuya bırakıyorum.
Şubat'ta

28

% 100 değil, ancak herhangi bir nedenle dosyalarınızı kabul edilen yanıtın önerdiği şekilde dizine eklemek istemiyorsanız, başka bir seçenek daha vardır:

Dosyalar izlenmezse, farkın tüm dosya olduğu açıktır, böylece dosyaları daha azıyla görüntüleyebilirsiniz:

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

Sonraki ve önceki için ile :nve arasında gezinin :p.

Yorumlardan güncelleme: Bir yama biçimine ihtiyacınız varsa, onu aşağıdakilerle de birleştirebilirsiniz git diff:

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

Ayrıca çıktıyı bir dosyaya yönlendirebilir veya bu durumda başka bir diff komutu kullanabilirsiniz.


6
git diff /dev/null <untracked_tile>yamayı bir dosya olarak "sadece" değil yama biçiminde çalıştırabilir ve alabilirsiniz
SimSimY

2
git diff ile birlikte bu cevap mükemmel bir çözümdür.
iwind

22
git add -A
git diff HEAD

Gerekirse düzeltme eki oluşturun ve ardından:

git reset HEAD

Bu, her şeyi ekleyerek önceki (ön) işi kaybetme potansiyeline sahiptir. Özellikle kişi git add -pçok sık kullanırsa (genellikle bu arada, tavsiye ederim) ... Bu temel şeyi yapmanın bir yolunu veriyor, sadece ... istenmeyen taraf için bir potansiyele sahip olduğuna dikkat edilmelidir. Etkileri.
Şubat'ta

13

bu benim için çalışıyor:

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

Son adım isteğe bağlıdır, dosyayı önceki durumda bırakır (izlenmez)

bir yama oluşturuyorsanız yararlı olur:

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

Bu ekleme / sıfırlama çiftinin özgüllüğü stackoverflow.com/a/50486906/313756'nın av tüfeği yaklaşımıyla hoş bir kontrasttır. Bunun için teşekkürler.
lindes

9

Değişiklikler bu komutla sahnelendiğinde ve sahnelemediğinde çalışır. Yeni dosyalar hazırlandığında çalışır:

$ git diff HEAD

Hazırlanmazlarsa, yalnızca dosya farklarını görürsünüz.


26
HEADolduğu varsayılan değer aynı şekilde yani, git diffsorunu çözmez hangi.
Iulian Onofrei

4
Bu, git addizlenmeyen her dosyadan gerekir
SilvioQ

Eklemek bu cevabı düzenlerseniz git addo basit olanı ise Kullanım durumunuz Yeni eklediğiniz neyi kontrol etmektir / eklemek istiyorum
KCD

8

Bir dosya için:

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

Tüm yeni dosyalar için:

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

Takma ad olarak:

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

Tek bir komutla birleştirilen tüm değiştirilmiş ve yeni dosyalar için:

{ git --no-pager diff; gdnew }

2

genellikle uzak konum ekipleri ile çalıştığımda benim için bu dosyadaki diğer takımlar tarafından yapılan değişikliklerin ne olduğunu önceden bilmeliyim, git aşamalarını takip etmeden önce unrack -> sahneleme -> bunun için taahhüt ederim bir bash betiği yazdım uzak ekiple gereksiz çözümleme birleştirme çatışmasını önlemek veya yeni yerel şube yapmak ve ana dalı karşılaştırmak ve birleştirmek için bana yardım et

#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

Yukarıdaki komut dosyasında, FETCH_HEAD'e uzak ana dalı (gerekli olmayan dalını) getirmedim, yalnızca değiştirilmiş dosyamın bir listesini yapın ve değiştirilmiş dosyaları git difftool ile karşılaştırın

Burada git tarafından desteklenen birçok difftool, iyi bir GUI karşılaştırması için 'Meld Diff Viewer'ı yapılandırıyorum.


-9

Yerel taahhütlerinizin olmadığını varsayarsak,

git diff origin/master

8
Soru git diff, izlenmeyen dosyaları içeren bir komut ister . Bu komut onları içermez. Ayrıca, yerel taahhütlerin var olup olmadığı soruyla kesinlikle bir ilgisi yoktur.
toon81

JFTR, ben git merge --squash mybranchve git diff masterizlenmemiş dosyalardaki değişiklikleri gösterdim.
muammar

2
Bu imkansız. "İzlenmemiş" in ne anlama geldiği konusunda kafanız karışmış gibi görünüyor. İzlenmemiş, bir dosyanın bir dalda değil başka bir dalda izlendiği anlamına gelmez, hiçbir şekilde "Git'te" olmadığı anlamına gelir. Ezmek ya da ezmek fark etmez. git diffizlenmemiş dosyalarda farklılıklar göstermez: izlenmedikleri için tanım gereği gösterilecek hiçbir fark yoktur. Git'in çalışma şekli budur. :)
toon81
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.