2013-11-28 43 views
1

如果我已經進行了一些更改,並且在此過程中注意到我之前(和未推送的)提交消息中存在錯誤,是否有方法在我的分階段更改中修改提交而沒有摺疊?如何在不包含任何分階段修改的情況下編輯Git中的錯誤提交消息?

我看到git-commit執行相關函數的手冊頁上的各種選項,但沒有組合似乎產生完全預期的效果:

  • --amend
  • --all(自動臺),但沒有'--none'
  • --message
  • --only(僅在指定的路徑)
  • -- <沒有更多的選項> ...

選項--only一個空文件列表(我不知道如何指定),將幾乎是正確的,但在任何情況下可能刪除上次提交(我不想)的更改。

天真的方法是reset然後commit --amend,但這需要重複的分段工作。或者,我可以通過rebase編輯不再更新的提交消息,但是這對於編輯消息來說似乎很笨拙和矯枉過正。

我不認爲stash save可以提供任何幫助,因爲stash似乎無法保留分階段和未分階段更改之間的區別。 (除非它可能stash只什麼已經上演?再說一遍,我看不出如何做到這一點。)

這個問題是關係到 How to modify existing, unpushed commits? 那裏有大量有用信息的答案之中,但是這一點,稍微不同的問題沒有解決。

任何提示,感激地收到;謝謝。

+0

「--amend --only」的問題究竟是什麼?它似乎正是你所需要的。 –

回答

2

你可以做到這一點與git-commit-treegit-reset

git reset --soft `git commit-tree <tree-id> -m "new message" -p HEAD^` 

<tree-id>是HEAD的根樹ID。您可以通過git cat-file -p HEAD

+1

你可以像嵌入一樣'git reset --soft $(git commit-tree $(git cat-file -p HEAD | grep tree | awk'{print $ 2}')-m「new message」-p HEAD ^) '? – Daniel

+0

我在下面添加了一些註釋。 http://stackoverflow.com/questions/20266734/#20270522(格式在一個單獨的答案,但我接受這個答案) – Rhubbarb

+1

如果你想要一個ref的樹ID,追加'^ {樹}',例如。 'HEAD^{tree}'或者只是一個冒號,'HEAD:'。 – jthill

1

得到它,我認爲積攢應該記住上演,什麼不是,也許你需要使用--no-keep-index

git stash --no-keep-index 
+0

感謝您的想法。我嘗試了'git stash --keep-index'後面跟着'git stash',這看起來很有希望。不幸的是,第二個'git stash pop'直到'commit'後才能被調用。這可能對某些人來說已經足夠了...... – Rhubbarb

+0

呵呵,'stash'ing不會保留stage *和* unstaged。 – Rhubbarb

+0

實際上,如果你問我,我從不信任存儲,他們在我之前做了一些骯髒的詭計,我寧願做一個'git commit -m'temp'',然後'rebase'和重命名,然後'git reset - 軟'而不是做一個存儲 –

0

只要繼續你的工作,後來做了一個交互式的rebase:

git rebase -i 

在你看到reword取代pick所有承諾要改寫提交的名單。

1

我想把它作爲對@npcode的answer的評論,但無法獲得正確的格式。以下是主要基於這個問題的答案...

這裏有一個更細緻的解釋,以及一個允許編輯的原始提交信息:

(1)$零一二三零四三六一三零九一七五零七六三二一零

打印根HEAD ${tree-id}的樹ID,在步驟(4)

任選地需要:

(2)$ git log -1 --format="%B" > ci.txt

轉儲ci.txt中的舊提交消息,然後可以對其進行編輯。可選地或者替代地,可以寫入全新的提交消息文件。

(3)$ editci.txt

然後要麼

(4a)的$ git commit-tree ${tree-id} -F ci.txt -p HEAD^

(4b)的$ git commit-tree ${tree-id} -m "<new message>" -p HEAD^

創建一個新的提交帶有提交信息的對象,有效地從文件或直接在命令行上。 這些命令 的或者打印ID的新的${commit-id}提交,在步驟需​​要(5)

(5)$ git reset --soft ${commit-id}

設置新提交作爲當前HEAD。 (1),(4b)和(5)組合步驟。

+0

好的反饋。 +1 – VonC

相關問題