2012-09-05 4 views
1

Je me demande s'il existe des outils pour fournir un historique des fichiers plus détaillé, en particulier en ce qui concerne les fusions où our modifications sont conservées. Ce problème est mieux expliqué avec un exemple.Comment faire pour git fusionner l'histoire ambiguïté/obfuscation avec '--ours'?

Disons que je fait un changement en conflit sur master et une branche feature:

git checkout master 
<made some change to file.txt> 
git commit -a -m "Change on master" 
git checkout -b feature 
<made conflicting change to file.txt> 
git commit -a -m "Change on feature" 

Si je fusionne feature en master et garder mes modifications à l'aide git checkout --ours file.txt je reçois des résultats différents pour file.txt que si je devais fusionner master en feature (puis fusionner feature en master pour avancer rapidement master). (Je comprends la fusion --ours pourrait effectivement ont également été fait par inadvertance avec mergetool.)

En utilisant git log -p dans ces deux scénarios, la fusion engage ne rapportez aucun changement file.txt, mais son contenu sont différents entre les scénarios. Maintenant l'historique des changements de file.txt a été obscurci et il est devenu difficile de savoir quelle version est dans master. Je peux exécuter git log -- file.txt, mais cette solution n'est pas évolutive et nécessite que vous sachiez déjà quels fichiers faisaient partie de la fusion incorrecte.

Si quelqu'un prend la mauvaise décision de fusion, il devient difficile de savoir quels fichiers ont été conservés. Sinon, si une fusion apporte des modifications à un fichier, il est facile de voir cela.

Répondre

1

Si les conflits sont résolus se, ils sont juste de résoudre de façon incorrecte (par vos commentaires sur cette réponse), une façon de voir les différences de file.txt entre deux branches est avec git diff:

git diff master feature -- file.txt 

Si vous émettez git diff master feature sans spécification de fichier, vous verrez toutes les différences dans tous les fichiers du repo. Les applications créatives de git diff vous permettront d'isoler presque tous les changements que vous souhaitez.

Dans le cas contraire, le meilleur résultat pourrait être le commit de fusion lui-même. Par défaut, le message commit publiera une section de conflits que je déconseille de supprimer.

+0

Si quelqu'un d'autre utilise 'git mergetool' et opts pour conserver leurs changements locaux pour chaque conflit, le résultat est le même. J'ai utilisé 'git checkout --ours ' pour répliquer (et mieux décrire) le comportement problématique. – slythfox

+0

@Slythfox Changé ma réponse à peu près complètement. Je n'ai pas réalisé que vous utilisiez cette commande pour la reprocher. – Christopher

+0

Je n'ai pas encore eu l'occasion de jouer avec ça. Auparavant, j'ai trouvé le commit de fusion incorrecte, recomposé, puis utilisé [git ls-files -u] (http://stackoverflow.com/questions/3065650/whats-the-simplest-way-to-git-a -list-of-conflicted-files) pour obtenir une liste de fichiers en conflit, et l'a comparée à la mauvaise fusion pour avoir une idée des fichiers qui étaient en conflit mais conservés comme "les nôtres". Cela semble fonctionner, un peu. J'ai aussi joué avec 'git checkout --patch ' pour avoir une idée de ce qui a changé entre la mauvaise fusion et un bon commit connu, ce qui semble être la même idée que 'git diff'. – slythfox