• git 合并多个commit


    合并提交操作示例

    本文源自极客时间 《go 语言项目开发实战 孔令飞》

    本文是 rebase 命令的一个使用场景,关于rebase命令,可以参考这篇:git rebase 命令介绍

    假设我们需要研发一个新的模块:user,用来在平台里进行用户的注册、登录、注销等操作,当模块完成开发和测试后,需要合并到主干分支,具体步骤如下。

    首先,我们新建一个分支。我们需要先基于 master 分支新建并切换到 feature 分支:

    $ git checkout -b feature/user
    Switched to a new branch 'feature/user'
    

    这是我们的所有 commit 历史:

    $ git log --oneline
    7157e9e docs(docs): append test line 'update3' to README.md
    5a26aa2 docs(docs): append test line 'update2' to README.md
    55892fa docs(docs): append test line 'update1' to README.md
    89651d4 docs(doc): add README.md
    

    接着,我们在 feature/user分支进行功能的开发和测试,并遵循规范提交 commit,功能开发并测试完成后,Git 仓库的 commit 记录如下:

    $ git log --oneline
    4ee51d6 docs(user): update user/README.md
    176ba5d docs(user): update user/README.md
    5e829f8 docs(user): add README.md for user
    f40929f feat(user): add delete user function
    fc70a21 feat(user): add create user function
    7157e9e docs(docs): append test line 'update3' to README.md
    5a26aa2 docs(docs): append test line 'update2' to README.md
    55892fa docs(docs): append test line 'update1' to README.md
    89651d4 docs(doc): add README.md
    

    可以看到我们提交了 5 个 commit。接下来,我们需要将 feature/user分支的改动合并到 master 分支,但是 5 个 commit 太多了,我们想将这些 commit 合并后再提交到 master 分支。

    接着,我们合并所有 commit。在上一步中,我们知道 fc70a21是 feature/user分支的第一个 commit ID,其父 commit ID 是 7157e9e,我们需要将7157e9e之前的所有分支 进行合并,这时我们可以执行:

    $ git rebase -i 7157e9e
    

    执行命令后,我们会进入到一个交互界面,在该界面中,我们可以将需要合并的 4 个 commit,都执行 squash 操作,如下图所示:
    image

    修改完成后执行:wq 保存,会跳转到一个新的交互页面,在该页面,我们可以编辑 Commit Message,编辑后的内容如下图所示:
    image

    #开头的行是 git 的注释,我们可以忽略掉,在 rebase 后,这些行将会消失掉。修改完成后执行:wq 保存,就完成了合并提交操作。

    除此之外,这里有 2 个点需要我们注意:

    • git rebase -i 这里的一定要是需要合并 commit 中最旧 commit 的父 commit ID。
    • 我们希望将 feature/user 分支的 5 个 commit 合并到一个 commit,在 git rebase 时,需要保证其中最新的一个 commit 是 pick 状态,这样我们才可以将其他 4 个 commit 合并进去。

    然后,我们用如下命令来检查 commits 是否成功合并。可以看到,我们成功将 5 个 commit 合并成为了一个 commit:d6b17e0。

    $ git log --oneline
    d6b17e0 feat(user): add user module with all function implements
    7157e9e docs(docs): append test line 'update3' to README.md
    5a26aa2 docs(docs): append test line 'update2' to README.md
    55892fa docs(docs): append test line 'update1' to README.md
    89651d4 docs(doc): add README.md
    

    最后,我们就可以将 feature 分支 feature/user 的改动合并到主干分支,从而完成新功能的开发。

    $ git checkout master
    $ git merge feature/user
    $ git log --oneline
    d6b17e0 feat(user): add user module with all function implements
    7157e9e docs(docs): append test line 'update3' to README.md
    5a26aa2 docs(docs): append test line 'update2' to README.md
    55892fa docs(docs): append test line 'update1' to README.md
    89651d4 docs(doc): add README.md
    

    这里给你一个小提示,如果你有太多的 commit 需要合并,那么可以试试这种方式:先撤销过去的 commit,然后再建一个新的。

    $ git reset HEAD~3
    $ git add .
    $ git commit -am "feat(user): add user resource"
    

    需要说明一点:除了 commit 实在太多的时候,一般情况下我不建议用这种方法,有点粗暴,而且之前提交的 Commit Message 都要重新整理一遍。

  • 相关阅读:
    使用pipenv管理虚拟环境
    使用cookiecutter创建django项目
    Django中ModelViewSet的应用
    Redis添加历史浏览记录
    Django中配置用Redis做缓存和session
    点击即复制
    PostGreSQL数据库安装配置说明
    IntelliJ IDEA 2017.1.4 x64配置说明
    Struts2之2.5.10.1HelloWorld
    Apache Shiro系列(1)
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/15394686.html
Copyright © 2020-2023  润新知