回答:
最近のgitバージョンではgit add -N
、ファイル(または--intent-to-add
)を使用できます。これにより、その場所のインデックスに長さゼロのblobが追加されます。その結果、「追跡されていない」ファイルがすべてのコンテンツをこの長さゼロのファイルに追加する変更になり、「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)"
本当にグリーン出力が本当に必要な場合。:)(より深刻な注意事項ですが、コマンドの置換により、ファイルの末尾の改行が削除されることに注意してください。)
インタラクティブな日常のギッティング(作業ツリーを常に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
と、追跡されていないファイルが差分に含まれ(ワークフローで気になっていること)、d args...
通常のように動作しますgit diff
。
ノート:
git diff
は、実際には個々のdiffが連結されているという事実を使用しているためd
、「実際のdiff」からの出力を区別することはできません。ただし、追跡されていないすべてのファイルが最後にソートされるという事実は除きます。git diff
。誰かがこれを行う方法を見つけた場合、またはgit
将来的に機能が追加される可能性がある場合は、ここにメモを残してください!git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
私は古いGITSのために提案回避策はありませんでの作業をgit stash
既に使用しようとしてデシベルで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
、それはまだ発売は倍の束をgitの、まだ道というペアワイズする必要がありますので、その上で、しかし...それはを取り除く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 HEAD
ステージングされていない場合は、ファイルの違いのみが表示されます。
git add
、追跡されていないすべてのファイルが必要です
git add
最も簡単です
1つのファイルの場合:
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;"
1つのコマンドとして結合されたすべての変更されたファイルと新しいファイル:
{ git --no-pager diff; gdnew }
通常、リモートロケーションチームで作業するときは、同じファイルで他のチームが行った変更について事前に知っていることが重要です。前にgitステージ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が機能する方法に過ぎません。:)