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