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
?
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).
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
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:
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.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!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.
git add -A
git diff HEAD
Générez le correctif si nécessaire, puis:
git reset HEAD
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.
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
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 }
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.