Pourquoi git continue d'afficher mes modifications lorsque je change de branche (fichiers modifiés, ajoutés, supprimés), que j'exécute git add ou non?

115

Je suis vraiment nouveau dans git et j'ai essayé de comprendre pourquoi git continue d'afficher tout ce que j'ai changé dans une branche d'une autre branche lorsque j'exécute git checkout pour basculer entre les branches J'ai d'abord essayé de ne pas utiliser git add et je n'ai pas fonctionné. Cependant, j'ai essayé d'utiliser git add, mais je n'ai pas résolu le problème. Je n'utilise pas encore git commit.

C'est essentiellement ce que je fais:

$ git clone <a_repository>  
$ git branch  
* master  
$ git branch testing  
$ git checkout testing  
...edit a file, add a new one, delete...  
$ git status  
    # On branch testing  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  
$ git branch  
  master  
* testing  
$ git checkout master  
D       file1.txt  
Switched to branch 'master'  
$ git status  
    # On branch master  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  

Je pensais que tout en utilisant des branches, quoi que vous fassiez dans une branche, c'était invisible pour toutes les autres branches. N'est-ce pas la raison de la création de succursales?

J'ai essayé d'utiliser "git add" mais les changements sont visibles dans les deux branches. Dois-je exécuter "git commit" avant de basculer entre les branches pour éviter cela?

JPZ
la source

Réponses:

142

Changer de branche entraîne des changements non validés avec vous. Commencez par valider, exécutez git checkout .pour les annuler ou exécutez git stashavant de changer. (Vous pouvez récupérer vos modifications avec git stash apply)

Sean Clark Hess
la source
10
git stash pop est meilleur à moins que vous ne vouliez accumuler une énorme pile de cachettes.
siride
7
@JPZ: git stash ne traite que les fichiers suivis; les nouveaux fichiers ne sont pas suivis, donc ils ne seront pas cachés.
siride
2
@JPZ: Si vous souhaitez ranger les fichiers non suivis, la chose à faire est de git addles stocker avant de les ranger. Cela dit, je ne suis pas sûr que vous souhaitiez réellement vous cacher ici - si vous avez l'intention que ces changements fassent partie de la branche dont vous vous éloignez, validez-les. (Si vous avez l'intention de revenir à cette branche et de travailler davantage sur les changements avant de les valider, alors stashpeut-être le bon outil pour le travail.)
Cascabel
16
"Changer de branche entraîne des changements non validés avec vous" - Cela a du sens et peut-être la pire idée de conception. Quel est l'intérêt d'avoir des succursales si vous ne pouvez pas travailler de manière isolée? !!!
nehem du
1
Dans mon cas, j'ai une branche de fonctionnalité d'une branche de développement. Je me suis engagé dans la branche des fonctionnalités, mais cela montre également les modifications lorsque je vérifie la branche de développement.
Hitesh Garg le
31

Réponse courte: oui, vous devez vous engager. Assurez-vous de le faire sur la bonne branche, cependant!

Une branche est un pointeur vers un commit. Lorsque vous vous engagez avec une branche extraite, la branche avance pour pointer vers cette nouvelle validation. Lorsque vous extrayez une branche, vous vérifiez le commit vers lequel elle pointe. (Vous pouvez considérer les commits comme des instantanés de votre arbre de travail.)

Donc, si vous avez des modifications que vous n'avez pas validées, elles ne seront pas affectées par le changement de branche. Bien sûr, si le changement de branche est incompatible avec vos modifications, git checkoutrefusera simplement de le faire.

git addest une commande de préparation des modifications, que vous validerez ensuite. Il n'enregistre pas ces modifications dans l'historique du référentiel. Il les place simplement dans une zone de transit (l'index); git commitutilise ensuite le contenu de cette zone de préparation pour créer des validations.

Cascabel
la source