[TOC] #### 1. 介绍 --- git commit 命令用于将工作区内容或暂存区内容提交到版本库 本文记录 git commit 的常见用法,日常开发中,这几个参数足够使用了 ```bash # 将暂存区内容提交到版本库, 进入 vi 命令界面输入提交信息 git commit # 将某些已被跟踪的文件提交到版本库(包含工作区和版本库) git commit [file1] [file2] [...] # 将暂存区内容提交到版本库, 无需进入 vi 命令界面输入提交信息 git commit -m [message] # 跳过 git add, 将所有已被跟踪的文件更改提交到版本库 git commit -am [message] # 使用一次新的commit, 替代上一次提交 # 如果代码没有任何新变化, 则用来改写上一次commit的提交信息 git commit --amend -m [message] ``` #### 2. 用法 --- 将所有暂存区文件提交到版本库,进入 vi 命令页面输入提交信息 ```bash git commit ``` 将所有已被 git 跟踪的文件提交到版本库 **(包含工作区和暂存区)**,进入 vi 命令页面输入提交信息 ```bash git commit [file1] [file2] [...] ``` git commit 参数选项 | 参数 | 说明 | | ------------ | ------------ | | `-m <message>` | 指定提交信息,没有该选项时将打开文本编辑器提示输入消息 | | `-a` | 提交所有已修改或删除的文件(提交已被 git 跟踪的文件的更改),相当于默认执行了 `git add -u` | | `--amend` | 将本次提交追加到上一次的提交中 | | `--no-edit` | 使用与之前一样的提交信息,不打开编辑器进行修改 | #### 3. git commit -m --- 最常见的用法如下所示,如果没有 -m 参数,会进入 vi 编辑模式,然后写入提交信息 ```bash git commit -m [message] ```  将某些文件提交到版本库,可以跳过 git add,但必须是已被跟踪的文件 ```bash git commit [file1] [file2] -m [message] ```  #### 4. git commit -a --- `-a` 参数用于将所有已被跟踪的文件更改提交到版本库,跳过 `git add` 的步骤 特别注意: git commit -m 用于提交暂存区中的文件,git commit -am 用于提交已被跟踪的文件 使用 `-a` 参数相当于执行了以下命令 ```bash git add -u ``` `-a` 和 `-m` 参数经常连写使用 ```bash # 将已被跟踪的文件提交的本地库中 git commit -am <message> ``` 因此,git commit 命令的 -am 参数相当于执行了下面两个命令 ```bash # 将已被跟踪的文件提交到暂存区 git add -u # 将暂存区中的文件提交到本地库 git commit -m <message> ``` #### 5. git commit --amend --- `--amend` 参数用于修改上次提交记录信息。如果你想添加更改或修复之前提交的错误,这个选项很有用 情景举例:有个文件的修改操作忘记提交了,想要将这个文件的修改合并到上次提交记录中,此时可以使用该参数 下面命令会将暂存区中的文件提交到版本库 ```bash # 重新提交后进入 vi 界面,修改备注信息,适用于想在上次提交信息的基础上修改(第一行是上次备注信息) git commit --amend # 无需进入 vi 界面,就可以重新提交 git commit --amend -m <message> ``` 在日常开发中,难免会出现提交时备注信息打错了,想要修改它。特别注意:下面命令不会将暂存区文件提交到版本库 ```bash # 只修改上次提交备注信息,不会将暂存区文件提交到版本库 git commit --amend --only -m <message> ``` 进入 vi 编辑模式修改提交备注信息示例:  修改备注信息后,保存退出即可。该操作会修改上次提交的索引 id  #### 6. git commit --no-edit --- `--no-edit` 该参数的作用是使用与之前一样的提交信息,不打开编辑器进行更改 只有当想要修改提交内容而不修改提交信息时才会使用这个选项,常与 `--amend` 参数一起使用 #### 7. commit 多行提交信息 --- 提交信息大多数人都是使用一行,有时改动内容会比较多,三言两语很难表示清楚,可以使用换行更好的描述改动内容 多行提交信息内容:第一行内容代表是标题,第二行是空行,从第三行开始都是内容,以下面多行提交信息为例: ``` fix:用户模块、购物车模块 1、修复用户无法注册功能 2、修复购物车商品批量删除报错问题 3、修复积分商城支付成功后订单状态没有改变问题 ``` 下面是多行提交信息在当前主流代码托管平台上的显示效果  **提交多行提交信息的方法:** 方法 1(进入 vi 模式输入多行提交信息): ``` # 进入 vi 命令界面 git commit # 按下 i,进入 vi 的插入模式,将下面内容粘贴进入后,输入 :wq 回车即可 fix:用户模块、购物车模块 1、修复用户无法注册功能 2、修复购物车商品批量删除报错问题 ``` 方法 2(命令行输入多行提交信息): ``` # 第一步:输入第一行,按下两次回车 git commit -m "fix:用户模块、购物车模块 # 第二步:输入第二行、按下回车输入第三行 ... 1、修复用户无法注册功能 # 第三步:多行提交信息输入结束,尾部加上引号,回车完成提交操作 2、修复购物车商品批量删除报错问题" ``` 方法 3(粘贴提前写好的提交命令)【推荐】: 提前在文本编辑器中写好准备执行的提交命令,复制粘贴到命令行中执行即可,如下所示: ``` git commit -m "fix:用户模块、购物车模块 1、修复用户无法注册功能 2、修复购物车商品批量删除报错问题 3、修复积分商城支付成功后订单状态没有改变问题 " ``` #### 8. commit 背后到底发生了什么 --- 创建一个 git 仓库,用于测试 git commit 背后做了什么操作 ```bash echo 'hello git' >> 1.txt echo 'hello svn' >> 2.txt git init git add . # 提交到版本库,注意 .git 目录下的变化 git commit -m 'add 1.txt 2.txt' ``` 一、执行 git commit 后会在 `.git/objects` 目录中下面生成两个文件(一个是 commit 类型,一个是 tree 类型)   第二次执行 commit 后,查看这次 commit id 的文件内容,其中 `parent` 后面的值是上一次提交记录的 commit id  当文件存放在目录中时,tree 类型的 objects 文件中还会有一个 tree(新增了一个 user/4.txt 文件)  二、当前在 master 分支,那么执行 git commit 后会在 `.git/refs/heads/master` 中写入最新提交记录的 commit id ``` $ cat .git/refs/heads/master f08f522f3210eccbcff1d5e16c3da72435583f5e ```