web-dev-qa-db-fra.com

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

Un collègue et moi travaillons tous les deux sur la branche principale en ce moment. J'ai du code dans mon arbre de travail que je ne veux pas valider (instructions de débogage et autres). Maintenant, s'il valide les modifications de 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.

Issu d'un arrière-plan Subversion, j'ai l'habitude de fusionner automatiquement mon arbre de travail lorsque je récupère les modifications du référentiel et s'il y a des conflits, je les résous manuellement.

Le moyen le plus rapide que j'ai trouvé pour le faire 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 à Merge de fusionner automatiquement mon arborescence de travail avec les modifications que j'essaie de récupérer?

47
Jeremy Huiskamp

Pour autant que je sache, le mieux que vous puissiez faire est ce que vous avez déjà avec git stash. Moi aussi, je trouve étrange que la fusion veuille uniquement traiter des arbres propres.

20
Norman Ramsey

Oubliez tout ce que vous avez appris de Subversion.

Toujours valider avant d'introduire des modifications externes.

Imaginez que vous disposiez d'un arbre qui fonctionne principalement - peut-être pas parfait, mais vous progressez. Ensuite, vous allez faire une fusion et le code que vous apportez vient de faire des ravages (était un buggy lui-même, trop de conflits à gérer, etc.). Ne serait-ce pas bien si vous pouviez simplement annuler cela?

Si vous vous engagez, vous le pouvez. Sinon, vous allez juste souffrir.

Rappelez-vous: ce que vous engagez ne a pas ce que vous Poussez, mais ce que vous ne vous engagez pas, vous pouvez facilement le perdre.

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

38
Dustin
  • Si le travail local n'est pas engagé
    • Et vous avez introduit des fichiers complètement nouveaux qui n'existent pas dans la branche distante:
    • Ou les fichiers affectés par votre travail local ont un chevauchement ZÉRO avec les fichiers affectés par les modifications que vous devez extraire de la télécommande:
      • Tu es chanceux: git pull "fonctionnera tout simplement"
    • Autrement:
      • Si vos modifications locales n'ont AUCUN chevauchement avec les modifications que vous tirez:
        • git stash fonctionnera:
          • git stash save
          • git pull
          • git stash pop
      • Si vos modifications locales ont QUELQUE chevauchement avec les modifications que vous tirez:
        • git stash nécessitera une résolution manuelle des conflits:
          • git stash save
          • git pull
          • git stash pop
          • résoudre les conflits de fusion
          • git reset
          • git stash drop
  • Si un travail local est engagé
    • Et les fichiers affectés par votre travail local ont un chevauchement ZÉRO avec les fichiers affectés par
      • Tu es chanceux: git pull "fonctionnera tout simplement"
      • Cependant: git pull --rebase "fonctionnera encore mieux" en raison d'une histoire plus propre
      • il n'y a pas de validation de fusion; vos modifications seront validées après les modifications en amont
    • Autrement:
      • git pull nécessitera une résolution manuelle des conflits:
        • git pull
        • résoudre les conflits de fusion
        • git add FILE pour chaque FICHIER en conflit
        • git commit
      • git pull --rebase pourrait encore "fonctionner encore mieux" en raison d'une histoire plus propre
        • cependant, la résolution des conflits de fusion pourrait être beaucoup plus difficile

Pour une explication détaillée, veuillez consulter: https://happygitwithr.com/pull-tricky.html

3
Leonardo Gonzalez

Vous ne pouvez pas dire git merge pour fusionner les modifications sur les fichiers qui ont des modifications par rapport à votre référentiel local. Cela vous protège de la perte de vos modifications aux moments où une fusion se passe mal.

Avec l'approche CVS et SVN de la fusion, si vous n'avez pas copié manuellement vos fichiers avant la mise à jour et qu'il les a brouillés lors de la fusion, vous devez rééditer manuellement pour revenir à un bon état.

Si vous validez ou modifiez vos modifications avant d'effectuer une fusion, tout est réversible. Si la fusion ne se passe pas bien, vous pouvez essayer plusieurs façons de la faire fonctionner et choisir celle qui fonctionne le mieux.

Si vous effectuez 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 leur élimination ou pour éviter de les envoyer accidentellement dans un référentiel.

Notez que l'utilisation de git rebase sur une branche que vous avez poussée vers un référentiel partagé causera du chagrin à tous ceux qui tirent de ce référentiel.

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

2
Jamey Hicks