Слияние Git с клонированными проектами (лучшая практика)

Я ищу рекомендации по работе с GIT. Вот моя проблема:

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

Поэтому я думаю, что лучше всего клонировать базовый проект, внести некоторые изменения и загрузить в новый каталог клиентов.

Пока здесь все хорошо, но: Как мне объединить изменения, если я обнаружил критическую ошибку или добавил новую функцию во все (или в некоторые) проекты? Нужно ли создавать патч или что-то подобное? Как?

Я хотел бы, пожалуйста, простой для понимания ответ, потому что я не мастер GIT (но я хочу научиться!)

Большое спасибо!


person Dani Sancas    schedule 11.07.2013    source источник
comment
Посмотрите на git cheery-pick   -  person Chronial    schedule 11.07.2013
comment
Спасибо, я смотрю официальный документ и несколько примеров. Я попробую это на локальном хосте, а затем отвечу. Спасибо за ваше время!   -  person Dani Sancas    schedule 11.07.2013
comment
Приходит обратная связь! Теперь я больше привык работать с GIT и да, git cheery-pick очень помогает. Спасибо друг!   -  person Dani Sancas    schedule 03.01.2014
comment
для таких ленивых, как я, в комментариях выше дважды опечатка: › git cherry-pick   -  person Nicolas D    schedule 24.03.2017


Ответы (2)


Возможно, вы захотите взвесить свои варианты в зависимости от изменений в вашем базовом репозитории (клиентских репозиториях), которые вы хотите включить в некоторые/все ваши клиентские репозитории (базовый репозиторий).

Предположим, что вы хотите, чтобы изменения были включены в клиент, а изменения, которые вы хотите, находятся в базе. Допустим, у вас есть удаленный сервер, который указывает на базовый репозиторий. Итак, в вашем клиентском репозитории вы должны:

git remote add basepro <url>

Вот некоторые случаи, с которыми вы можете столкнуться:

  1. Вы делаете базовое изменение/исправление серьезной ошибки в своем базовом репозитории, которое хотите включить во все/некоторые из ваших клиентов. Если ваш базовый репозиторий также является локальным и переписывание истории коммитов никак не влияет на вас, вы можете подумать о перебазировании:

    git rebase -i basepro/master
    

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

    git rebase --continue
    

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

  2. Вы хотите, чтобы только определенные фиксации в базовом репозитории применялись к клиентским репозиториям или определенные фиксации одного клиента применялись к другому.

    git cherry-pick -Xpatience <commit>
    

    Вы также можете указать диапазон коммитов.

  3. У вас есть похожие файлы в client1 и client2, и оба они основаны на файле в базе. Теперь вы хотите объединить эти файлы в двух клиентах для другого клиента 3.

    В этом случае вы можете использовать

    git merge-file <client1file> <basefile> <client2file>
    

    Объединенный файл будет записан в client1file. В этом случае вам нужно сначала checkout добавить необходимые файлы в ваше рабочее дерево, когда вы находитесь в репозитории клиента 3.

    git checkout baserepo/master -- basefile
    

    будет проверять базовый файл.

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

    git merge -s ours baserepo/master
    
  5. Применение исправлений также можно выполнить, как мне объяснили в этом ответе:

person rivendell    schedule 11.07.2013
comment
Ух ты! Спасибо за пост, приятель. Команда rebase выглядит хорошо, возможно, с ней стоит поработать. И, если мне не понравится, я всегда могу воспользоваться cherry-pick. Я приму ваш ответ как правильный из-за обширности и четкого объяснения. Спасибо! - person Dani Sancas; 12.07.2013
comment
Я также нашел простое рабочее решение, по крайней мере, оно работает с моими локальными примерами. У меня есть проект BASE и клонированные из него проекты CLIENT1 и CLIENT2. Когда я исправляю ошибку или добавляю новую функцию, я создаю из нее tag (например, Mytag). Затем в CLIENT1 (или CLIENT2) я fetch из origin, поэтому я могу выполнить локальное слияние из его тега, потому что появляется Mytag. - person Dani Sancas; 12.07.2013

Что вы можете сделать, так это добавить другие репозитории в качестве удаленных и вносить в них изменения.

 git remote add project <address>
 git checkout project master
 git cherry-pick <sha1>
person Ruslan Osipov    schedule 11.07.2013
comment
Дайте мне знать, если я прав: у меня есть проект BASE, и 3 месяца назад я клонировал его и назвал ROSIPOV, и продолжил работу. Теперь, если я ввожу новую функцию в БАЗЕ и хочу ее в РОСИПОВ, то я должен добавить БАЗУ в качестве удаленного от РОСИПОВ (а затем оформить заказ и вишневый выбор)? - person Dani Sancas; 11.07.2013