Обединяване на Git с клонирани проекти (най-добра практика)

Търся най-добрата практика за работа с GIT. Ето моят проблем:

Имам ОСНОВЕН проект и за всеки клиент го клонирам. Тъй като тези проекти ще бъдат много сходни (променя само някои конфигурационни файлове и изображения) и всеки уеб проект ще се съхранява в различна директория.

Така че мисля, че най-добрата практика е да клонирате основния проект, да направите някои промени и да качите в директорията на новите клиенти.

До тук всичко е наред, но: Как да обединя промените, ако открия критична грешка или ако добавя нова функция към всички (или към някои) от проектите? Трябва ли да създам корекция или нещо подобно? как?

Бих искал, ако обичате, лесен за разбиране отговор, защото не съм майстор на GIT (но искам да науча!)

Благодаря ти много!


person Dani Sancas    schedule 11.07.2013    source източник
comment
Разгледайте git cheery-pick   -  person Chronial    schedule 11.07.2013
comment
Благодаря, разглеждам официалния документ и някои примери. Ще го пробвам в localhost и след това ще дам обратна връзка. Благодаря за отделеното време!   -  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, и продължих да работя. Сега, ако въведа нова функция в BASE и я исках в ROSIPOV, тогава трябва да добавя BASE като дистанционно на ROSIPOV (и след това плащане и избор на череша)? - person Dani Sancas; 11.07.2013