2009-05-13 8 views

Répondre

179

vous pouvez git add -N le fichier (ou --intent-to-add), ce qui ajoute un blob de longueur nulle à l'indice à cet endroit. Le résultat est que votre fichier "non-tracé" devient maintenant une modification pour 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 l'a souligné, vous ne pouvez pas git stash alors que vous avez un fichier --intent-to-add en attente comme celui-ci. Bien que si vous avez besoin de stocker, vous ajoutez simplement les nouveaux fichiers et puis les stash. Ou vous pouvez utiliser la solution de contournement d'émulation:

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

(la configuration d'un alias est votre ami ici).

+0

Il s'avère que ma copie de Git n'est pas assez récente pour ajouter -N, mais cela répond à ma question. –

+1

Vous pouvez émuler "git add -N new.txt" avec "git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 nouveau.txt " (comment ai-je réussi à mettre ceci sur la mauvaise réponse?) – araqnid

+20

En guise de tête,' git add -N' casse 'git stash' http://bit.ly/hLDfHq –

63

Je crois que vous pouvez différencier les fichiers de votre index et ceux qui ne le sont pas en fournissant simplement le chemin d'accès aux deux fichiers. Avec les versions git récentes

git diff --no-index tracked_file untracked_file 
+2

Est-ce que cela fonctionne si vous avez plus d'un fichier non suivi que vous avez créé depuis la dernière validation? –

+8

Oui, réponse parfaite! Je peux alors utiliser 'git diff --no-index untracked_file_1 untracked_file_2' pour obtenir la coloration de la syntaxe' git diff 'etc. sur diffs ... beautiful. –

+25

Je ne comprends pas pourquoi vous comparez un fichier suivi avec *** un fichier non suivi non lié. *** Si vous vouliez simplement obtenir une sortie diff pour le fichier non suivi, vous pouvez simplement utiliser ['/ dev/null' ] (https://en.wikipedia.org/wiki/Null_device) à la place: 'git diff --no-index -/dev/null '. –

26

Pour ma gitting au jour le jour interactif (où je diff l'arbre de travail sur la tête tout le temps, et je voudrais avoir des fichiers non suivis inclus dans le diff), add -N/--intent-to-add est inutilisable, car il breaksgit stash. Alors, voici mon remplacement git diff. Ce n'est pas une solution particulièrement propre, mais depuis que je l'utilise vraiment seulement de manière interactive, je suis OK 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 "[email protected]" 
    fi 
} 

frappe juste d comprendra des fichiers non suivis dans le diff (qui est ce que je me soucie de mon workflow), et d args... se comportera comme git diff régulière.

Notes:

  • Nous utilisons le fait ici que git diff est vraiment juste individuels diffs chaînés, il est donc impossible de dire la sortie d d'une « vraie diff » - à l'exception du fait que tous les fichiers non suivis sont triés en dernier.
  • Le seul problème avec cette fonction est que la sortie est colorée même si elle est redirigée; mais je ne peux pas être dérangé pour ajouter la logique pour cela.
  • Je n'ai trouvé aucun moyen d'obtenir des fichiers non-entrés en assemblant simplement une liste d'arguments slick pour git diff. Si quelqu'un découvre comment faire cela, ou si une fonctionnalité est ajoutée à git à un moment donné dans le futur, s'il vous plaît laissez une note ici!
+3

Ironiquement, mon 'git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt' solution de contournement que j'ai suggéré pour les anciens gits * fonctionne * avec' git stash', en supposant que vous avez déjà e69de29bb dans votre db, par exemple en essayant d'utiliser 'add -N' précédemment. Ce n'est pas exactement l'équivalent de 'git add -N' d'une certaine façon: tbh je ne sais pas comment. – araqnid

+0

Vous effectuez la comparaison de chaînes plutôt que la vérification d'égalité numérique avec votre commande 'test', soit dit en passant. Cela ne devrait rien affecter, mais 'tester '$ #" -eq 0' est plus précisément ce qui est prévu. – Wildcard

-1

En supposant que vous n'avez pas commits locaux,

git diff origin/master 
+4

La question demande une commande 'git diff' qui inclut des fichiers non suivis. Cette commande ne les inclut pas. De plus, l'existence ou non de commits locaux n'a absolument rien à voir avec la question. – toon81

+0

JFTR, I 'git merge --squash mybranch', et' git diff master' m'a montré les changements dans les fichiers non-suivis. – muammar

+1

C'est impossible. Vous semblez être confus au sujet de ce que signifie «non traqué». Untracked ne signifie pas qu'un fichier est suivi dans une branche et pas dans une autre, cela signifie qu'il n'est pas "dans Git" n'importe où. Que vous écrasiez ou non ne fait aucune différence. 'git diff' ne montre pas de différences dans les fichiers non-suivis: parce qu'ils ne sont pas suivis, il n'y a jamais de différences à afficher, par définition. C'est juste comme ça que Git fonctionne. :) – toon81

11

Non 100% au point, mais comme il n'y a pas de réponse vraiment satisfaisante, ici encore un autre de ce genre;) Si les fichiers sont untracked, évidemment, le diff est le fichier entier, donc vous pouvez juste les voir avec moins:

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

Naviguer entre eux avec: n et: p pour suivant et précédent ..

+0

vous pouvez aussi lancer 'git diff/dev/null ' et obtenir le patch au format patch plutôt que "juste" un fichier – SimSimY

15

Les modifications fonctionnent lorsqu'elles sont mises en scène et non-étagées avec cette commande. Les nouveaux fichiers fonctionnent lorsqu'ils sont mis en scène:

$ git diff HEAD 

Si elles ne sont pas étagées, vous ne verrez que les différences de fichier.

+3

'HEAD' est la [valeur par défaut] (https: // git-scm .com/docs/git-diff # git-diff-emgitdiffem - options - cachedltcommitgt - ltpathgt82308203), donc c'est la même chose que 'git diff' qui ne résout pas le problème. –

2

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, il quittera le fichier dans l'état précédent (untracked)

utile si vous créez un patch aussi:

git diff --cached my_file.txt > my_file-patch.patch 
+0

Question dit: "mon meilleur pari à git ajouter les nouveaux fichiers que j'ai créés et les fichiers existants que j'ai édités, et utiliser' git diff --cached'? " Donc, fondamentalement, vous n'avez pas lu la question? Une amélioration utile serait de 'git add -A. git diff --cache; git reset'. – catpnosis

+0

avez-vous vraiment besoin d'être aussi grossier @catpnosis? Pensez-vous que j'aurais passé du temps à essayer d'aider quelqu'un sans même lire le message? –

+0

Pls, ne prenez pas personnellement. – catpnosis

0

Généralement quand je travaille avec des équipes de localisation à distance, il est important pour moi que je sache quelles modifications ont été faites par d'autres équipes dans le même fichier, avant de suivre git stages untrack -> staged -> com mit pour que j'ai écrit un script bash qui me aider à éviter des conflits inutiles résolution de fusion avec l'équipe à distance ou faire nouvelle succursale locale et de comparer et de fusionner 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 i aille chercher la branche principale à distance (non fichiers modifiés pour git difftool

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