2014-06-14 8 views
2

Ma situation ressemble à ça:Git fusionner deux référentiels similaires dans un (deux conflits ajoutés)

J'ai deux référentiels avec plus ou moins le même code (laisser dire repo A et B). Je voudrais tirer B repo de pension A.
Sur repo AI exécuter les commandes suivantes:

git remote add repoB path/to/repoB 
git checkout -b branchB repoB/master 
git merge branchB 

Problème:
Je reçois des tonnes de both added conflits parce que les deux dépôts sont constitués de plusieurs fichiers identiques qui ont été ajoutés dans la d'abord commettre et laissé inchangé.

Comment fusionner ce repos sans passer une journée entière à vérifier si les deux fichiers ajoutés ont un contenu différent ou identique?

Je voudrais fusionner automatiquement des fichiers identiques et ne conserver que des fichiers ayant un contenu différent pour la fusion manuelle.

Répondre

3

Peut-être que quelqu'un peut offrir plus facile de le faire, mais la seule option que je trouve est:

  • ajouter repoB comme nouvelle branche à REPOA
 
    git remote add repoB path/to/repoB 
    git checkout -b branchB repoB/master 
  • rebasage REPOA à la première commit (les repo A et B ont un engagement initial similaire)
 
    git rebase -i --root 
  • fusionner avec branchB sur ses commit initiales
 
    git merge -Xours SHA_OF_BRANCHB_INITIAL_COMMIT 
  • rebasage REPOA à l'état actuel
 
    git rebase --continue 
  • repos de fusion normalement
 
    git merge branchB 

Merci à cette solution tous les fichiers communs sont fusionnés dans les deux premiers commits afin que je puisse utiliser en toute sécurité -Xours ou -Xtheirs dans cette fusion

1

Vous pouvez vérifier si une stratégie git merge vous permettra de résoudre ces conflits automatiquement:

git merge -Xours branchB 

Notez que s'appliquerait à tous les des fichiers avec des conflits, pas seulement ceux « à la fois ajoutée ».

+0

Merci pour l'idée, mais il n'a pas réussi parce que je perdais beaucoup de changements de représentant B fichiers qui étaient déjà présents dans repo A – jmarceli

+0

@ user2041318 cela signifie-t-il que vous perdriez des fichiers? Est-ce que cela a résolu les conflits "les deux ajoutés"? – VonC

+0

Je veux dire des modifications bien sûr. Quand j'ai exécuté votre commande, je réussis à fusionner sans conflit alors que je devrais en avoir. Le résultat était que les fichiers de la branche A remplacent les modifications de la branche fusionnée. – jmarceli

1

Lorsque la fusion doit travailler avec une mauvaise base, il obtient le changement imprécis Hunks - dans ce cas, avec l'historique ne montrant aucun ancêtre commun, l'autoresolve de merge commence avec chaque fichier affiché comme un seul morceau de changement ajouté.

Une chose que vous pouvez essayer est greffer les racines ensemble:

echo $(git rev-list --max-parents=0 other) \
                                        $(git rev-list --max-parents=0 HEAD) > .git/info/grafts
git mergeother

Si cela ne pas de bons résultats, juste abort la fusion et Yank le fichier .git/info/grafts.

une solution de repli à usage général est

git merge --no-commit --strategy oursother
git diff ..other | git apply
git add --patch .

+0

+1. Le cas «pas d'ancêtre commun» est un bon exemple à mentionner ici. – VonC

Questions connexes