2010-03-31 9 views
0

S'il vous plaît aidez-moi à comprendre comment fonctionne git.Git: comment fusionner avec le repo distant?

Je clone mon référentiel distant sur deux machines différentes.

Je modifie le même fichier sur les deux machines.

Je réussis à valider et à pousser la mise à jour de la première machine vers le référentiel distant. J'essaye alors de pousser la mise à jour sur la deuxième machine, mais obtenez une erreur:

! [rejected]  master -> master (non-fast-forward) 

Je comprends pourquoi j'ai reçu l'erreur. Comment puis-je fusionner mes modifications dans le repo distant? Dois-je d'abord retirer le repo distant?

+1

Voir http://stackoverflow.com/questions/1713137/github-first-push-problem-how-to-merge-remote-changes et http://stackoverflow.com/questions/832222/why-is-git-pushing -à-deux-branches-dans-ce-git-push et http://stackoverflow.com/questions/855558/cant-push-to-remote- git-repo –

Répondre

6

Oui, après que le référentiel distant a été rejeté, vous devez extraire du référentiel distant (cela entraînera une fusion, ce qui signifie que vous devrez peut-être résoudre le conflit de fusion - n'oubliez pas de valider la fusion) résolution de conflit dans ce cas), puis appuyez à nouveau.


  1. Après comitting changements sur les machines A et B vous avez la situation suivante:

    • '' dépôt distant ''

       
      *---*---*---C 
      

    • '' machine A ''

       
      *---*---*---C---A 
      

    • '' machine B ''

       
      *---*---*---C---B 
      

  2. Après avoir poussé de la machine A à dépôt distant que vous avez:

    • '' dépôt distant ''

       
      *---*---*---C---A 
      

    • '' machine A ''

       
      *---*---*---C---A 
      

    • '' machine B ''

       
      *---*---*---C---B 
      
      Pousser de la machine B serait correctement refu se pour "écraser" commit A avec commit B.

  3. Après avoir tiré à partir du dépôt à distance sur la machine B vous:

    • '' dépôt distant ''

       
      *---*---*---C 
      

    • '' machine A ''

       
      *---*---*---C---A 
      

    • '' machine B ''

       
      *---*---*---C---B----M 
            \  /
            \--A--/ 
      
      Juste au cas où cet art ASCII se brouille: il y a pour m de commettre C, et deux branches sont fusionnées comme engagent M.

    Maintenant, la pression serait en avance rapide

  4. Après avoir poussé de la machine B à dépôt distant

    • ' 'référentiel distant' »

       
      *---*---*---C---B----M 
            \  /
            \--A--/ 
      

    • '' machine A ''

       
      *---*---*---C---A 
      

    • « » machine B « »

       
      *---*---*---C---B----M 
            \  /
            \--A--/ 
      

  5. maintenant sur la machine A vous devez tirer de dépôt avant de commencer tout nouveau travail, d'être à jour. Pull ferait une avance rapide, ce qui signifie qu'il n'y aurait pas de nouveau commit de fusion. Maintenant, les trois machines ont le même état de dépôt

    • '' dépôt distant ''
      '' machine A ''
      '' Machine B ''
       
      *---*---*---C---B----M 
            \  /
            \--A--/ 
      

HTH

+0

L'illustration m'a vraiment aidé à avoir une idée claire de ce qui se passe. Merci! – Marco

2

Oui.

La fusion ne se produit que sur une traction; une poussée seulement effectuera une avance rapide (sauf si vous le forcez, mais cela perd son travail). Une fois que vous avez tiré et fusionné avec succès, la poussée sera une avance rapide.

git-push a quelques belles illustrations.

Questions connexes