Как поделиться веткой Git Feature (или Темы) с несколькими разработчиками - PullRequest
7 голосов
/ 14 декабря 2011

Я следую описанному рабочему процессу здесь , так как я нашел много ссылок, указывающих на эту страницу как на хороший рабочий процесс. Как уже упоминалось в статье, «функциональные» ветки являются общими для разработчиков, но не переходят в центральный репозиторий.

Допустим, разработчик "A" запускает новую ветку функций с git checkout -b newfeature develop. Теперь предположим, что разработчик «B» также должен работать над этой функцией. Это моя проблема.

Что я сделал:

  1. разработчик "B" добавляет компьютер разработчика A в качестве удаленного
  2. Разработчик "B" запускает git branch remoteA/newfeature
  3. разработчик "B" работает над этой веткой, фиксирует свою работу и отправляет изменения обратно в remoteA.

Шаг 3 не работает, прямо сейчас. Я получаю сообщение:

remote: ошибка: по умолчанию обновляется текущая ветвь в непрошенном виде репозиторий запрещен, потому что он сделает индекс и рабочее дерево несовместимо с тем, что вы нажали, и потребует 'git reset --hard' чтобы сопоставить дерево работы с заголовком.

remote: ошибка: вы можете установить конфигурацию 'receive.denyCurrentBranch' переменная «игнорировать» или «предупреждать» в удаленном хранилище, чтобы позволить проталкивая в свою текущую ветку; однако это не рекомендуется если вы не договорились обновить его рабочее дерево, чтобы соответствовать тому, что вы нажали каким-то другим способом.

remote: error: чтобы подавить это сообщение и сохранить настройки по умолчанию поведения, установите переменную конфигурации receive.denyCurrentBranch 'в 'Отказывает'.

Я уже установил sharedRepository = true, но это не помогло.

У меня есть 2 вопроса:

  1. Как правильно разделить функциональные ветви между разработчиками?
  2. как я могу отодвинуть изменения в репозитории разработчика B к оригинальному репозиторию разработчика A

Ответы [ 2 ]

7 голосов
/ 14 декабря 2011

Самый простой способ поделиться ветвями объектов - просто перенести их в центральное хранилище, чтобы любой мог их извлечь.Таким образом, вы можете просто использовать уже имеющуюся инфраструктуру для своего основного хранилища и легко обмениваться кодом.

Когда ветвь функций на пульте больше не нужна, вы можете просто удалить ее, выполнив

git push <server> :branch

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

Если возможно, вы также можете использовать GitHubмодель, где есть один центральный репозиторий на сервере (благословенный основной репозиторий).И помимо этого основного репозитория у каждого разработчика есть «форк» этого репозитория, где он имеет полный доступ к коммитам и может выдвигать ветки по своему вкусу.

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

Описание модели GitHub можно найти здесь: http://www.eqqon.com/index.php/Collaborative_Github_Workflow

Обновление : Как отметил комментатор, это хорошая ссылка для начала работы с рабочим процессом централизованной ветки объектов: http://nvie.com/posts/a-successful-git-branching-model/

Обновление2 : Комуподробнее о вашем втором вопросе:

То, что вы пытаетесь сделать, - это нажать на не-пустой репозиторий другого разработчика.Git ввел в какой-то предыдущей версии (я думаю, 1.6 или около того) концепцию чистого репозитория - это репозиторий, у которого нет извлеченного состояния, но содержит только базу данных, которая обычно входит в .git.

Причина этого изменения заключалась в том, что всякий раз, когда вы отправляете в хранилище своих коллег (кто сейчас работает над чем-либо), вы манипулируете хранилищем прямо под его носом.Поэтому он проверяет версию featureA-1 .. начинает работать .. затем вы помещаете featureA-2 в его репозиторий, и когда он хочет зафиксировать, у него возникают проблемы, потому что ветвь, в которой он находился, продвинулась на один коммит, который он не видел во времяразвитие.

Поскольку это довольно разрушительно - большинство людей приняли понятие локальных репозиториев git (те, над которыми вы активно работаете) должно быть private , в то время как у вас есть публичный git-репо ( fork ), где вы получаете и делитесь изменениями.Таким образом, вы никогда не будете прерваны кем-то еще во время вашей работы (такова вся идея децентрализованной модели в любом случае), и вы можете включать только те изменения, которые вы хотите внести.(Никто не может что-то толкнуть на вашу текущую работу).

5 голосов
/ 15 декабря 2011

Вы можете подтолкнуть к не голому репо.То, что вы не можете сделать, это нажать на репо без обнажения, в котором есть ветвь, на которую вы выдвигаете ссылку.Причина этого должна иметь смысл.Изменение файлов, над которыми, возможно, кто-то еще работает, было бы неправильным.

Обычно вы хотите нажать на master или какую-нибудь другую общую ветвь общего доступа.Чтобы избежать этого конфликта, владелец удаленного репозитория non-bare должен работать в локальной ветке или, по крайней мере, в какой-то другой ветке.Затем вы можете нажать на общую ветку.

Чтобы использовать ваш пример:

  1. разработчик "B" добавляет машину разработчика A в качестве удаленного
  2. разработчика "B"работает git branch remoteA/newfeature
    1. разработчик "A" работает в локальной ветке.git checkout -b work-newfeature
  3. разработчик "B" работает над этой веткой, фиксирует свою работу и отправляет изменения обратно в remoteA.
    1. Разработчик "А" перебазирует, чтобы получить новую работу: git rebase newfeature
...