2017-09-11 1 views
3

J'ai deux branches, A) développer et B) présententlivrez des changements manquants de fusion git

Je travaille sur B, et je suis maintenant prêt à fusionner B dans A. a évidemment eu beaucoup de travail, avec beaucoup d'autres branches de fonctionnalité fusionnant dans les demandes via pull. Je tire la dernière tête de A et à des fins de test, disons que je fusionne A dans B (Note, j'ai le même comportement dans les deux sens, mais j'essaie de comprendre où est le problème). J'ai fusionné A dans B, mais j'ai beaucoup d'erreurs de compilation après la résolution des conflits de fusion. J'ai remarqué qu'il y a du code inclus dans A qui ne le fait pas passer à B. Cela provoque l'échec de la construction, et il manque beaucoup de choses (c'est au moins une grande valeur de code de validation).

J'ai recherché le commit que j'ai des problèmes de "fusion" de A à B. Ce n'est pas qu'il ne fusionne pas, je le vois quand je tape "git log" quand B est extrait après la fusion . Pour une raison quelconque, les changements réels associés à la validation disparaissent. Il n'y a pas de conflits de fusion concernant le code en question, et je suis certain que je n'ai jamais touché à cette section pendant que je travaillais sur B pour que quelque chose d'autre puisse se produire.

En ce qui concerne le commit "manquant" (même si je le vois dans le journal des branches), que dois-je faire pour récupérer les changements réels? J'utiliserais un outil de comparaison, mais je crains que ce soit un symptôme d'un problème plus important et que d'autres codes que je ne connais pas pourraient également manquer. Je suis assez nouveau à git, donc je suis un peu incertain de la façon d'aborder cette question. S'il vous plaît laissez-moi savoir s'il y a d'autres informations qui pourraient être utiles.

Ce que j'ai essayé jusqu'à présent:

A Merging B, Commit est là, mais le code de Commit est pas B à A fusion, même problème avec même code/commit

J'ai essayé de rebaser, mais les branches sont éteintes par de nombreux commits avec beaucoup de conflits. Tous les commits sont également sur le serveur donc de ce que j'ai lu ceci peut être une mauvaise idée. S'il vous plaît laissez-moi savoir si je devrais essayer de rebaser dans une certaine direction (A-> B ou B-> A).

+0

Comme est assez commun, un [mcve] aiderait, mais même sans Il suffit de montrer la séquence de commandes de l'interpréteur de ligne de commandes (git check1 brit; – torek

Répondre

2

Solution

Si elle est juste un commit ce qui manque, vous pouvez facilement l'appliquer à la Une branche en émettant une commande écrémer tout en étant sur la branche B:

git cherry-pick commit_name 

Cette commande prend une validation spécifique (par nom) et l'applique à la branche actuelle en tant que nouvelle validation. Vérifiez simplement le nom de la validation dans votre journal et collez-le en tant qu'argument.

Voici quelques informations supplémentaires sur la commande: https://git-scm.com/docs/git-cherry-pick

En savoir plus sur la cause probable

En ce qui concerne le problème lui-même. Il peut y avoir de nombreuses raisons pour lesquelles vous vivez une telle situation, dont certaines peuvent être insignifiantes, d'autres non. Je dirais qu'il est plus probable que GIT voit les différences, mais pour une raison quelconque, il arrive à la conclusion qu'ils ne devraient pas être appliqués (pendant le processus d'auto-fusion).Vous devez vérifier l'historique de la branche B, comment et quand (en ce qui concerne ce commit) a été créé et a-t-il un historique avec ce commit spécifique. Quoi qu'il en soit, si les changements de cette validation ne sont pas physiquement présents dans le code B, un choix de cerise devrait vous aider à résoudre ce problème car il appliquera ces changements avec un nouveau nom de commit évitant ainsi tout problème.

+0

Appréciez l'aide, après avoir enquêté sur les commits (il y en avait deux) qui n'ont pas réussi à résoudre le problème, j'ai pu résoudre mon problème à l'aide de la sélection des cerises. Les commits avaient environ un mois, je suis toujours très curieux de savoir pourquoi les changements ont disparu lors d'une fusion, mais pour le moment je peux au moins éteindre le feu et continuer à travailler. – briansrls

1

Une raison peut être que vous avez fusionné A à B précédemment et géré le conflit d'une manière que votre commit a manqué.

Feature branches qui ont divergé de développent depuis si longtemps peut être difficile de revenir à fusionner développer (B -> A). Pour éviter cela, vous pouvez fusionner développer à fonctionnalité (A -> B) après un certain temps pour gérer le conflit entre les 2 branches jusqu'à présent. Dans ce cas, lorsque vous fusionnez A et B (dans n'importe quelle direction) à un moment ultérieur, la dose git ne mentionne plus les conflits traités.

Pour vérifier cela, « git log » B avant la fusion finale, si vous voyez le manque commettras cela signifie qu'il est déjà fusionné à B.