git commit命令

git commit命令用於將更改記錄(提交)到存儲庫。將索引的當前內容與描述更改的用戶和日誌消息一起存儲在新的提交中。

簡介

git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
       [--dry-run] [(-c | -C | --fixup | --squash) <commit>]
       [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
       [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
       [--date=<date>] [--cleanup=<mode>] [--[no-]status]
       [-i | -o] [-S[<keyid>]] [--] [<file>…​]

描述

git commit命令將索引的當前內容與描述更改的用戶和日誌消息一起存儲在新的提交中。

要添加的內容可以通過以下幾種方式指定:

  1. 在使用git commit命令之前,通過使用git add對索引進行遞增的「添加」更改(注意:修改後的文件的狀態必須爲「added」);
  2. 通過使用git rm從工作樹和索引中刪除文件,再次使用git commit命令;
  3. 通過將文件作爲參數列出到git commit命令(不使用--interactive--patch選項),在這種情況下,提交將忽略索引中分段的更改,而是記錄列出的文件的當前內容(必須已知到Git的內容) ;
  4. 通過使用帶有-a選項的git commit命令來自動從所有已知文件(即所有已經在索引中列出的文件)中添加「更改」,並自動從已從工作樹中刪除索引中的「rm」文件 ,然後執行實際提交;
  5. 通過使用--interactive--patch選項與git commit命令一起確定除了索引中的內容之外哪些文件或hunks應該是提交的一部分,然後才能完成操作。

--dry-run選項可用於通過提供相同的參數集(選項和路徑)來獲取上一個任何內容包含的下一個提交的摘要。

如果您提交,然後立即發現錯誤,可以使用 git reset 命令恢復。

示例

以下是一些示例 -

提交已經被git add進來的改動。

$ git add . 
$ # 或者~
$ git add newfile.txt
$ git commit -m "the commit message" #
$ git commit -a # 會先把所有已經track的文件的改動`git add`進來,然後提交(有點像svn的一次提交,不用先暫存)。對於沒有track的文件,還是需要執行`git add <file>` 命令。
$ git commit --amend # 增補提交,會使用與當前提交節點相同的父節點進行一次新的提交,舊的提交將會被取消。

錄製自己的工作時,工作樹中修改後的文件的內容將臨時存儲到使用git add命名爲「索引」的暫存區域。 一個文件只能在索引中恢復,而不是在工作樹中,使用git reset HEAD - <file>進行上一次提交的文件,這有效地恢復了git的添加,並阻止了對該文件的更改,以參與下一個提交在使用這些命令構建狀態之後,git commit(沒有任何pathname參數)用於記錄到目前爲止已經進行了什麼更改。 這是命令的最基本形式。一個例子:

$ vi hello.c
$ git rm goodbye.c
$ git add hello.c
$ git commit

可以在每次更改後暫存文件,而不是在git commit中關注工作樹中跟蹤內容的文件的更改,可使用相應的git addgit rm。 也就是說,如果您的工作樹中沒有其他更改(hello.c文件內容不變),則該示例與前面的示例相同:

$ vi hello.c
$ rm goodbye.c
$ git commit -a

命令git commit -a首先查看您的工作樹,注意您已修改hello.c並刪除了goodbye.c,並執行必要的git addgit rm

在更改許多文件之後,可以通過給出git commit的路徑名來更改記錄更改的順序。當給定路徑名時,該命令提交只記錄對命名路徑所做的更改:

$ edit hello.c hello.h # 修改了這兩個文件的內容
$ git add hello.c hello.h
$ edit Makefile
$ git commit Makefile

這提供了一個記錄Makefile修改的提交。 在hello.chello.h中升級的更改不會包含在生成的提交中。然而,它們的變化並沒有消失 - 他們仍然有更改,只是被阻止。 按照上述順序執行:

$ git commit

這個第二個提交將按照預期記錄更改爲hello.chello.h

合併後(由git mergegit pull發起)由於衝突而停止,乾淨合併的路徑已經被暫存爲提交,並且衝突的路徑保持在未加載狀態。 您必須首先檢查哪些路徑與git狀態衝突,並在手工將其固定在工作樹中之後,要像往常一樣使用git add

$ git status | grep unmerged
unmerged: hello.c
$ edit hello.c
$ git add hello.c

解決衝突和暫存結果後,git ls-files -u將停止提及衝突的路徑。完成後,運行git commit最後記錄合併:

$ git commit