Git工作流

Git是当今最流行的开源版本控制系统,使用git的每个团队应该也有固定的工作流。今天就介绍一个现有普遍使用的工作流git-flow。 分支(branch) 如上图一般分支有*master、develop、feature/xxx、release/xxx、hotfixes*,下面一一介绍。 长期分支 长期分支是跟着产品长期存在的不会删除。 *master*只能用来包括产品代码,不要在这上面做任何的改动。 *develop开发主分支,所有新功能的分支从这里checkout,所以这是开发的基础分支。该分支也是汇集所有开发新功能后最后merge到master*的分支。 临时分支 临时分支只用来开发新功能、修复bug和发布产品用最后删除。 *feature/xxx开发新功能的分支从develop分支checkout每个功能创建一个分支是一个良好的习惯。开发测试完后merge到develop*分支进行更全面的测试。 *release/xxx产品预发布分支,一般以版本号为分支名,需要合并到master*分支发布。 *hotfixes紧急修复bug的分支基于master分支,修复完后一定要合并到master分支和develop*分支。 Git-flow工作流程 基本步骤 开发人员首先从*develop*分支checkout -b feature/xxx一个待开发的分支,开发和测试。 当开发和测试都完成后将*feature/xxx合并到develop并删除清理。当然其中有新功能时可以再新建一个feature*分支并最后合并到开发分支。 终于等到release了,现在开发分支汇集了所有新开发的功能并无重大bug,我们从*develop分支checkout一个release/v1.0.0的分支进行更加全面的测试准备发布,有bug就在release分支修复,正式发布就是把这个release分支合并到master分支打上tag。当然不要忘记将发布分支合并到develop分支以保持和master*代码同步一致。 可能发布后有紧急的bug需要修复那就从*master分支checkout一个hotfixes/missing-link分支修复bug并合并到master和develop*最后删除。 总结一下 以上就是Git-flow方案的所有流程,优点是分支清晰各干各的看名字就知道,最后只留下*master和develop*分枝。缺点当然是步骤比较繁琐咯,开发要新建很多分支然后切换和删除。我们可以还有很多方案选择GitHub flow、GitLab flow等,或者理解熟练了之后自创一套也是可以的。 GitHub协同工作 身为一个开发者一定想为开源项目贡献自己的代码,下面是基本步骤可做参考。也可以作为团队协作的基本流程。 Fork到自己帐号下并Clone到本地 git remote add upstream https://github.com/... 添加上游项目地址(源项目地址)以便更新到最新的代码,添加完可用git remote -v查看除了origin应该还有upstream远程地址 git pull upstream master从刚才添加的upstream拉取最新代码 git checkout -b feature/some-feature 新建一个你要添加新功能的分支,开发就在这上面进行 git add . && git commit -m 'some feature add'测试通过后提交代码 git checkout master && git pull upstream master这主要是从源仓库拉取最新代码,在你开发期间,如果源项目有改动提交pull就能拉取下来 git checkout feature/some-feature && git rebase master 然后执行一次变基更新代码 git push origin feature/some-feature推送你开发完并更新到最新的分支到GitHub 去自己GitHub帐号下 pull request等review合并 一具话就是先在本地新建一个分支开发最后提交这个分支发PR,需要注意的是提交到远程的时候记得先pull更新代码然后rebase使分支清晰可读。 ...

November 21, 2017 · 1 min · 82 words · Fython

Python中@propery 使用

Python中@propery 装饰器的使用 python是面向对象的语言,当我们想在类中封装一个变量,并提供设置和获取值的时候,往往会使用如下方法。 class Student: def __init__(self, score): self.__score = score def get_score(self): return self.__score def set_score(self, score): self.__score = score 然后如下输出 >>> s = Student(99) >>> s.get_score() 99 >>> s.set_score(100) >>> s.get_score() 100 这是最简单的封装,但有没有像s.score这样属性直接调用s.score = 100直接赋值的呢,有!而且很简单。 class Student: def __init__(self, score): self.score = score 没错就是__init__方法直接设置。 >>> s = Student(99) >>> s.score 99 >>> s.score = 100 >>> s.score 100 以上的方法没有封装,而且如果我想要判断score的值范围(0~100)也无法做到,使用第一种set_score倒是可以做到。 class Student: def __init__(self, score): self.set_score(score) def get_score(self): return self.__score def set_score(self, score): if score < 0: self.__score = 0 elif score > 100: self.__score = 100 else: self.__score = score 效果 ...

October 8, 2017 · 1 min · 204 words · Fython

《在宇宙间不易被风吹散》

《在宇宙间不易被风吹散》 一日茶,一夜酒,一部毫不掩饰的小说,一次没有目的的见面,一群不谈正经事的朋友,用美好的器物消磨必定留不住的时间。所谓本质一直就在那里,本一不二。 《在宇宙间不易被风吹散》是冯唐2016年出版的杂文集。他是个高产的作家其实不止是个靠文字为生的读书人更是个投资人、前麦肯锡合伙人、战略管理顾问等等只是爱好文字业余写作,最近有《搜神记》在预售。 冯唐算是最近两年比较火的作家特别是翻译了《飞鸟集》从翻译到下架到召回之后。由于翻译的很青春荷尔蒙,诗中到处充斥着“裤裆”、“舌吻”、“他妈”等词不符合大众对诗“信、达、雅”的标准被出版商下架召回。有时也出现在各种电视节目上《铿锵三人行》《搜神记》。 书的封面骚气十足,他怀抱着一位他热爱的妇女,若隐若现够写意。嗯,很“冯唐”!不会是又一部《素女经》、《不二》吧。书名一开始不太理解,书中旧书店一文中说我想,每个像Moskowitz先生一样牛逼的人,都要有个笃定的核,这样在宇宙间才不易被风吹散,仿佛每个伟大的街区都要有家旧书店。而冯唐这本书就是证明他有一颗笃定的核的书。 书是一篇篇杂文、随笔组成的,在序分中他说这本书,就和各位简单分享我理解的东方美学。,书中大部分文章介绍他玩各种器物的心得和体会加冯唐体依旧自恋。当然逼格要高煮茶要用日本龙文堂造铁壶、喝茶要用北宋建窑兔毫盏、手表要戴百达翡丽、相机要莱卡M9全幅画旁轴加50mm定焦饼干镜头、戴白玉扳指用他的话说就是用美好的器物消磨必定留不住的时间。用他扎实的文字功底加非常人的见识描述出来,世俗绝不庸俗。挺喜欢他文字中的那点“坏”或者说那点“黄”和肿胀,带着点痞子气。 除了这些美好的器物他在“跑步,让自己和身体尽人力”中说坚持运动跑步的好处甜睡、去烦、放下等,在”大学教育 我在协和学到的十件事”中说硬着头皮学些暂时不觉的有用的知识有什么用所学过的知识,哪怕基本都忘了,如果需要,我们知道去哪里找。因为我们学过,我们知道这些知识存在,我们不容易狭隘,不狭隘往往意味着不傻逼。乔布斯说要相信会有一天这些零碎的知识会串联起来帮助你。在“财富观 富二代的自我修养”中如果我只能追求一种名牌,我一定追求教育上的名牌:上最好的大学,读最有名的名著。这些都是该汲取的地方。 还自恋地回应了下为什么这么自恋“能做到实事求是的自恋其实是自信和自尊,任何领域做到最好之后,人只能相信自己的判断,只能自恋。” 全文完。

July 27, 2017 · 1 min · 11 words · Fython

Python3 协程(Coroutine) 与 asyncio

Python3 Coroutine(协程) 与 asyncio 协程,又称微线程,纤程,英文名 Coroutine。协程的作用,是在执行函数 A 时,可以随时中断,去执行函数 B,然后中断继续执行函数 A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行。 优势 执行效率极高,因为子程序切换(函数)不是线程切换,由程序自身控制,没有切换线程的开销。所以与多线程相比,线程的数量越多,协程性能的优势越明显。 不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在控制共享资源时也不需要加锁,因此执行效率高很多。 说明:协程可以处理 IO 密集型程序的效率问题,但是处理 CPU 密集型不是它的长处,如要充分发挥 CPU 利用率可以结合多进程加协程。 有一篇David Beazley的课程A Curious Course on Coroutines and Concurrency详细讲解了协程和并发的用法,强烈推荐。本篇文章多处参考与此。 0x01. Generator 与 Coroutine 的区别 一开始我总是傻傻分不清Generator和Coroutine的区别感觉这两个东西差不多不一样吗,最近查了点资料并学习了下。在此做记录,我们先来看Generator。 def countdown(n): while n > 0: yield n n -= 1 c = countdown(5) print(c) for i in c: print(i) 返回一个generator object并且可以迭代,详细参考上一篇文章 <generator object countdown at 0x7f82a41739e8> 5 4 3 2 1 [Finished in 0.0s] 如下是Corountine ...

May 18, 2017 · 4 min · 674 words · Fython

深入理解 Python中的yield

深入理解 Python3 yield yield是 python 内置的关键字,它能产生一个生成器(Generator)。 0x01. Generators 只要函数中有yield就会变成一个generator object生成器对象,生成器对象可以迭代,但与iterable不同的是它只能迭代一次。先来看一个简单的例子 >>> def foo(): ... yield 1 ... yield 2 ... yield 3 ... >>> g = foo() >>> g <generator object foo at 0x7ffb08326ca8> >>> for i in g: ... print(i) ... ... 1 2 3 >>> for i in g: ... print(i) ... ... >>> 当你调用foo这个函数的时候,函数内部的代码并不立马执行 ,这个函数只返回一个生成器对象,如果有庞大的数据它不像iterable占用内存,会每次调用时才计算产生值。 其实for循环隐式的调用__next__()方法,直到遇到StopIteration停止。 >>> def bar(): ... yield 'a' # 第一次调用next()代码运行到这,产生'a' ... yield 'b' # 第二次调用next()代码运行到这,产生'b' ... yield 'c' # 第三次调用next()代码运行到这,产生'c' ... >>> g = bar() >>> next(g) 'a' >>> next(g) 'b' >>> next(g) 'c' >>> next(g) Traceback (most recent call last): File "<input>", line 1, in <module> next(g) StopIteration 也可以使用 Python3 内置的next()函数调用,直到产生StopIteration错误。 下面是一个斐波那契数列的例子 >>> def fib(n): ... a, b = 0, 1 ... while n >= 0: ... b, a = a, a+b ... n -= 1 ... yield b ... ... >>> for i in fib(5): ... print(i) ... ... 0 1 1 2 3 5 0x02. send Method /Coroutines yield不仅可以通过next()取得产生的值,还可以通过send()接受值。 ...

April 28, 2017 · 4 min · 748 words · Fython