Comment faire en sorte que git merge gère les modifications non validées dans mon arbre de travail?

StackOverflow https://stackoverflow.com/questions/813822

  •  03-07-2019
  •  | 
  •  

Question

Un collègue et moi travaillons tous les deux sur la branche principale en ce moment. J'ai dans mon arbre de travail du code que je ne souhaite pas valider (instructions de débogage, etc.). Maintenant, s’il commet des modifications sur certains de ces mêmes fichiers, je ne peux pas les fusionner:

$ git merge origin/master
Updating 1b8c5c6..eb44c23
error: Entry 'blah.java' not uptodate. Cannot merge.

Venant d’un arrière-plan de subversion, j’ai l'habitude de fusionner automatiquement mon arbre de travail lorsque je récupère les modifications du référentiel et, en cas de conflit, de les résoudre manuellement.

Le moyen le plus rapide que j'ai trouvé pour faire cela dans git est:

$ git stash
$ git merge origin/master
$ git stash pop

Essentiellement, supprimer mes modifications non validées, effectuer la fusion, puis réappliquer les modifications. Comment puis-je dire à fusionner de fusionner automatiquement mon arbre de travail avec les modifications que j'essaye d'intégrer?

Était-ce utile?

La solution

Autant que je sache, le mieux que vous puissiez faire est d'utiliser ce que vous avez déjà avec git stash . Moi aussi, je trouve étrange que la fusion ne veuille s’occuper que des arbres propres.

Autres conseils

Oubliez tout ce que vous avez appris de la subversion.

Toujours valider avant d'introduire des modifications externes.

Imaginez que vous ayez un arbre essentiellement fonctionnel - peut-être pas parfait, mais vous faites des progrès. Ensuite, vous allez faire une fusion et le code que vous importez vient de faire des ravages (buggy lui-même, trop de conflits à gérer, etc.). Ce ne serait pas bien si vous pouviez simplement annuler cela?

Si vous vous engagez, vous le pouvez. Si vous ne le faites pas, vous allez simplement souffrir.

N'oubliez pas: ce que vous commettez ne doit pas être ce que vous poussez, mais vous pouvez facilement perdre ce que vous ne commettez pas.

Faites ce qui est sûr et facile, commettez-vous tôt et engagez-vous souvent.

  • Si le travail local n'est pas engagé
    • Et vous avez introduit de tout nouveaux fichiers qui n'existent pas dans la branche distante:
    • Ou les fichiers affectés par votre travail local ont un chevauchement nul avec ceux affectés par les modifications que vous devez extraire de la télécommande:
      • Vous avez de la chance: git pull fonctionnera simplement.
    • Sinon:
      • Si vos modifications locales ne chevauchent PAS les modifications que vous extrayez:
        • git stash fonctionnera:
          • git stash save
          • git pull
          • git stash pop
      • Si vos modifications locales se chevauchent en quelque sorte avec les modifications que vous extrayez:
        • git stash nécessitera une résolution manuelle du conflit:
          • git stash save
          • git pull
          • git stash pop
          • résoudre les conflits de fusion
          • réinitialisation de git
          • drop stash git
  • Si un travail local est engagé
    • Et les fichiers affectés par votre travail local ont un chevauchement nul avec les fichiers affectés par
      • Vous avez de la chance: git pull fonctionnera simplement.
      • Cependant: git pull --rebase fonctionnera encore mieux " à cause d'une histoire plus propre
      • il n'y a pas de commit de fusion; vos modifications seront validées après les modifications en amont
    • Sinon:
      • git pull nécessitera une résolution manuelle du conflit:
        • git pull
        • résoudre les conflits de fusion
        • git ajoute FICHIER pour chaque FICHIER en conflit
        • git commit
      • git pull --rebase pourrait toujours "fonctionner encore mieux" à cause d'une histoire plus propre
        • cependant, la résolution des conflits de fusion pourrait être beaucoup plus difficile

Pour une explication détaillée, consultez la page https://happygitwithr.com/pull-tricky.html.

Vous ne pouvez pas dire à git merge de fusionner les modifications apportées aux fichiers comportant des modifications par rapport à votre référentiel local. Cela vous évite de perdre vos modifications lors des fusions.

Avec l'approche de fusion CVS et SVN, si vous n'avez pas copié manuellement vos fichiers avant la mise à jour et que ceux-ci ont été brouillés lors de la fusion, vous devez les ré-éditer manuellement pour revenir à un état correct.

Si vous validez vos modifications ou si vous les stockez avant de procéder à une fusion, tout est réversible. Si la fusion ne se déroule pas bien, vous pouvez essayer plusieurs façons de la faire fonctionner et choisir celle qui fonctionne le mieux.

Si vous validez des modifications expérimentales ou de débogage, vous pouvez utiliser git rebase pour les déplacer après les validations que vous obtenez via git merge pour faciliter l'élimination. ou pour éviter de les pousser accidentellement vers un référentiel.

Notez que l'utilisation de git rebase sur une branche que vous avez poussée dans un référentiel partagé causera des problèmes à toutes les personnes qui extraient de ce référentiel.

Je préfère utiliser git stash dans ces cas, mais je ne l'utilise que si la fusion modifie les fichiers que j'ai modifiés et non validés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top