web-dev-qa-db-fra.com

Git Merge - Fichiers et dossiers incomplets et manquants

J'essayais de fusionner une branche de développement en maître.

git checkout master    
git pull . dev

Tout semblait bien se passer, même s'il y avait des conflits, je les ai résolus et commis. Mais quand j'ai vérifié cette arborescence de travail nouvellement fusionnée, il manque beaucoup de dossiers et de fichiers de dev.

git status  // Shows conflicts & doesn't list some files/folders.    
git commit -a 

Created commit 55ffdd1: Merge branch 'dev' into master  

git diff dev --name-status

Produit:

D       folders/lm.gif
D       folders/lmh.gif
...

Donc, les fichiers/dossiers qui ne s'affichent pas sur "git status". Cela ne s'est pas non plus révélé à la fin lorsque j'ai corrigé les conflits fusionnés.

Aussi quand j'essaye de fusionner à nouveau, il dit:

git merge dev    
Already up-to-date.

Pourtant, la branche principale manque clairement de fichiers/dossiers de la branche de développement. Pourquoi donc? Ce dossier et tout son contenu ne devraient-ils pas être ajoutés? Les 'dossiers' sont suivis sur la branche de développement, alors ne devraient-ils pas être récupérés lorsque j'ai fait la fusion?

Quand il y avait un conflit de fusion plus tôt, git a-t-il arrêté le processus de fusion et ignoré un tas de fichiers/dossiers?

La branche de développement a eu beaucoup de changements, aurais-je pu gâcher quelque chose avec git dans le passé que maintenant certains fichiers/dossiers n'auraient pas fusionné?

(Lorsque j'ai créé la branche de développement pour la première fois, je ne savais pas ce que je faisais et j'ai fait des choses folles comme la réinitialisation, les retours, etc.)

En espérant que l'un de vous, gourou de git ici sur débordement de pile, connaît la réponse. :)

Merci Quang


Répondre

Merci Walter, oui c'est ce qui s'est passé.

Après avoir enquêté, j'ai découvert que ce qui s'était passé était un peu compliqué. Il s'est avéré que.

  1. dev dérivé de master, il avait tous les fichiers.
  2. Une troisième branche, appelons-la "nettoyée", dérivée du dev.
  3. la branche nettoyée a supprimé tous les fichiers.
  4. branche nettoyée fusionnée (ou quelque chose?) avec le maître. À ce stade, les fichiers ont été supprimés du maître. Et la branche "nettoyée" a disparu.
  5. sur dev, les fichiers sont toujours là et j'ai continué à ajouter à cette branche, en éditant les fichiers pendant un certain temps.
  6. dev a fusionné avec master et tous les fichiers qui ont été supprimés précédemment par nettoyés ont disparu.

J'espère que cela a aidé quelqu'un en plus de moi qui a beaucoup appris sur la façon d'utiliser git log, git show, git reflog en essayant de déboguer ce qui s'est passé.

Merci!

Comment réparer

C'est donc ce que j'ai fait pour fusionner tous les contenus en dev qui ont été précédemment supprimés sur master.

  1. Vous avez tous les fichiers/dossiers qui ont été supprimés (sur dev mais pas sur le master nouvellement fusionné) git diff dev --name-status | grep D > deleted_files
  2. Liste de sortie de tous les fichiers et dossiers git log --name-status > file_history Je vais l'utiliser pour déterminer la dernière version mise à jour du fichier supprimé.
  3. Parcourez la liste des fichiers supprimés un par un, trouvez la version la plus à jour dans file_history et restaurez-la. Exemple: git checkout 25b8a44 view.php 25b8a44 ... était le commit avec la dernière version mise à jour de view.php. J'ai essayé cherry-pick et juste une ligne droite git checkout dev view.php mais j'ai trouvé explicitement en utilisant l'ID de validation, il fusionne plus de son histoire. (Y compris le commit qui entraîne la suppression du fichier en premier lieu.)
  4. Une fois que tous les fichiers supprimés sont de retour, une vérification rapide git diff dev --name-status | grep D montre que tous les fichiers sont copiés. Puis, comme Walter l'a dit, un ammend commit git commit --amend :)
38
Quang Van

Il semble que git pense que les fichiers manquants ont été supprimés sur le maître à un moment donné entre le branchement de dev et la tête de pré-fusion. C'est la seule raison pour laquelle je peux penser pourquoi git abandonnerait silencieusement les fichiers suivis lors d'une fusion.

Malheureusement, je ne connais pas un bon moyen de résoudre ce problème. Je rajouterais probablement tous les fichiers supprimés de la branche dev manuellement (ou avec un peu de script bash), puis à un git commit --amend pour réviser le commit de fusion afin de les inclure.

21
Walter Mundt