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
?
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:
Son git sürümlerinde , o konumdaki dizine sıfır uzunlukta bir damla ekleyen git add -N
dosyayı (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 stash
bir --intent-to-add
dosyanı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 add -N .
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
git diff --no-index untracked_file_1 untracked_file_2
almak için kullanabilirsiniz git diff
... güzel.
/dev/null
yerine: git diff --no-index -- /dev/null <untracked_file>
.
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.)
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-add
kullanı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 d
diff içinde izlenmemiş dosyaları içerecektir (iş akışımda umursadığım şey) ve d args...
normal gibi davranacak git diff
.
Notlar:
git diff
gerçekten sadece bireysel diffs birleştirilmiş olan gerçeği kullanıyoruz , bu yüzden d
tüm izlenmeyen dosyaları son sıralanan dışında - "gerçek bir fark" çıktı söylemek mümkün değildir .git diff
. Birisi bunun nasıl yapılacağını anlarsa ya git
da gelecekte bir noktada bir özellik eklenirse , lütfen buraya not bırakın!git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
geçici çözüm Yaşım gits için önerilen yapar ile çalışmalarını git stash
kullanmaya çalışarak zaten db, örneğin içinde e69de29bb var varsayarak, add -N
daha ö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.
test
arada, komutunuzla sayısal eşitlik denetimi yerine dize karşılaştırması yapıyorsunuz . Hiçbir şeyi etkilememelidir, ancak test "$#" -eq 0
daha kesin olarak amaçlanan şeydir.
less
için basmanız gerekmeyecek şekilde sahte olabilir q
ve dosya git diff
başına sayfalandırmayı ( -P
) kaldırarak , daha sonra tekrar ekleyerek tam olarak hisseder ( | less
), rengi koruma ( --color=always
) ve renk olarak yorumlama ( less -r
veyaless -R
) . Yani tamamen:do git -P diff --color=always -- /dev/null "$i"; done | less -r
test -t 1
(örneğin if [ -t 1 ]; then color_arg=--color; fi
ya 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 xargs
while döngüsünden kurtulmak için bir yol verebilir. Yine de buna ihtiyacınız -n 1
olacak, bu yüzden git birkaç kez git başlatacak ve hala bu şekilde çift olmalı, ama ... kurtuluyor while
ve read
belki de daha iyi?!? Bunu okuyucuya bırakıyorum.
% 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 :n
ve 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.
git diff /dev/null <untracked_tile>
yamayı bir dosya olarak "sadece" değil yama biçiminde çalıştırabilir ve alabilirsiniz
git add -A
git diff HEAD
Gerekirse düzeltme eki oluşturun ve ardından:
git reset HEAD
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.
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
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.
git add
izlenmeyen her dosyadan gerekir
git add
o basit olanı ise Kullanım durumunuz Yeni eklediğiniz neyi kontrol etmektir / eklemek istiyorum
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 }
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.
Yerel taahhütlerinizin olmadığını varsayarsak,
git diff origin/master
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.
git merge --squash mybranch
ve git diff master
izlenmemiş dosyalardaki değişiklikleri gösterdim.
git diff
izlenmemiş 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. :)