需求

在一般的项目中,往往只需要将某个分支往 dev 分支合并,但是有时候并不是所有的 commit 都需要合并.在这个例子中, 一共会有三个分支: dev qa prod, dev是我们开发的分支,所有的功能都将在这个分支上开发,当开发完成后, 本地测试通过后,需要发布到qa分支,测试.当需要正式上线时,需要将功能提交到prod上.

dev 开发

现在假设有三个需求,我们都进行了开发,所以会有三个 commit 信息. 在 dev 上会呈现这样的 commit history img 现在我们仅仅只需求二更新到 qa 分支,我们应该怎么操作呢?

# 首先我们现在本地建立与qa的链接
git fetch origin
 
# 新建本地qa分支
git checkout -b qa origin/qa
 
# 然后进行合并,这里使用到了 git cherry-pick
# git cherry-pick commit_id
git cherry-pick commit_id

在上面的事例中,我们仅仅合并了一个 commit 了,但是如果需要合并多个且连续的 commit 应该怎么办呢假设我们需要 从 commit_id: first_commit 的 commit 合并到 commit_id: last_commit 的 commit

# 依旧使用git cherry-pick  这种情况是[]前闭后闭
git cherry-pick first_commit^..ast_commit
 
# 如果我们希望不包含第一个 也是就(]前开后闭
git cherry-pick first_commit..ast_commit
 
# 可能会遇到冲突,我们解决完冲突后使用
git cherry-pick --continue

以上就可以完成从dev分支合并需要的 commit 内容到qa分支了,qaprod同理

出现 bug 了

但是往往我们在开发的过程中并不是一帆风顺的,很难一步到位,所以可能某个功能需要再次调整,平常的项目,重新调整了, 提交个 commit 往 dev 合并就可以了,但是当前项目的特殊性,可能改功能可能不会立即上线,也许在一个月后,到那时,可能已经不记得这个功能被修复过,所以,我们可以将相同功能的 commit 融合成一个.首先还是正常的开发,解决 bug,这里使用需求 1 来举例.当我们正常开发完毕,推送 commit 后,commit history 会是:

img

此时我们需要将这个 commit 合并到 feat: 需求 1 这个 commit 中,应该如何操作呢

# 使用git rebase -i commit_id
git rebase -i commit_id

我们可以看到下面的界面

img

然后我们按下 i 进入编辑,编辑成这样

img

然后按下esc输入:wq退出

然后会进入 img 可以修改 commit 信息,修改流程和上面一样。 我们可以看见 img

最后我们

git push -f

查看 commit history 已经变成这样啦! img

然后我们需要发布测试啦,只需要使用git cherry-pick一次就可以将这个功能发布到qa环境咯

img

写到最后

这已经是最后啦