<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Git 工程化 on Leanku 的博客</title><link>https://www.leanku.com/tags/git-%E5%B7%A5%E7%A8%8B%E5%8C%96/</link><description>Recent content in Git 工程化 on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 19 Apr 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://www.leanku.com/tags/git-%E5%B7%A5%E7%A8%8B%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><item><title>Git 高级实战：Cherry-pick、Worktree、Bisect 与工程化实践</title><link>https://www.leanku.com/post/devops/git-cherry-pick-worktree-bisect-engineering/</link><pubDate>Wed, 19 Apr 2023 00:00:00 +0000</pubDate><guid>https://www.leanku.com/post/devops/git-cherry-pick-worktree-bisect-engineering/</guid><description>&lt;p&gt;Git 的基础操作解决的是「如何提交代码」，分支与 Rebase 解决的是「如何协作开发」，撤销与恢复解决的是「操作出错以后怎么办」。&lt;/p&gt;&#10;&lt;p&gt;但在实际项目中，还会遇到一些更复杂的问题：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;一个 Bug 修复已经提交到 &lt;code&gt;main&lt;/code&gt;，如何同步到旧版本分支？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;同一个项目需要同时开发两个功能，频繁切换分支非常麻烦怎么办？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;线上 Bug 已经存在很久，如何从几百个 Commit 中快速找到引入问题的那一次提交？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;如何建立合理的 Tag 和版本发布流程？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;如何让 Git 在提交代码时自动执行检查？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;团队应该采用什么样的 Commit、Branch 和发布规范？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这些问题对应的就是 Git 的高级能力。&lt;/p&gt;&#10;&lt;p&gt;本文重点介绍 &lt;code&gt;cherry-pick&lt;/code&gt;、&lt;code&gt;worktree&lt;/code&gt;、&lt;code&gt;bisect&lt;/code&gt;、Tag、Hooks，以及一套适合 Web 项目的 Git 工程化实践。&lt;/p&gt;&#10;&lt;h2 id="cherry-pick只把指定-commit-带过来"&gt;Cherry-pick：只把指定 Commit 带过来&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;Merge&lt;/code&gt; 是以分支为单位整合代码，而 &lt;code&gt;Cherry-pick&lt;/code&gt; 是以 Commit 为单位应用变更。&lt;/p&gt;&#10;&lt;p&gt;Git 官方文档对 &lt;code&gt;cherry-pick&lt;/code&gt; 的定义非常直接：将一个或多个已有 Commit 引入的修改应用到当前分支，并生成新的 Commit。&lt;/p&gt;&#10;&lt;p&gt;例如现在有两个分支：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;A --- B --- C&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;feature/payment&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;A --- B --- C --- D --- E --- F&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中：&lt;/p&gt;</description></item></channel></rss>