2010-02-20 4 views
20

J'ai vérifié les différentes questions à ce sujet. Le premier fournit a huge question and answer (pertinent? Pas sûr) et le second fournit wrong answer as best answer.Git fusionner -s leur: Simplement?

J'ai une branche appelée great-use-this. J'ai une autre branche appelée master. Je veux fusionner great-use-this dans le maître et éviter les conflits de fusion automatique.

Quelle est la façon de le faire le plus simple et le plus facile ?

Note:. fait, j'ai compris cela (en utilisant une troisième branche et ours, mais ce serait bien d'avoir le SO de toute façon

+0

de Archive.org Voir aussi http://stackoverflow.com/questions/4911794/git-command-for-making-one-branch-like-another/4912267#4912267 – VonC

+0

Would sois gentil de montrer un exemple de la troisième branche + 'notre' approche, en particulier le graphique de commit résultant, combien de bruit etc. – lkraav

+0

@lkraav Je n'ai plus cet exemple. Je fais tout soit avec 'git merge BRANCH --squash' ou parfois en utilisant' git reset --soft master' et ensuite je regarde comme s'il s'agissait d'un nouveau commit. Désolé, mais si vous demandez un exemple simple dans une autre question, ce serait charmant. –

Répondre

25

Oui, ce qui crée une troisième branche et de faire un merge -s ours est une solution.

Mais vous trouverez le tout "let's not advertised any "theirs" merging strategy" here.

Entre le remplacement de votre travail avec un autre travail de branche, ou tout simplement se débarrasser des travaux en cours et de le remplacer complètement par l'autre, Junio ​​Hamano C. (principal Git Maintainer) préfère la seconde approche:

Je pense que « -s theirs » est encore pire. Il est comment vous jeter ce que vous avez fait (peut-être parce que l'autre a bien meilleure solution que votre hack), mais cela peut être beaucoup plus facilement et proprement fait avec:

$ git reset --hard origin/master 

Certaines personnes pourraient dire « Mais avec 'merge -s theirs', je peux garder ce que j'ai fait, aussi ". Cette réinitialisation consiste simplement à rejeter ce que j'ai fait.

Cette logique est également erronée. Vous pouvez à la place:

$ git branch i-was-stupid 
$ git reset --hard origin/master 

si vous voulez vraiment garder trace de votre défaillance. Un gros problème "-s theirs" a, par rapport à ce qui précède "réinitialiser à l'origine, rejeter ou mettre de côté l'histoire a échoué" est que votre histoire 'maître' sur lequel votre développement est basé gardera votre merde échoué pour toujours si vous avez fait "-s leur".

Espérons que vous deviendrez un meilleur programmeur au fil du temps, et vous pouvez éventuellement avoir quelque chose mérite d'être partagée avec le monde près de la pointe de votre branche principale. Lorsque cela se produit, cependant, vous ne pouvez pas offre votre branche principale à tirer par l'amont, comme le monde plus large ne sera pas intéressé par vos erreurs antérieures du tout.

+1

Le problème avec la logique est que cela m'arrive quand je fusionne dans la branche principale. Ce n'est pas parce que Git ne peut pas comprendre que la fusion automatique n'est pas totalement évidente. Mais je veux que l'histoire avance. En tout cas, la plupart de ces histoires seront rebasées dans la poubelle. –

+0

la syntaxe qui a fonctionné pour moi était 'git reset --hard origin/master' –

2

Je penche vers moi-même l'option git reset --hard BRANCHNAME, mais je l'ai découvert qu'il existe un « leur » dans Git (v. 1.7.1 au moins).

Si vous voulez essayer, il suffit d'ajouter un argument « -Xtheirs » à la commande de fusion.

Par exemple, à partir de maître:

git checkout -b editBranch
-- edit your files --
git add .
git commit -m "Updated the files"
git checkout master
git merge -Xtheirs editBranch

Si vous avez supprimé des fichiers dans le editBranch, vous obtiendrez une fusion qui conflict de peut être résolu avec git rm FILENAME.

Encore une fois, il semble probable que la réinitialisation --hard BRANCHNAME est une meilleure option, mais si vous avez un cas où vous avez vraiment besoin d'un leur, cela devrait vous y arriver.

+4

Il est important de souligner que' -Xtheirs' est complètement différent d'une stratégie hypothétique '-s leur''. '-Xtheirs' passe l'option' theirs' à la stratégie de fusion récursive qui résout les conflits conflictuels en choisissant la version 'leur'. '-s theirs', si implémenté comme' -s ours' choisirait l'intégralité de 'leur' ​​arbre au lieu de n'importe quelle sorte de fusion intelligente. –

+1

Je pense que je comprends cela. Est-ce que cela signifie qu'un "-s leur" est vraiment la même chose que si vous avez fait "git reset --hard BRANCHNAME"? –

+0

@Charles Bailey, voulez-vous faire un commentaire à ce sujet, s'il vous plaît? –

8

a couru dans ce problème l'autre jour:

httpx: //seanius.net/blog/2011/02/git-merge-s-theirs/

Mise à jour: url Vieux est éteint. Voici l'article via Wayback Machine:

git merge -s ours ref-to-be-merged 
git diff --binary ref-to-be-merged | git apply -R --index 
git commit -F .git/COMMIT_EDITMSG --amend 
+0

Merci @Sean Finney, article intéressant. Personnellement, j'ai fait beaucoup de 'reset --hard' et' reset --soft' avec des refs alors allez où je veux aller, ce qui est brutal et bousille l'histoire de commit (donc vous finissez par utiliser 'push --force' beaucoup :)), mais votre solution semble solide. Je vais devoir le vérifier bientôt. –