<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>工作流 on Allens' Blog</title><link>https://allens.tech/categories/%E5%B7%A5%E4%BD%9C%E6%B5%81/</link><description>Recent content from Allens' Blog</description><generator>Hugo</generator><language>en-us</language><managingEditor>allens.leng@gmail.com (Allens)</managingEditor><webMaster>allens.leng@gmail.com (Allens)</webMaster><copyright>All articles on this blog are licensed under the BY-NC-SA license agreement unless otherwise stated. Please indicate the source when reprinting!</copyright><lastBuildDate>Sun, 13 Sep 2020 11:00:00 +0800</lastBuildDate><atom:link href="https://allens.tech/categories/%E5%B7%A5%E4%BD%9C%E6%B5%81/index.xml" rel="self" type="application/rss+xml"/><item><title>Git 版本化管理（从功能开发、发布到 bug 修复）</title><link>https://allens.tech/post/202009131100/</link><pubDate>Sun, 13 Sep 2020 11:00:00 +0800</pubDate><author>allens.leng@gmail.com (Allens)</author><guid>https://allens.tech/post/202009131100/</guid><description>
<![CDATA[<h1>Git 版本化管理（从功能开发、发布到 bug 修复）</h1><p>Author: Allens(allens.leng@gmail.com)</p>
        
          <h2 id="描述">
<a class="header-anchor" href="#%e6%8f%8f%e8%bf%b0"></a>
描述
</h2><p><strong>Git</strong> 的使用已经越来越广泛了，<strong>Git</strong> 的好处这边也就不多说了，主要还是说一下使用向的东西，项目开发过程中也会遇到各种各样的问题，这边就把我遇到问题及解决的方式分享下</p>
<h2 id="经典-git-分支图">
<a class="header-anchor" href="#%e7%bb%8f%e5%85%b8-git-%e5%88%86%e6%94%af%e5%9b%be"></a>
经典 <strong>Git</strong> 分支图
</h2><p>下面就这张图给大家说下 <strong>Git</strong> 中<strong>开发</strong>-&gt;<strong>发布</strong>-&gt;<strong>Bug 修复</strong> 的流程。
<img src="/img/2020-09-13/1.png" alt=""></p>
<h2 id="常规开发流程">
<a class="header-anchor" href="#%e5%b8%b8%e8%a7%84%e5%bc%80%e5%8f%91%e6%b5%81%e7%a8%8b"></a>
常规开发流程
</h2><blockquote>
<p>我习惯使用 <strong>oh-my-zsh</strong> 去使用 <strong>Git</strong>，主要是因为他的 <strong>git alias</strong> 可以连 <strong>git</strong> 关键字都缩写成 <strong>g</strong>。</p>
</blockquote>
<ul>
<li>首先你需要有一个开发分支（<strong>dev</strong>、<strong>develop</strong>、<strong>develop.v1</strong>），需要开发新功能的时候，从开发分支切一个新分支出来进行开发：</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 常规 bash</span>
</span></span><span style="display:flex;"><span>git checkout -b <span style="color:#f92672">[</span>branch<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># oh-my-zsh</span>
</span></span><span style="display:flex;"><span>gcb <span style="color:#f92672">[</span>branch<span style="color:#f92672">]</span>
</span></span></code></pre></div><ul>
<li>部分模块完成，将当前目录的所有文件添加到暂存区，准备提交</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 常规 bash</span>
</span></span><span style="display:flex;"><span>git add .
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># oh-my-zsh</span>
</span></span><span style="display:flex;"><span>ga .
</span></span></code></pre></div><ul>
<li>功能开发完成，提交到本地仓库（<strong>commit message</strong> 的格式可以参考<a href="https://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html">阮一峰的网络日志</a>）</li>
</ul>
<blockquote>
<p>如果是多人开发并且有代码 Review 的话，尽量养成模块开发，分步提交的好习惯，用以避免让代码 Review 的人一次看几千行代码。</p>
</blockquote>
<ul>
<li>提交到远程仓库</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 常规 bash</span>
</span></span><span style="display:flex;"><span>git push <span style="color:#f92672">[</span>remote<span style="color:#f92672">]</span> <span style="color:#f92672">[</span>branch<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># oh-my-zsh</span>
</span></span><span style="display:flex;"><span>ggp
</span></span></code></pre></div><ul>
<li>提交到远程仓库</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 常规 bash</span>
</span></span><span style="display:flex;"><span>git push <span style="color:#f92672">[</span>remote<span style="color:#f92672">]</span> <span style="color:#f92672">[</span>branch<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># zsh</span>
</span></span><span style="display:flex;"><span>ggp
</span></span></code></pre></div><ul>
<li>分支合并</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 常规 bash</span>
</span></span><span style="display:flex;"><span>git checkout dev
</span></span><span style="display:flex;"><span>git merge <span style="color:#f92672">[</span><span style="color:#66d9ef">function</span> branch<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># oh-my-zsh</span>
</span></span><span style="display:flex;"><span>gco dev
</span></span><span style="display:flex;"><span>gm <span style="color:#f92672">[</span><span style="color:#66d9ef">function</span> branch<span style="color:#f92672">]</span>
</span></span></code></pre></div><ul>
<li>解决冲突（多人开发难以避免）</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 1.拉dev 分支最新的代码</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 常规 bash</span>
</span></span><span style="display:flex;"><span>git checkout dev <span style="color:#f92672">&amp;&amp;</span> git pull
</span></span><span style="display:flex;"><span><span style="color:#75715e"># oh-my-zsh</span>
</span></span><span style="display:flex;"><span>gco dev <span style="color:#f92672">&amp;&amp;</span> gl
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 2.切回自己的分支</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 常规 bash</span>
</span></span><span style="display:flex;"><span>git checkout <span style="color:#f92672">[</span><span style="color:#66d9ef">function</span> branch<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># oh-my-zsh</span>
</span></span><span style="display:flex;"><span>gco <span style="color:#f92672">[</span><span style="color:#66d9ef">function</span> branch<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 3.本地合并</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 常规 bash</span>
</span></span><span style="display:flex;"><span>git merge dev
</span></span><span style="display:flex;"><span><span style="color:#75715e"># oh-my-zsh</span>
</span></span><span style="display:flex;"><span>gm dev
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 4.解决冲突，选择最优解代码，两边代码都有问题的话就手动改正，提交。</span>
</span></span></code></pre></div><h2 id="发布流程">
<a class="header-anchor" href="#%e5%8f%91%e5%b8%83%e6%b5%81%e7%a8%8b"></a>
发布流程
</h2><ul>
<li>从 <strong>dev</strong> 分支切出一个新的 <strong>release</strong> 分支</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 常规 bash</span>
</span></span><span style="display:flex;"><span>$ git checkout -b <span style="color:#f92672">[</span>release-X.X.X<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># oh-my-zsh</span>
</span></span><span style="display:flex;"><span>$ gcb <span style="color:#f92672">[</span>release-X.X.X<span style="color:#f92672">]</span>
</span></span></code></pre></div><ul>
<li>将 <strong>release-X.X.X</strong> 合并到 <strong>master</strong> 分支</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 常规 bash</span>
</span></span><span style="display:flex;"><span>git checkout master
</span></span><span style="display:flex;"><span>git merge <span style="color:#f92672">[</span>release branch<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># oh-my-zsh</span>
</span></span><span style="display:flex;"><span>gco master
</span></span><span style="display:flex;"><span>gm <span style="color:#f92672">[</span>release branch<span style="color:#f92672">]</span>
</span></span></code></pre></div><ul>
<li>打 <strong>tag</strong> 进行版本更新, <strong>Makefile</strong> 示例（个人使用 <a href="https://github.com/conventional-changelog/standard-version">standard-version</a>）</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>.PHONY: server build version
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>registry<span style="color:#f92672">=</span>example.registry.com
</span></span><span style="display:flex;"><span>version<span style="color:#f92672">=</span><span style="color:#e6db74">`</span>git describe --tags<span style="color:#e6db74">`</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>server:
</span></span><span style="display:flex;"><span>	@hexo clean <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>	    <span style="color:#f92672">&amp;&amp;</span> hexo g <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>	    <span style="color:#f92672">&amp;&amp;</span> hexo s
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>version:
</span></span><span style="display:flex;"><span>	@echo <span style="color:#e6db74">&#34;build new version...&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>		<span style="color:#f92672">&amp;&amp;</span> standard-version <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>		<span style="color:#f92672">&amp;&amp;</span> git push --follow-tags origin master
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>deployment: version
</span></span><span style="display:flex;"><span>	@echo <span style="color:#e6db74">&#34;build docker image for origin ...&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>	    <span style="color:#f92672">&amp;&amp;</span> hexo clean <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>		<span style="color:#f92672">&amp;&amp;</span> hexo g <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>		<span style="color:#f92672">&amp;&amp;</span> docker build -t <span style="color:#66d9ef">$(</span>registry<span style="color:#66d9ef">)</span>/allens-blog/blog:<span style="color:#66d9ef">$(</span>version<span style="color:#66d9ef">)</span> . <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>		<span style="color:#f92672">&amp;&amp;</span> sudo docker push <span style="color:#66d9ef">$(</span>registry<span style="color:#66d9ef">)</span>/allens-blog/blog:<span style="color:#66d9ef">$(</span>version<span style="color:#66d9ef">)</span>
</span></span></code></pre></div><h2 id="bug-修复流程">
<a class="header-anchor" href="#bug-%e4%bf%ae%e5%a4%8d%e6%b5%81%e7%a8%8b"></a>
Bug 修复流程
</h2><ul>
<li>先从发布版本的 <strong>release</strong> 分支切一个 <strong>fix</strong> 分支进行 <strong>bug</strong> 修复</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># 常规 bash</span>
</span></span><span style="display:flex;"><span>git checkout release-X.X.X <span style="color:#f92672">&amp;&amp;</span> git pull <span style="color:#f92672">&amp;&amp;</span> git checkout -b fix_release_somebug
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># oh-my-zsh</span>
</span></span><span style="display:flex;"><span>gco release-X.X.X <span style="color:#f92672">&amp;&amp;</span> gl <span style="color:#f92672">&amp;&amp;</span> gcb fix_release_somebug
</span></span></code></pre></div><ul>
<li>添加代码到暂存区（同上）</li>
<li>提交到本地仓库（同上）</li>
<li>提交到远程仓库（同上）</li>
<li>代码合并到 <strong>release-X.X.X</strong></li>
<li>测试 OK，将合并 <strong>cherry-pick</strong> 到 <strong>master</strong></li>
<li>别忘记将合并 <strong>cherry-pick</strong> 到 <strong>dev</strong>，不然下次从 <strong>dev</strong> 切 <strong>release</strong> 的时候 <strong>Bug</strong> 又出现了</li>
<li>重新走一遍发布流程</li>
</ul>
        
        <hr><p>Published on 2020-09-13 at <a href='https://allens.tech/'>Allens' Blog</a>, last modified on 2020-09-13</p>]]></description><category>工作流</category></item></channel></rss>