Git diffにdiff出力に追跡されていないファイルを含めるように依頼することは可能ですか?または、作成した新しいファイルと編集した既存のファイルをgitに追加して使用するのが最善の方法です
git diff --cached
?
最新の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 diff --no-index tracked_file untracked_file
日々の対話型ギッティング(作業ツリーを常にHEADと比較し、差分に追跡されていないファイルを含めたい)では、add -N/--intent-to-add
は使用できませんが、なぜなら breaksgit 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...
は通常のgit diff
と同様に動作します。
ノート:
git diff
が実際に連結された個々のdiffであるという事実を使用しているため、すべての追跡されていないファイルが取得されるという事実を除いて、d
出力を最後にソートされました。git diff
の滑らかな引数リストを組み立てるだけでは、追跡されていないファイルを取得する方法が見つかりませんでした。誰かがこれを行う方法を見つけた場合、または将来のある時点でgit
に機能が追加される可能性がある場合は、ここにメモを残してください!100%ではありませんが、何らかの理由で、受け入れられた回答で示唆されているようにファイルをインデックスに追加したくない場合は、別のオプションがあります。
ファイルが追跡されていない場合、明らかに差分はファイル全体なので、少ないファイルで表示できます。
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 add -A
git diff HEAD
必要に応じてパッチを生成し、次に:
git reset HEAD
このコマンドでステージングおよび非ステージングすると変更が機能します。新しいファイルはステージング時に機能します:
$ git diff HEAD
ステージングされていない場合は、ファイルの違いのみが表示されます。
これは私のために働く:
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
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 }
通常、リモートロケーションチームで作業する場合、同じファイル内の他のチームによって行われた変更を事前に知っていることが重要です。リモートチームとの不要なマージ競合の解決を回避したり、新しいローカルブランチを作成してメインブランチで比較およびマージしたりするのに役立ちます
#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」を構成しています。