web-dev-qa-db-ja.com

追跡されていないファイルでgit diffを使用できますか?

Git diffにdiff出力に追跡されていないファイルを含めるように依頼することは可能ですか?または、作成した新しいファイルと編集した既存のファイルをgitに追加して使用するのが最善の方法です

git diff --cached

233
Andrew Grimm

最新の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

(エイリアスの設定はここでのあなたの友人です)。

234
araqnid

両方のファイルへのパスを指定するだけで、インデックス内のファイルと追跡されていないファイルを比較できると思います。

git diff --no-index tracked_file untracked_file
83
Harold

日々の対話型ギッティング(作業ツリーを常に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に機能が追加される可能性がある場合は、ここにメモを残してください!
34
Jo Liss

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コマンドを使用することもできます。

22
user1587520
git add -A
git diff HEAD

必要に応じてパッチを生成し、次に:

git reset HEAD
16
Amol Pujari

このコマンドでステージングおよび非ステージングすると変更が機能します。新しいファイルはステージング時に機能します:

$ git diff HEAD

ステージングされていない場合は、ファイルの違いのみが表示されます。

13
alairock

これは私のために働く:

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
9

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 }
6
radzimir

通常、リモートロケーションチームで作業する場合、同じファイル内の他のチームによって行われた変更を事前に知っていることが重要です。リモートチームとの不要なマージ競合の解決を回避したり、新しいローカルブランチを作成してメインブランチで比較およびマージしたりするのに役立ちます

#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」を構成しています。

2
adg