dire que j'ai la fonction x dans le fichier A et je voulais déplacer cette fonction pour fichier B. Entre-temps, quelqu'un d'autre a apporté des modifications à la fonction X dans le fichier A. P>
git fait-il quelque chose de spécial lors de la fusion de ces deux changements? Est-ce que cela reconnaîtrait la même fonction a été déplacé vers le fichier B et appliquer les changements là-bas? Ou allons-nous finir par perdre les modifications ou avoir deux copies de la même fonction dans le fichier A et B? P>
La plupart des articles que j'ai trouvés sur le changement de code dans Git se réfèrent principalement à la recherche de fichiers entiers et non à des blocs de code dans les fichiers. Le plus proche que j'ai trouvé est un Blurb de Linus à Kerneltrap : P>
et lorsque vous utilisez GIT, le tout 'garder mouvement de code distinct des changements ' a une raison encore plus fondamentale: git peut suivre le mouvement de code (à nouveau, si déplacer un fichier entier ou juste un fonction entre fichiers), et faire un 'git blame -c' va réellement suivre Mouvement de code entre les fichiers. Cela fait que par analyse de similitude, mais il signifie que si vous déménagez tous les deux le code et em> le changer en même temps, git ne peut pas voir ça 'oh, cette fonction est venu originaire de cet autre fichier ', et maintenant vous grossissez les annotations à propos de l'origine du code d'origine. P> blockQuote>
Il semble donc que GIT reconnaîtra que le code a été déplacé ailleurs, mais ne dit pas vraiment ce qui se passe lors d'une fusion. P>
4 Réponses :
Non, git ne fera pas ce niveau de changement. Il remarquera que lorsque vous déplacez un fichier entier; Ainsi, par exemple, si vous avez déplacé le fichier, supprimé tout ce qui y est, cela pourrait alors avoir une chance de ramasser les changements. Mais cela ne fait pas de changement sur un sous-fichier ou une sorte de refactoring. p>
Donc, si je fusionne les modifications à x dans A dans ma branche où j'ai déplacé X à B, je perdrais essentiellement ces changements parce que Git pense que j'ai supprimé ces lignes? Je suppose que j'ai juste besoin de regarder soigneusement les diffs alors ...
Vous ne les perdrez pas: vous devrez fusionner le conflit à la main.
Je ne pense pas que la réponse précédente soit correcte dans l'affaire Général, car GIT ne se soucie pas vraiment des fichiers - le nom de fichier est utilisé comme base de certaines heuristiques, mais la façon dont GIT pense que le contenu n'est pas. centré entièrement autour de l'idée d'un fichier. Contrairement à d'autres VCSS, Git Tracks Contenu em> et, dans ce cas, le contenu a été déplacé, mais c'est le même contenu em>. P>.
En conséquence, GIT doit être capable de gérer des fantasmes entre les branches, même lorsque des fichiers ont été renommés ou que le code se déplace entre les fichiers, donc en fonction de ce que vous avez fait exactement, cela gérera probablement la fusion bien. P >
Tant que les modifications apportées à X ne causent pas de conflit de fusion (ce qui pourrait se produire si vous aviez changé la version d'origine et em> la version renommée), le fait que x a été déplacé à B n'aurait pas d'importance et le résultat de la fusion devrait contenir le résultat des deux changements. S'il est est em> un problème, il indiquerait que GIT n'a pas correctement suivi le mouvement du code. P>
En pratique, la réponse précédente repose probablement sur une expérience personnelle lorsque les machines de détection ont échoué, auquel cas https://git.wiki.kernel.org/index.php/gitfaq#how_to_mantura_resolve_conflicts_when_git_failed_to_detect_rename.3f peut être utile. P>
Cette réponse est correcte en cas de nom de fichier (tant que comme des commits sont petits par rapport à la taille du fichier afin que renommez la détection n'échouent pas). Mais la question est explicitement pas i> à propos de renomme, mais déplacez une partie d'un fichier dans un autre fichier. Dans ce cas, git échoue de manière fiable, même avec des tests simples. Se déplacer dans le fichier est le même, échouant de manière constante.
Je pense que Alblue est correct, pas NYE. P>
Dans mon test simple, GIT 1.7.0.5 n'a pas été en mesure de fusionner automatiquement deux branches dans lesquelles une branche a inséré une ligne dans une fonction, et l'autre déplacée cette fonction à un nouvel emplacement dans le même fichier. Git ne suit pas les morceaux de contenu plus petit que le fichier, semble-t-il. P>
Pour résoudre le conflit de fusion, la personne qui effectue la fusion devrait être consciente de la manière dont les deux changements ont fonctionné et comment ils devraient être combinés. P>
Voir aussi Git Fusion: Appliquez des modifications au code qui ont été déplacés dans un fichier différent p>
Je pense que la situation réelle est beaucoup plus complexe, mais d'après ce que j'ai vécu, Git peut gérer ce genre de fusion à 3 voies. P>
Par exemple: p>
Une fonction d'un fichier dans la branche A a été déplacé vers un autre emplacement dans le même fichier et crée une succursale B pour le maintenir. La différence entre la branche B et la branche A n'est que le changement de localisation de code dans le même fichier. P>
Branche C a changé cette fonction. P>
Alors, si vous faites: p>
Il fusionnera automatiquement le changement de la branche C au nouvel emplacement de cette fonction dans la branche b. P> $ git rebase --onto b a c code> p>