多个项目同时进行(我们这里假设有3个项目a,b,c。每个项目由一个人开发,则开发人员直接从dev分支拉取项目分支(feature)。
假如某一个项目由多个人开发时,应该每个开发该项目的人从这个项目的开发分支上拉去自己的开发分支(feature_person),完成之后
提交到项目分支(feature))。
每个feature branch提交到dev branch的时间不一样,我们假设这里a,b,c三个feature branch提交到dev branch的时间顺序是b、a、c,
我们在生成版本的时候则可能会有一下6种可能(6种排序)。我们这里的要求是生成的版本不能包含不需要的东西,假如我们从dev生成版本的顺序是b、a、c,则可以按照正常的流程直接生成。加入从dev生成的版本的顺序要求是a、b、c的话,则不能直接生成了,因为在dev brach生成a版本的时候,此时已经包含了b的内容,如果直接生成的话,我们的版本中会包含我们不需要的b内容,与我们的需求不符合。但是,通过我以下
的方式,是可以做到按照a、b、c时序正确的生成版本。其基本思路是利用tag功能,往前跳过包含b的部分,到达b的前一个节点(tag),根据
该tag生成一个临时分支,将a branch合并到该临时分支,在将给临时分支生成到版本、即可以得到我们所需要的,组后也需要将feature a合并到branch dev,以保证branch dev的完整性,最后可以删除feature a和临时分支,因为已经生成到版本了。
本例中,feature a在文件中的3次版本改动分别是写入a1,a2,a3。feature b在文件中的2次版本改动分别是写入b1,b2,feature c
在文件中的2次改动分别是写入c1,c2.
按照上边各个feature brach在dev branch上生成的时序(b、a、c),
正常来说,生成版本最常见的时序就是rel_b、rel_a、rel_c,即开发完成后,接着就是上线该功能的模式。此时rel_b的内容应该是b1,b2;
rel_a的内容应该是b1,b2,a1,a2,a3;rel_cd的内容是b1,b2,a1,a2,a3,c1,c2;
但是,也有生成版本不完全按照在dev branch生成的时序来的,即开发完成后,先放着,可能先上线的是其他功能。假如我们此时版本的时序是
rel_a,rel_b,rel_c。 此时rel_a的内容应该是a1,a2,a3;rel_b的内容应该是a1,a2,a3,b1,b2;rel_cd的内容是a1,a2,a3,b1,b2,c1,c3。
(我们这里不关注内容的先后顺序,之关注是否有该出现的内容,内容的先后顺序具体看解决冲突时候的操作,不是我们这里测试的重点)
下边为实际操作,可做参考与验证
a b c(t1)
rel_a:a1,a2,a3
rel_b:a1,a2,a3,b1,b2
rel_c:a1,a2,a3,b1,b2,c1,c2
克隆远程库
git clone ssh://10.160.41.139:22/tfs/DefaultCollection/%E9%97%B4%E8%81
%94%E6%94%B6%E5%8D%95%E7%B3%BB%E7%BB%9F/_git/t1
cd t1
拉取dev a b c分支,并对dev分支设置tag
git co -b dev
git tag tag_dev
git br a
git br b
git br c
分支a操作a1
git co a
vi *
git a .
git ci -m "a1"
分支b操作b1
git co b
vi *
git a .
git ci -m "b1"
分支b操作b2
vi *
git a .
git ci -m "b2"
切到dev分支,并合并分支b,合并完成后打上tag
git co dev
git merge --no-ff b
git tag tag_b
分支a操作a2
git co a
vi *
git a .
git ci -m "a2"
分支c操作c1
git co c
vi *
git a .
git ci -m "c1"
分支a操作a3
git co a
vi *
git a .
git ci -m "a3"
以下开始为生成版本a:
切到到dev分支,并合并分支a,合并完成后打上tag
git co dev
git merge --no-ff a
vi *
git a .
git ci -m "merge branch a into dev"
git tag tag_a
切到dev分支上的标签tag_dev,并根据该标签生成并切换到相对应的分支br_tag_dev,
然后合并分支a。
git co tag_dev
git st
git co -b br_tag_dev
git merge --no-ff a
切换到master分支并合并br_tag_dev分支,然后打上标签rel_a,版本生成后可以
删除分支a和分支br_tag_dev
git co master
git merge --no-f br_tag_dev
cat *
git st
git tag rel_a
git br -d a
git br -d br_tag_dev
切换到dev分支上的标签tag_b,并根据该标签生成相对应的分支,切换到master分支,
将新生成的分支合并到master分支得到b的版本。之后打上标签rel_b和删除分支b
和新生成的分支。
git co tag_b
git co -b br_tag_b
git co master
git merge --no-ff br_tag_b
vi *
git a .
git ci -m "merge br_tag_b into master"
git tag rel_b
git br
git br -d b
git br -d br_tag_b
切换到c分支操作2
git co c
vi *
git a .
git ci -m "c2"
切换到dev分支并合并c分支,打上标签tag_c
git co dev
git tag
git merge --no-ff c
vi *
git a .
git ci -m "merge branch c into dev"
git tag tag_c
切换到master分支,合并dev分支后打上标签rel_c,然后删除c分支
git co master
git merge --no-ff dev
vi *
gti a .
git ci -m "merge dev into master"
git br -d c
git br
git tag rel_c
git push
git push --set-upstream origin dev
a c b(t2)
rel_a:a1,a2,a3
rel_c:a1,a2,a3,c1,c2
rel_b:a1,a2,a3,c1,c2,b1,b2
git init
vi 1
git a .
git ci -m "init"
git co -b dev
git br a
git br b
git br c
git tag tag_dev
git co b
vi *
git a .
git ci -m "b1"
vi *
git a .
git ci -m "b2"
git co dev
git merge --no-ff b
git tag tag_b
vi *
git a .
git ci -m "b2"
git co dev
git merge --no-ff b
git tag tag_b
git co a
vi *
git a .
git ci -m "a1"
vi *
git a .
git ci -m "a2"
vi *
git a .
git ci -m "a3"
git co dev
git merge --no-ff a
vi *
git a .
git ci -m "merge a into dev"
git tag tag_a
git tag
git co tag_dev
cat *
git co -b br_tag_dev
merge --no-ff a
git merge --no-ff a
git co master
git merge --no-ff br_tag_dev
git tag rel_a
cat *
git co c
vi *
git a .
git ci -m "c1"
vi *
git a .
git ci -m "c2"
ls
cat *
git st
git dev
git merge --no-ff c
git s
git st
cat *
git s
git co dev
git merge --no-ff c
vi *
git a .
git ci -m "merge c into dev"
git tag tag_dev
git co b
vi *
git a .
git ci -m "b1"
vi *
git a .
git ci -m "b2"
git co dev
git merge --no-ff b
git tag tag_b
git co a
vi *
git a .
git ci -m "a1"
vi *
git a .
git ci -m "a2"
vi *
git a .
git ci -m "a3"
git co dev
git merge --no-ff a
vi *
git a .
git ci -m "merge a into dev"
git tag tag_a
git co tag_dev
git co -b br_tag_dev
git merge --no-ff a
git co master
git merge --no-ff br_tag_dev
git tag rel_a
cat *
git co c
vi *
git a .
git ci -m "c1"
vi *
git a .
git ci -m "c2"
git co dev
git merge --no-ff c
vi *
git a .
git ci -m "merge c into dev"
git tag tag_c
git co master
git merge --no-ff c
vi *
git st
git a .
git ci -m "merge c into master"
git tag rel_c
git co tag_b
git co master
git merge --no-ff tag_b
vi *
git a .
git ci -m "merge tag_b into master"
git tag rel_b
b a c(t3)
rel_b:b1,b2
rel_a:a1,a2,a3,b1,b2
rel_c:a1,a2,a3,c1,c2,b1,b2
b c a(t4)
rel_b:b1,b2
rel_c:b1,b2,c1,c2
rel_a:a1,a2,a3,c1,c2,b1,b2
c a b(t5)
rel_c:c1,c2
rel_a:a1,a2,a3,c1,c2
rel_b:a1,a2,a3,c1,c2,b1,b2
c b a(t6)
rel_c:c1,c2
rel_b:b1,b2,c1,c2
rel_a:a1,a2,a3,c1,c2,b1,b2