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