54 votes

Les fichiers modifiés dans une branche git débordent dans une autre branche

Je travaille sur un dépôt git avec une branche principale et une autre branche de sujet. J'ai basculé sur la branche de sujet et modifié un fichier. Maintenant, si je passe à la branche principale, ce même fichier est affiché comme modifié.

Par exemple:

état de git dans la branche git-build :

# Sur la branche git-build
# Modifications à valider :
#   (utilisez "git reset HEAD ..." pour désindexer)
#
#       modifié:   cvsup_current
#

Passer à la branche principale

[root@redbull builder_scripts (git-build)]# git co master
M       builder_scripts/cvsup_current
Basculé sur la branche "master"

état de git dans la branche principale :

[root@redbull builder_scripts (master)]# git status
# Sur la branche master
# Modifications à valider :
#   (utilisez "git reset HEAD ..." pour désindexer)
#
#       modifié:   cvsup_current
#

Pourquoi le fichier est-il indiqué comme modifié dans la branche principale alors qu'il a été modifié dans la branche git-build ?

Je pensais que les branches étaient indépendantes les unes des autres et que lorsque je passais d'une branche à une autre, les modifications ne se "déversaient pas" d'une branche à une autre. Donc, évidemment, je rate quelque chose ici.

Est-ce que quelqu'un a une idée?

67voto

Gareth Points 42402

Pourquoi le fichier est-il indiqué comme modifié dans la branche principale même s'il a été modifié dans la branche git-build?

La clé à retenir est que le fichier n'a pas été modifié dans la branche git-build. Il a uniquement été modifié dans votre copie de travail.

Seulement lorsque vous effectuez un commit, les changements sont intégrés dans la branche que vous avez sélectionnée.

0 votes

Merci, les réponses combinées m'ont beaucoup éclairé!

0 votes

Je viens de réaliser, venant d'une mentalité SVN, que commettre dans une branche n'est pas en réalité un envoi à votre serveur "SVN", c'est plutôt un "sauvegarder mes modifications dans cette branche". J'essaie toujours de m'adapter.

4 votes

"Il a été modifié uniquement dans votre copie de travail" <-- non, il a également été modifié dans l'index, c'est-à-dire que le changement a été mis en attente

43voto

Peter Burns Points 17420

Si vous souhaitez stocker temporairement vos modifications sur une branche tout en travaillant sur une autre, vous pouvez utiliser la commande git stash. C'est l'un des petits avantages méconnus de l'utilisation de git. Exemple de workflow :

git stash #travail sauvegardé
git checkout master
#modifier les fichiers
git commit
git checkout git-build
git stash apply #restaurer le travail précédent

git stash stocke une pile de modifications, de sorte que vous pouvez stocker en toute sécurité plusieurs points de contrôle. Vous pouvez également leur donner des noms/descriptions. Informations complètes sur l'utilisation ici.

1 votes

Bien que cela ne réponde pas directement à la question du pourquoi, cette réponse correspond le mieux à l'intention de ce que l'auteur de la question essayait de faire. C'est exactement ce que je cherchais

1 votes

Git stash ne sécurisera pas les nouveaux fichiers. Il met en réserve uniquement les fichiers déjà suivis. Donc, si on a créé de nouveaux fichiers, même après avoir mis en réserve, ces nouveaux fichiers seront disponibles dans d'autres dossiers.

15voto

Marko Points 13736

Ceci est le comportement par défaut de git.

Vous pouvez utiliser le drapeau -f pour effectuer un "nettoyage du checkout" si vous le souhaitez.

14 votes

Soyez conscient que cela ne conserve pas les changements en haut de la branche que vous quittez ou autre. Cela va supprimer les changements non validés (sauf si le fichier est non suivi).

9 votes

C'est le cas très rare où vous voulez utiliser git checkout -f car cela jettera instantanément, irrévocablement et sans avertissement toutes les modifications non validées. Il y a une raison pour laquelle git checkout fonctionne de cette manière, je vous conseille de lire le commentaire de Gareth ci-dessous.

10voto

Greg Hewgill Points 356191

Les fichiers modifiés ne sont pas ajoutés au référentiel tant que vous ne les ajoutez et ne les validez pas. Si vous revenez à votre branche thématique et que vous validez le fichier, alors il n'apparaîtra pas sur la branche principale.

3voto

Raviteja Points 1012
  • Il ne s'agit pas non plus que les branches git soient dépendantes les unes des autres, mais elles n'ont pas non plus une base de code complète séparément pour chaque branche.
  • Pour chaque commit, Git stocke un objet qui contient un pointeur vers les changements. Ainsi, chaque branche pointe vers son propre dernier commit et HEAD pointe vers la branche dans laquelle vous vous trouvez actuellement.
  • Lorsque vous changez de branche, le pointeur HEAD pointe vers ce commit particulier de la branche. Donc, s'il y a des fichiers modifiés, le comportement par défaut est de les copier.

Vous pouvez faire les choses suivantes pour surmonter ce problème.

  1. Utilisez l'option -f pour ignorer les changements.

Si vous voulez sauvegarder les changements:

  1. Validez les changements localement dans la même branche, puis changez de branche.
  2. Utilisez git stash, changez de branche, faites votre travail, revenez à la branche d'origine et faites git stash apply.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X