web-dev-qa-db-fra.com

Puis-je utiliser git diff sur des fichiers non suivis?

Est-il possible de demander à git diff d'inclure des fichiers non suivis dans sa sortie diff? Ou bien est-il préférable d’ajouter les nouveaux fichiers que j’ai créés et les fichiers existants que j’ai édités, et d’utiliser

git diff --cached

?

233
Andrew Grimm

Avec les versions récentes de git, vous pouvez git add -N le fichier (ou --intent-to-add), ce qui ajoute un blob de longueur nulle à l'index situé à cet emplacement. Le résultat est que votre fichier "non suivi" devient maintenant une modification permettant d'ajouter tout le contenu à ce fichier de longueur nulle, et cela apparaît dans la sortie "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

Malheureusement, comme indiqué, vous ne pouvez pas git stash tant que vous avez un fichier --intent-to-add en attente de la sorte. Bien que si vous avez besoin de stocker, vous devez simplement ajouter les nouveaux fichiers, puis les stocker. Ou vous pouvez utiliser la solution de contournement d'émulation:

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

(la création d'un alias est votre ami ici).

234
araqnid

Je pense que vous pouvez différencier les fichiers de votre index et de vos fichiers non suivis en fournissant simplement le chemin d'accès aux deux fichiers.

git diff --no-index tracked_file untracked_file
83
Harold

Pour mon travail quotidien interactif (où je diffère constamment de l’arborescence de travail par rapport au HEAD et que j’aimerais avoir des fichiers non suivis inclus dans le diff), add -N/--intent-to-add est inutilisable, car il cassegit stash.

Alors voici mon git diff remplacement. Ce n'est pas une solution particulièrement propre, mais comme je ne l'utilise vraiment que de manière interactive, je suis d'accord avec un hack:

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
}

Taper juste d inclura les fichiers non suivis dans le diff (ce qui me tient à coeur dans mon flux de travail), et d args... se comportera comme un git diff normal.

Remarques:

  • Nous utilisons ici le fait que git diff n'est qu'un concaténat individuel, il est donc impossible de dire la sortie d d'un "diff réel" - à l'exception du fait que tous les fichiers non suivis sont lus. trié en dernier.
  • Le seul problème avec cette fonction est que la sortie est colorisée même lorsqu'elle est redirigée. mais je ne peux pas être dérangé pour ajouter la logique pour cela.
  • Je ne pouvais trouver aucun moyen d'inclure des fichiers non suivis en assemblant simplement une liste d'arguments astucieuse pour git diff. Si quelqu'un trouve comment faire cela, ou si une fonctionnalité est éventuellement ajoutée à git à l'avenir, veuillez laisser une note ici!
34
Jo Liss

Pas à 100%, mais si pour une raison quelconque vous ne voulez pas ajouter vos fichiers à l'index comme le suggère la réponse acceptée, voici une autre option:

Si les fichiers ne sont pas suivis, il est évident que le diff est le fichier entier. Vous pouvez donc les visualiser avec moins:

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

Naviguez entre eux avec :n et :p pour next et previous ..

Mise à jour à partir des commentaires: Si vous avez besoin d'un format de patch, vous pouvez également le combiner avec git diff:

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

Vous pouvez également rediriger la sortie vers un fichier ou utiliser une autre commande diff dans ce cas.

22
user1587520
git add -A
git diff HEAD

Générez le correctif si nécessaire, puis:

git reset HEAD
16
Amol Pujari

Les modifications fonctionnent si elles sont mises en place ou non avec cette commande. Les nouveaux fichiers fonctionnent lorsqu'ils sont mis en scène:

$ git diff HEAD

S'ils ne sont pas mis en scène, vous ne verrez que les différences de fichiers.

13
alairock

cela fonctionne pour moi:

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

La dernière étape est facultative, le fichier restera à l'état précédent (non suivi)

utile si vous créez aussi un patch:

  git diff --cached my_file.txt > my_file-patch.patch
9
Alejandro Moreno

Pour un fichier:

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

Pour tous les nouveaux fichiers:

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

Comme alias:

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

Pour tous les fichiers modifiés et nouveaux combinés en une seule commande:

{ git --no-pager diff; gdnew }
6
radzimir

en général, lorsque je travaille avec des équipes distantes, il est important pour moi que je sache ce que les autres équipes ont modifié dans le même fichier, avant de suivre les étapes de git untrack -> mis en scène -> je m’engage pour que j’ai écrit un script bash qui aidez-moi à éviter un conflit de fusion de résolution inutile avec une équipe distante ou créez une nouvelle branche locale et comparez et fusionnez sur la branche principale

#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

dans le script ci-dessus, je récupère la branche principale distante (pas nécessairement la branche principale) vers FETCH_HEAD, qui les répertorie uniquement avec mon fichier modifié et compare les fichiers modifiés à git difftool

ici beaucoup de difftool supportés par git, je configure 'Meld Diff Viewer' pour une bonne comparaison graphique.

2
adg