Pourquoi «git commit» n'enregistre-t-il pas mes modifications?

251

J'ai fait git commit -m "message"ça comme ça:

> git commit -m "save arezzo files"
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   arezzo.txt
#       modified:   arezzo.jsp
#
no changes added to commit (use "git add" and/or "git commit -a")

Mais après, quand je le fais, git statusil montre les mêmes fichiers modifiés:

> git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   arezzo.txt
#       modified:   arezzo.jsp
#
no changes added to commit (use "git add" and/or "git commit -a")

Qu'est-ce que je fais mal?

arezzo
la source
16
Utilisez git commit -am "save arezzo files"pour ajouter automatiquement toutes les modifications (wrt .gitignore). Vous voudrez peut-être ajouter uniquement des fichiers / répertoires spécifiques:git add file.src
mbx

Réponses:

400

Comme le dit le message:

aucune modification ajoutée pour valider (utilisez "git add" et / ou "git commit -a")

Git a une "zone de transit" où les fichiers doivent être ajoutés avant d'être validés, vous pouvez en lire l'explication ici .


Pour votre exemple spécifique, vous pouvez utiliser:

git commit -am "save arezzo files"

(notez le supplément adans les drapeaux, peut également s'écrire git commit -a -m "message"- les deux font la même chose)

Alternativement, si vous voulez être plus sélectif sur ce que vous ajoutez au commit, vous utilisez la commande git add pour ajouter les fichiers appropriés à la zone de transit , et git status pour prévisualiser ce qui est sur le point d'être ajouté (en vous rappelant de faire attention à la formulation utilisée).

Vous pouvez également trouver de la documentation générale et des tutoriels sur l'utilisation de git sur la page de documentation de git qui donnera plus de détails sur le concept de transfert / ajout de fichiers.


Une autre chose à savoir est la mise en scène interactive - cela vous permet d'ajouter des parties d'un fichier à la zone de mise en attente, donc si vous avez fait trois changements de code distincts (pour des fonctionnalités liées mais différentes), vous pouvez utiliser le mode interactif pour diviser le changements et ajouter / valider chaque partie à son tour. Avoir des commits spécifiques plus petits comme celui-ci peut être utile.

Peter Boughton
la source
@PeterBoughton vouliez-vous dire "ajout interactif" au lieu de "ajout interactif"?
djb
3
Non, je voulais dire l'ajout interactif.
Peter Boughton
2
Le référentiel local est une sorte de zone de transit avant de pousser le code vers le référentiel distant. Pourquoi ajouter une autre "couche" avant de valider les modifications, n'est-ce pas un peu trop compliqué? Je suis nouveau sur git mais j'imagine que 99,99% des développeurs utilisent toujours commit -am parce que les modifications ne sortent pas de toute façon de leur environnement local.
PawelRoman
2
Je pense que je viens de tomber dessus parce que je suis habitué à ce que mon IDE s'en occupe pour moi. Je ne sais pas pourquoi c'est une étape nécessaire non plus, mais là encore, il y a beaucoup de choses sur git que je ne reçois pas ... je veux dire git ...
trpt4him
49

Vous n'avez pas ajouté les modifications. Soit les ajouter spécifiquement via

git add filename1 filename2

ou ajouter toutes les modifications (à partir du chemin racine du projet)

git add .

ou utilisez le raccourci -alors de la validation:

git commit -a -m "message".
Femaref
la source
De plus, j'exhorte fortement les utilisateurs à utiliser l'ajout interactif. Surtout quand vous essayez de faire de jolis petits commits qui sont facilement réversibles.
Jer
40

Tu devrais faire:

git commit . -m "save arezzo files"
Baptiste Pernet
la source
4
Cela semble être la bonne réponse à la question du PO. Il ne voulait pas "ajouter", il voulait valider ce qui avait été modifié.
VectorVortec
8

J'ai copié un petit sous-projet que j'avais sous contrôle de source Git dans un autre projet et j'ai oublié de supprimer le dossier .git. Lorsque je suis allé valider, j'ai reçu le même message que ci-dessus et je n'ai pas pu le supprimer avant d'avoir supprimé le .gitdossier.

C'est un peu idiot, mais cela vaut la peine de vérifier que vous n'avez pas de dossier .git sous le dossier qui ne s'engage pas.

Simon Hutchison
la source
7

Vous auriez pu faire:

git add -u -n

Pour vérifier quels fichiers vous avez modifiés et vont être ajoutés (essai à sec: option -n), puis

git add -u

Pour ajouter des fichiers juste modifiés

Albert Vonpupp
la source
4

Je trouve que ce problème apparaît lorsque j'ai fait un git add .dans un sous - répertoire ci-dessous où réside mon .gitignorefichier (le répertoire personnel de mon référentiel, pour ainsi dire). Essayez de changer les répertoires en votre répertoire supérieur et exécutez git add .suivi de git commit -m "my commit message".

jam99
la source
4

Peut-être une chose évidente, mais ...

Si vous avez un problème avec l'index, utilisez git-gui . Vous obtenez un très bon aperçu du fonctionnement réel de l'index (zone de transit).

Une autre source d'information qui m'a aidé à comprendre l'index était Scott Chacons "Getting Git" page 259 et suivantes.

J'ai commencé à utiliser la ligne de commande car la plupart de la documentation montrait seulement que ...

Je pense que git-gui et gitk me font travailler plus vite, et je me suis débarrassé des mauvaises habitudes comme "git pull" par exemple ... Maintenant, je vais toujours chercher en premier ... Voyez quels sont vraiment les nouveaux changements avant de fusionner.

Martin
la source
3

La raison pour laquelle cela se produit est que vous avez un dossier qui est déjà suivi par Git dans un autre dossier qui est également suivi par Git. Par exemple, j'avais un projet et j'y ai ajouté un sous-dossier. Les deux étaient suivis par Git avant que je ne les mette l'un dans l'autre. Afin d'arrêter le suivi de celui à l'intérieur, recherchez-le et supprimez le fichier Git avec:

rm -rf .git

Dans mon cas, j'avais une application WordPress et le dossier que j'ai ajouté à l'intérieur était un thème. J'ai donc dû aller à la racine du thème et supprimer le fichier Git, afin que l'ensemble du projet soit désormais suivi par le parent, l'application WordPress.

drjorgepolanco
la source
1

si vous avez plus de fichiers dans mon cas, j'ai 7000 fichiers image lorsque j'essaie de les ajouter à partir du dossier de route du projet, il ne les a pas ajoutés , mais quand je vais dans le dossier image, tout va bien. Parcourez le dossier cible et commandez comme abows

git add .
git commit -am "image uploading"
git push origin master

git push origin master Enumération des objets: 6574, fait. Comptage d'objets: 100% (6574/6574), fait. Compression Delta utilisant jusqu'à 4 threads Compression d'objets: 100% (6347/6347), fait. Objets d'écriture: 28% (1850/6569), 142,17 Mio | 414.00 Kio / s


la source
0

J'ai eu un problème où je faisais commit --amendmême après avoir émis un git add .et cela ne fonctionnait toujours pas. Il s'avère que j'ai fait quelques .vimrcpersonnalisations et que mon éditeur ne fonctionnait pas correctement. La correction de ces erreurs afin que vimrenvoie le code correct a résolu le problème.

Brennan Cheung
la source
0

J'ai eu un problème très similaire avec le même message d'erreur. "Les changements ne sont pas par étapes pour la validation", mais quand je fais un diff, cela montre des différences. J'ai finalement compris qu'il y a quelque temps, j'avais changé un cas de répertoires. ex. "PostgeSQL" à "postgresql". Comme je m'en souviens maintenant, parfois git laisse un fichier ou deux derrière dans l'ancien répertoire de cas. Ensuite, vous allez valider une nouvelle version dans le nouveau boîtier.

Git ne sait donc pas sur qui s'appuyer. Donc, pour le résoudre, j'ai dû aller sur le site Web du github. Ensuite, vous pouvez afficher les deux cas. Et vous devez supprimer tous les fichiers dans le répertoire casé incorrect. Assurez-vous d'avoir la bonne version enregistrée ou dans le bon répertoire de casse.

Une fois que vous avez supprimé tous les fichiers de l'ancien répertoire de cas, ce répertoire entier disparaîtra. Faites ensuite un commit.

À ce stade, vous devriez pouvoir effectuer un Pull sur votre ordinateur local et ne plus voir les conflits. Pouvant ainsi s'engager à nouveau. :)

brianwaganer
la source
0

si vous avez un sous-dossier, qui a été cloné à partir d'un autre git-Repository, vous devez d'abord supprimer le fichier $ .git $ du child-Repository: rm -rf .git après cela, vous pouvez changer pour le dossier parent et l'utiliser git add -A.

Sam Toorchi
la source