2010-03-31 2 views
0

Пожалуйста, помогите мне понять, как работает git.Git: как вы сливаетесь с удаленным репо?

Я клонирую свой удаленный репозиторий на двух разных машинах.

Я редактирую тот же файл на обеих машинах.

Я успешно фиксирую и переношу обновление с первой машины в удаленный репозиторий. Затем я пытаюсь нажать обновление на второй машине, но получаю сообщение об ошибке:

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

Я понимаю, почему я получил ошибку. Как я могу объединить свои изменения в удаленное репо? Нужно ли мне сначала удалять дистанционное репо?

+1

См. Http://stackoverflow.com/questions/1713137/github-first-push-problem-how-to-merge-remote-changes и http://stackoverflow.com/questions/832222/why-is-git-pushing -to-two-branch-in-this-git-push и http://stackoverflow.com/questions/855558/cant-push-to-remote- git-repo –

ответ

6

Да, после удаленного репозитория отклонено нажатие как не быстрая перемотка вперед, вам нужно вытащить из удаленного репозитория (это приведет к слиянию, что означает, что вам может потребоваться разрешение конфликта слияния - не забудьте выполнить слияние разрешение конфликта в этом случае), а затем снова нажмите.


  1. После comitting изменения на машинах A и B у вас есть следующая ситуация:

    • '' удаленный репозиторий ''

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

    • '' машина A ''

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

    • '' машина B ''

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

  2. После нажатия из машины А в удаленном хранилище у вас есть:

    • '' удаленный репозиторий ''

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

    • '' машина A ''

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

    • '' машина B ''

       
      *---*---*---C---B 
      
      Пульт от машины B будет правильно возвращен se, чтобы «перезаписать» фиксацию A с фиксацией B.

  3. После извлечения из удаленного хранилища на машине B у вас есть:

    • '' удаленный репозиторий ''

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

    • '' машины А ''

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

    • '' machine B ''

       
      *---*---*---C---B----M 
            \  /
            \--A--/ 
      
      На всякий случай это ASCII-искусство получает искалеченное: для м от фиксации C, и две ветви сливаются, как совершают М.

    Теперь толчок будет быстрой перемотки вперед

  4. После нажатия от машины В к удаленному хранилище

    • ' 'удаленный репозиторий'»

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

    • '' машина А ''

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

    • «» машина B «»

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

  5. Теперь на машине А вам нужно вытащить из хранилища перед началом новой работы, чтобы быть в курсе. Pull будет ускоренной перемоткой вперед, а это означает, что не будет создано никакого нового слияния. Теперь все три машины имеют такое же состояние хранилища

    • '' удаленный репозиторий ''
      '' машина A ''
      '' машина B ''
       
      *---*---*---C---B----M 
            \  /
            \--A--/ 
      

НТН

+0

Эта иллюстрация действительно помогла мне получить четкое представление о том, что происходит. Благодаря! – Marco

2

Да.

Слияние происходит только при натяжении; нажатие будет только выполнить перемотку вперед (если вы не заставите его, но это теряет работу). После того, как вы вытащили и успешно слились, толчок будет быстрым.

git-push имеет несколько хороших иллюстраций.

Смежные вопросы