設定與組態
取得與建立專案
基本快照
分支與合併
分享與更新專案
檢查與比較
修補
除錯
電子郵件
外部系統
伺服器管理
指南
- gitattributes
- 命令列介面規範
- Git 日常使用
- 常見問題 (FAQ)
- 詞彙表
- 掛鉤 (Hooks)
- gitignore
- gitmodules
- 修訂版本 (Revisions)
- 子模組
- 教學
- 工作流程
- 所有指南...
管理
底層命令 (Plumbing Commands)
-
2.55.0
2026-06-29
- 2.49.1 → 2.54.0 無變動
-
2.49.0
2025-03-14
- 2.45.1 → 2.48.2 無變更
-
2.45.0
2024-04-29
- 2.43.1 → 2.44.4 無變更
-
2.43.0
2023-11-20
- 2.35.1 → 2.42.4 無變更
-
2.35.0
2022-01-24
- 2.31.1 → 2.34.8 無變更
-
2.31.0
2021-03-15
- 2.27.1 → 2.30.9 無變更
-
2.27.0
2020-06-01
- 2.25.2 → 2.26.3 無變更
- 2.25.1 無變更
- 2.22.1 → 2.25.0 無變更
-
2.22.0
2019-06-07
- 2.14.6 → 2.21.4 無變更
-
2.13.7
2018-05-22
- 2.12.5 無變更
-
2.11.4
2017-09-22
- 2.10.5 無變更
-
2.9.5
2017-07-30
- 2.7.6 → 2.8.6 無變更
-
2.6.7
2017-05-05
- 2.5.6 無變更
-
2.4.12
2017-05-05
- 2.1.4 → 2.3.10 無變更
-
2.0.5
2014-12-17
概要
git commit-tree <tree> [(-p <parent>)…] git commit-tree [(-p <parent>)…] [-S[<keyid>]] [(-m <message>)…] [(-F <file>)…] <tree>
描述
這通常不是終端使用者想要直接執行的指令。請參閱 git-commit[1]。
根據提供的樹狀物件 (tree object) 建立一個新的提交物件,並將該新提交物件的 ID 輸出到標準輸出 (stdout)。提交訊息會從標準輸入 (stdin) 讀取,除非使用了 -m 或 -F 選項。
-m 和 -F 選項可以出現任意次數,順序不拘。提交日誌訊息將會依照選項提供的順序組合而成。
一個提交物件可以擁有多個父項。若僅有一個父項,即為一般提交。擁有多個父項則會使該提交成為多個歷史紀錄分支的合併。初始(根)提交則沒有父項。
樹狀物件代表了工作目錄在特定時間點的目錄狀態,而提交則代表了該狀態在「時間」維度上的意義,並說明了如何到達該狀態。
通常提交會識別出一個新的 "HEAD" 狀態。雖然 Git 並不在意您將該狀態的說明儲存在哪裡,但在實務上,我們傾向於將結果寫入 .git/HEAD 所指向的檔案中,以便隨時查看上一次的提交狀態。
選項
- <tree>
-
現有的樹狀物件。
- -p <parent>
-
每一個
-p表示一個父提交物件的 ID。 - -m <message>
-
提交日誌訊息中的一個段落。此選項可重複使用,每個 <message> 都會成為獨立的段落。
- -F <file>
-
從指定的檔案讀取提交日誌訊息。使用
-可從標準輸入讀取。此選項可重複使用,每個檔案的內容都會成為獨立的段落。 - -S[<keyid>]
- --gpg-sign[=<keyid>]
- --no-gpg-sign
-
對提交進行 GPG 簽署。
keyid引數為選填,預設為提交者身分;若有指定,必須緊接在選項後方,不可有空格。--no-gpg-sign用於取消命令列中稍早設定的--gpg-sign選項。
提交資訊
一個提交包含以下內容:
-
所有父物件 ID
-
作者姓名、電子郵件與日期
-
提交者姓名、電子郵件與提交時間。
提交註解會從 stdin 讀取。若沒有透過 "<" 重新導向提供 changelog 條目,git commit-tree 將會等待輸入,並以 ^D 終止。
日期格式
GIT_AUTHOR_DATE 和 GIT_COMMITTER_DATE 環境變數支援以下日期格式:
- Git 內部格式
-
格式為 <unix-時間戳記> <時區偏移量>,其中 <unix-時間戳記> 是自 UNIX 紀元以來的秒數。<時區偏移量> 是與 UTC 的正負偏移。例如,CET(比 UTC 快 1 小時)是
+0100。為了安全起見,建議在 <unix-timestamp> 前面加上
@(例如@0+0000),這會強制 Git 將其解讀為原始時間戳記。對於小於 100,000,000 的數值(少於 9 位數),這項操作是必須的,以避免與其他日期格式(如YYYYMMDD)混淆。 - RFC 2822
-
RFC 2822 描述的標準日期格式,例如
Thu,07Apr200522:13:13+0200。 - ISO 8601
-
ISO 8601 標準指定的日期和時間,例如
2005-04-07T22:13:13。解析器也接受以空格替換T字元。秒的分數部分將被忽略,例如2005-04-07T22:13:13.019將被視為2005-04-07T22:13:13。注意此外,日期部分接受以下格式: YYYY.MM.DD、MM/DD/YYYY和DD.MM.YYYY。
討論
Git 在某種程度上與字元編碼無關。
-
blob 物件的內容是未經解釋的位元組序列。在核心層級沒有編碼轉換。
-
路徑名以 UTF-8 正規化形式 C (Normalization Form C) 編碼。這適用於樹狀物件、索引檔案、參照名稱,以及命令列參數、環境變數和設定檔(
.git/config(請參閱 git-config[1])、gitignore[5]、gitattributes[5] 和 gitmodules[5])中的路徑名。請注意,Git 在核心層級將路徑名僅視為非 NUL 位元組的序列,沒有路徑名編碼轉換(Mac 和 Windows 除外)。因此,使用非 ASCII 路徑名即便在採用舊式擴展 ASCII 編碼的平台和文件系統上大抵也能正常工作。然而,在此類系統上建立的儲存庫將無法在基於 UTF-8 的系統(如 Linux、Mac、Windows)上正常運作,反之亦然。此外,許多基於 Git 的工具直接假設路徑名為 UTF-8,且無法正確顯示其他編碼。
-
提交日誌訊息通常以 UTF-8 編碼,但也支援其他擴展 ASCII 編碼。這包括 ISO-8859-x、CP125x 等多種編碼,但「不包括」UTF-16/32、EBCDIC 和 CJK 多位元組編碼(GBK、Shift-JIS、Big5、EUC-x、CP9xx 等)。
雖然我們鼓勵將提交日誌訊息以 UTF-8 編碼,但核心和 Git Porcelain 的設計都不會強迫專案使用 UTF-8。如果特定專案的所有參與者都覺得使用舊式編碼更方便,Git 並不禁止。但是,有幾件事需要記住。
-
如果提供的提交日誌訊息看起來不是有效的 UTF-8 字串,
gitcommit和gitcommit-tree會發出警告,除非您明確說明您的專案使用舊式編碼。說明方式是在.git/config檔案中設定i18n.commitEncoding,如下所示:[i18n] commitEncoding = ISO-8859-1
使用上述設定建立的提交物件會在其
encoding標頭中記錄i18n.commitEncoding的值。這是為了幫助以後查看的人。缺少此標頭意味著提交日誌訊息是以 UTF-8 編碼的。 -
gitlog、gitshow、gitblame及其相關指令會查看提交物件的encoding標頭,除非另有指定,否則會嘗試將日誌訊息重新編碼為 UTF-8。您可以使用.git/config檔案中的i18n.logOutputEncoding指定所需的輸出編碼,如下所示:[i18n] logOutputEncoding = ISO-8859-1
如果您沒有此設定變數,則會改用
i18n.commitEncoding的值。
請注意,我們刻意選擇不在建立提交時重新編碼提交日誌訊息以在提交物件層級強推 UTF-8,因為重新編碼為 UTF-8 不一定是可逆的操作。
GIT
git[1] 套件的一部分