2012-09-18 32 views
68

如何在不更改文件的情況下創建新的commit並創建新消息?如何提交沒有更改和新消息?

這是不可能的,因爲提交的代碼(SHA?)將是相同的?

+0

更多的紙幣比代碼本身。 –

+1

而不是做你在問什麼,而是使用'git notes'。 – wjl

+2

@iight如果你還沒有推動你的代碼,也可以考慮'git commit --amend'。這將帶您回到提交屏幕,您可以在其中編輯您的消息,並且如果您執行了上傳操作,則可以將額外的文件添加到提交中。請記住,像rebase一樣,這會導致您的原始提交過時,並且可能會導致令人討厭的合併頭痛,因爲任何人將其代碼從舊提交中解脫出來。 –

回答

91

這樣做很少有很好的理由,但對於空提交,參數是--allow-empty,而空消息的參數是--allow-empty-message。您也可以通過輸入git help commit或訪問the online documentation來閱讀更多內容。

儘管樹對象(具有自己的散列)相同,但提交實際上會有不同的散列,因爲它大概會有不同的時間戳和消息,並且肯定會有不同的父提交。所有這三個因素都集成到git的對象散列算法中。


有幾個原因,你可能需要一個空的承諾(包含一些評論):

  • 作爲「聲明承諾」,(通過DavidNeiss)添加旁白或文檔包括關於通過測試或皮棉的事後數據(通過Robert Balicki)。
  • 若要測試git命令而不生成任意更改(通過Vaelus)。
  • 使用gitolite(通過Tatsh)重新創建已刪除的裸存儲庫。
  • 任意創建一個新的提交,例如重新觸發構建工具(通過mattLummus)或爲了個人日誌記錄或指標(通過BlueJ774)。然而,請仔細考慮一下:根據分支/合併結構,提交可能會持續很長時間,因此「僅提交任何內容」策略可能會無意中污染了您的團隊存儲庫中的臨時工作流程構件,並且難以將代碼修訂與短暫的cruft。

其他策略來添加元數據,以提交樹包括:

  • 單獨的分支或輕標籤總是指向一個提交的特定狀態(例如,「最後接受提交」或「目前的分期提交「)。
  • Annotated Tags用於記錄時間戳,提交者和消息的方式,指向現有提交而不在提交樹本身中添加條目。
  • git notes在現有的不可變提交上關聯可變註釋。
+1

我已經開始關注git流程[分支模型](http://nvie.com/posts/a-successful-git-branching-model/)。當你從'dev'立即創建一個'dev'分支形式'master',然後一個'feat'分支時,'feat'分支看起來來自'master'分支,因爲'dev'沒有明顯的提交「feat」分支來自哪個分支。第一次創建'dev'分支時的空提交有助於建立'dev'分支,因爲它是獨立於'master'的無限持久分支。一般來說這是有用的,當你使用分支機構層,並創建兩個層從一個單一提交 –

+0

另一個原因:如果前推忽略重要的東西從你提交信息的,你不能這樣做'提交--amend'如果遙控器不允許推力。通過這種方式,您可以允許開發人員查看與之前提交一致的重要消息。 –

+0

我想這樣做是因爲我推送了一個提交,但忘了在提交消息中提到了一些內容。我們的提交消息與問題跟蹤和持續集成軟件集成在一起,並且提交消息的內容會影響這些應用程序。有沒有更好的辦法?這在我看來似乎是最好的解決方案。我能想象的唯一事情就是能夠恢復先前的提交。 – sytech

19

如果我理解你是對的,你想做一個空的提交。在這種情況下,你需要:

git commit --allow-empty 
2

也許是更明智的選擇,你可以創建一個註釋標籤(有消息一個名爲提交)。請參閱git tag -a選項。

0

如果您使用像gitversion這樣的系統,那麼做這種提交就很有意義。您可以使用+ semver:主要評論來提交專門用於衝擊主要版本的提交。

4

空提交與消息

git commit --allow-empty -m "Empty test commit" 

空犯用空消息

git commit --allow-empty --allow-empty-message