11
votes

Comment obtenir Git pour fusionner correctement le contenu déplacé (non seulement des fichiers)

Je cherche actuellement à beaucoup de fonctionnalités de suivi du contenu de GIT. Il est très agréable de savoir que Git me permet de comprendre le code qui a été déplacé d'un fichier à un autre, mais je me demande comment cette fonctionnalité est utilisable lors de la résolution des conflits dans la fusion.

Voici le scénario:

J'ai deux fichiers hello.cc et bye.cc créé. Je lance une succursale sujet et déplacez du code à partir de hello.cc à bye.cc . Si je fais maintenant un git blame -c bye.cc Je peux voir que ce code provenait à l'origine de hello.cc qui est agréable à savoir. Cependant, je passe maintenant à la branche d'origine sans le contenu déplacé et modifie du code dans la section dans hello.cc qui a été déplacé dans l'autre commit. Si je fais maintenant un git fusion de sujet , je reçois un conflit pour hello.cc . Toutefois, sauf si j'utilise un style diff3 (que je fais de manière utilisée), je ne peux que voir que cette méthode a été supprimée de hello.cc dans l'autre branche, mais pas qu'il a été modifié par la suite. Ce qui serait bien serait de créer un conflit sur bye.cc car il serait nécessaire de vérifier si ces variations de l'autre branche devront être réappliquées au code. Est-ce en quelque sorte possible?

Je sais que je peux comprendre manuellement, que le code a été déplacé en faisant un git blâme - extrémité de l'autre ... . Cependant, pour celui qui m'a pris assez de temps pour comprendre cette possibilité et la plupart des autres ne sauront probablement pas à ce sujet. Pour la seconde, je suis paresseux et oubliera probablement que le code aurait pu être déplacé. De plus, je ne suis pas sûr que cela fonctionne lorsque le code a été déplacé dans plusieurs fichiers.

Quelle serait votre façon de garder cette situation aussi sûre que possible?

edit :

Je viens de découvrir que git blame --Reverse -c hello.cc (rubrique de tête de base de git fusion) .. Topic fonctionne également pour savoir où le contenu déplacé. Et si je comprends bien git correctement, cela est probablement plus rapide, car il ne fera pas une recherche complète du contenu dans le référentiel complet.

edit :

J'ai téléchargé le référentiel J'utilise pour jouer autour de Github afin que vous puissiez essayer la fusion de la fusion toi-même. Le commit où j'ai déplacé la fonction est dans la succursale. Le commit où la même fonction est modifiée en maître à la tête de la branche merge_heere . Il y a un commit supplémentaire en maître dans lequel je jouais avec d'autres techniques de fusion, que vous devez ignorer pour cette question.


0 commentaires

3 Réponses :


-4
votes

Vous pouvez utiliser Git pour mettre tout ce qui va de commettre cela fonctionnera bien.


1 commentaires

Oui bien sûr. Je sais que ça. Mais quelle est la meilleure façon d'obtenir Git de me donner des astuces et des avertissements sur ce qu'il faut mettre dans la validation, soit par l'utilisation des outils, soit par des conflits de fusion.



5
votes

Je crains que cela ne soit pas possible pour que Git reconnaisse automatiquement le code déplacé dans la fusion et la production de conflits, etc., à moins que ce ne soit des fichiers entiers renommés.

Il y avait déjà quelques discussions sur ce sujet ici, comme Comment git gérer le code de fusion a été déplacé vers un fichier différent? et GIT Fusionne: Appliquez les modifications apportées au code qui a été déplacé vers un fichier différent .


0 commentaires

0
votes

Malheureusement, je suis arrivé au même piège avec mon code, après le déménagement de fichier à Git, il ne reconnaît pas le changement lors de la fusion de branche. Il semble que la règle d'or il faut guider le travail avec le mouvement est la suivante:

Gardez le mouvement de code distinct des modifications

Git ne peut pas suivre de tels cas, comme pour le moment. Et il semble qu'il n'ya pas de solution rapide / automatisée pour trouver des problèmes potentiels après le déplacement du fichier, puis fusionner.

Même si vous saurez que les deux commettrent où le problème s'est produit et essayera d'appliquer un correctif ou de revenir à des modifications perdues après le déplacement + fusionnage, vous serez toujours rejeté de GIT As-même: < Pré> xxx


0 commentaires