[TOC] #### 1. 介紹 --- git commit 命令用于將工作區(qū)內(nèi)容或暫存區(qū)內(nèi)容提交到版本庫 本文記錄 git commit 的常見用法,日常開發(fā)中,這幾個(gè)參數(shù)足夠使用了 ```bash # 將暫存區(qū)內(nèi)容提交到版本庫, 進(jìn)入 vi 命令界面輸入提交信息 git commit # 將某些已被跟蹤的文件提交到版本庫(包含工作區(qū)和版本庫) git commit [file1] [file2] [...] # 將暫存區(qū)內(nèi)容提交到版本庫, 無需進(jìn)入 vi 命令界面輸入提交信息 git commit -m [message] # 跳過 git add, 將所有已被跟蹤的文件更改提交到版本庫 git commit -am [message] # 使用一次新的commit, 替代上一次提交 # 如果代碼沒有任何新變化, 則用來改寫上一次commit的提交信息 git commit --amend -m [message] ``` #### 2. 用法 --- 將所有暫存區(qū)文件提交到版本庫,進(jìn)入 vi 命令頁面輸入提交信息 ```bash git commit ``` 將所有已被 git 跟蹤的文件提交到版本庫 **(包含工作區(qū)和暫存區(qū))**,進(jìn)入 vi 命令頁面輸入提交信息 ```bash git commit [file1] [file2] [...] ``` git commit 參數(shù)選項(xiàng) | 參數(shù) | 說明 | | ------------ | ------------ | | `-m <message>` | 指定提交信息,沒有該選項(xiàng)時(shí)將打開文本編輯器提示輸入消息 | | `-a` | 提交所有已修改或刪除的文件(提交已被 git 跟蹤的文件的更改),相當(dāng)于默認(rèn)執(zhí)行了 `git add -u` | | `--amend` | 將本次提交追加到上一次的提交中 | | `--no-edit` | 使用與之前一樣的提交信息,不打開編輯器進(jìn)行修改 | #### 3. git commit -m --- 最常見的用法如下所示,如果沒有 -m 參數(shù),會(huì)進(jìn)入 vi 編輯模式,然后寫入提交信息 ```bash git commit -m [message] ``` ![](https://img.itqaq.com/art/content/f434ac78584930ab3d1ada178b68f724.png) 將某些文件提交到版本庫,可以跳過 git add,但必須是已被跟蹤的文件 ```bash git commit [file1] [file2] -m [message] ``` ![](https://img.itqaq.com/art/content/4b8383ec0d1c1160c10f974b3ed3edf9.png) #### 4. git commit -a --- `-a` 參數(shù)用于將所有已被跟蹤的文件更改提交到版本庫,跳過 `git add` 的步驟 特別注意: git commit -m 用于提交暫存區(qū)中的文件,git commit -am 用于提交已被跟蹤的文件 使用 `-a` 參數(shù)相當(dāng)于執(zhí)行了以下命令 ```bash git add -u ``` `-a` 和 `-m` 參數(shù)經(jīng)常連寫使用 ```bash # 將已被跟蹤的文件提交的本地庫中 git commit -am <message> ``` 因此,git commit 命令的 -am 參數(shù)相當(dāng)于執(zhí)行了下面兩個(gè)命令 ```bash # 將已被跟蹤的文件提交到暫存區(qū) git add -u # 將暫存區(qū)中的文件提交到本地庫 git commit -m <message> ``` #### 5. git commit --amend --- `--amend` 參數(shù)用于修改上次提交記錄信息。如果你想添加更改或修復(fù)之前提交的錯(cuò)誤,這個(gè)選項(xiàng)很有用 情景舉例:有個(gè)文件的修改操作忘記提交了,想要將這個(gè)文件的修改合并到上次提交記錄中,此時(shí)可以使用該參數(shù) 下面命令會(huì)將暫存區(qū)中的文件提交到版本庫 ```bash # 重新提交后進(jìn)入 vi 界面,修改備注信息,適用于想在上次提交信息的基礎(chǔ)上修改(第一行是上次備注信息) git commit --amend # 無需進(jìn)入 vi 界面,就可以重新提交 git commit --amend -m <message> ``` 在日常開發(fā)中,難免會(huì)出現(xiàn)提交時(shí)備注信息打錯(cuò)了,想要修改它。特別注意:下面命令不會(huì)將暫存區(qū)文件提交到版本庫 ```bash # 只修改上次提交備注信息,不會(huì)將暫存區(qū)文件提交到版本庫 git commit --amend --only -m <message> ``` 進(jìn)入 vi 編輯模式修改提交備注信息示例: ![](https://img.itqaq.com/art/content/e9b28b959af7c29affed632384c4ec69.png) 修改備注信息后,保存退出即可。該操作會(huì)修改上次提交的索引 id ![](https://img.itqaq.com/art/content/f1ea244bfc3abbe598c61e0bc8612173.png) #### 6. git commit --no-edit --- `--no-edit` 該參數(shù)的作用是使用與之前一樣的提交信息,不打開編輯器進(jìn)行更改 只有當(dāng)想要修改提交內(nèi)容而不修改提交信息時(shí)才會(huì)使用這個(gè)選項(xiàng),常與 `--amend` 參數(shù)一起使用 #### 7. commit 多行提交信息 --- 提交信息大多數(shù)人都是使用一行,有時(shí)改動(dòng)內(nèi)容會(huì)比較多,三言兩語很難表示清楚,可以使用換行更好的描述改動(dòng)內(nèi)容 多行提交信息內(nèi)容:第一行內(nèi)容代表是標(biāo)題,第二行是空行,從第三行開始都是內(nèi)容,以下面多行提交信息為例: ``` fix:用戶模塊、購物車模塊 1、修復(fù)用戶無法注冊功能 2、修復(fù)購物車商品批量刪除報(bào)錯(cuò)問題 3、修復(fù)積分商城支付成功后訂單狀態(tài)沒有改變問題 ``` 下面是多行提交信息在當(dāng)前主流代碼托管平臺(tái)上的顯示效果 ![](https://img.itqaq.com/art/content/477b25ca34fa54d19b1c03f26a0df289.png) **提交多行提交信息的方法:** 方法 1(進(jìn)入 vi 模式輸入多行提交信息): ``` # 進(jìn)入 vi 命令界面 git commit # 按下 i,進(jìn)入 vi 的插入模式,將下面內(nèi)容粘貼進(jìn)入后,輸入 :wq 回車即可 fix:用戶模塊、購物車模塊 1、修復(fù)用戶無法注冊功能 2、修復(fù)購物車商品批量刪除報(bào)錯(cuò)問題 ``` 方法 2(命令行輸入多行提交信息): ``` # 第一步:輸入第一行,按下兩次回車 git commit -m "fix:用戶模塊、購物車模塊 # 第二步:輸入第二行、按下回車輸入第三行 ... 1、修復(fù)用戶無法注冊功能 # 第三步:多行提交信息輸入結(jié)束,尾部加上引號,回車完成提交操作 2、修復(fù)購物車商品批量刪除報(bào)錯(cuò)問題" ``` 方法 3(粘貼提前寫好的提交命令)【推薦】: 提前在文本編輯器中寫好準(zhǔn)備執(zhí)行的提交命令,復(fù)制粘貼到命令行中執(zhí)行即可,如下所示: ``` git commit -m "fix:用戶模塊、購物車模塊 1、修復(fù)用戶無法注冊功能 2、修復(fù)購物車商品批量刪除報(bào)錯(cuò)問題 3、修復(fù)積分商城支付成功后訂單狀態(tài)沒有改變問題 " ``` #### 8. commit 背后到底發(fā)生了什么 --- 創(chuàng)建一個(gè) 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' ``` 一、執(zhí)行 git commit 后會(huì)在 `.git/objects` 目錄中下面生成兩個(gè)文件(一個(gè)是 commit 類型,一個(gè)是 tree 類型) ![](https://img.itqaq.com/art/content/a4815e1379eccd873abaa8ab5d71cbc5.png) ![](https://img.itqaq.com/art/content/4be88e5947a0ac82dbe0a575ed8fd0cd.png) 第二次執(zhí)行 commit 后,查看這次 commit id 的文件內(nèi)容,其中 `parent` 后面的值是上一次提交記錄的 commit id ![](https://img.itqaq.com/art/content/923a3a43823ca14dd10a8da712393405.png) 當(dāng)文件存放在目錄中時(shí),tree 類型的 objects 文件中還會(huì)有一個(gè) tree(新增了一個(gè) user/4.txt 文件) ![](https://img.itqaq.com/art/content/5634184ce823e3ea460ef1c63c38b875.png) 二、當(dāng)前在 master 分支,那么執(zhí)行 git commit 后會(huì)在 `.git/refs/heads/master` 中寫入最新提交記錄的 commit id ``` $ cat .git/refs/heads/master f08f522f3210eccbcff1d5e16c3da72435583f5e ```