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