2011-11-04 20 views
5

(注意,我不是在尋找的答案git rebase -i如何「重新打開」git commit?

在善變的,我可以「重新打開」導入到我的補丁隊列中的承諾:

hg qimport tip 

的承諾是「開放」在這個意義上,就像之前我承諾的那樣,我可以恢復,做hg diffhg status等等。我怎麼在git中做到這一點?

(一切我已經在網絡上發現表明git rebase -i然後選擇編輯,但那是不同的,因爲承諾是不是「開」以同樣的方式。)

+0

另一種選擇是讓commit在那裏,改變一些東西,然後用它們來修改commit('git commit --amend')。 – Cascabel

回答

16

你只需要移動你的頭指針起來而不進行任何更改到你的工作副本:

git reset --soft HEAD^ 

復位移動指針,和軟選項指定,它不應該改變任何文件。默認值是混合的,這會重置您的索引,而硬選項實際上會刪除自工作副本中提交以來發生的更改。

HEAD是一個「魔術」git指針,它始終指向當前參考(即工作副本的父級)。脫字號(^)表示父母。你可以重複使用這個,例如HEAD ^^引用上次提交的父代。

+0

很好的答案,謝謝!你能記下你失去了提交信息,就像@武隆所做的那樣嗎? –

+0

如果你真的想反覆使用它,'HEAD ^^^^^'和'HEAD〜5'一樣。 (更確切地說,'HEAD'是一個符號引用,指向當前簽出的分支,該分支指向當前簽出的提交,或者如果處於分離的HEAD狀態,則直接進行提交,且未檢查分支) – Cascabel

+3

@PaulBiggar:避免丟失提交消息是修改而不是重置的重要原因。但是,如果您重置,您仍然可以間接恢復提交消息。 'HEAD @ {1}'是指先前簽出的提交,它(如果你還沒有做其他事情)將是預重置提交。你可以使用'git commit -c HEAD @ {1}'來使用它的提交信息作爲起點。 (如果你從那時起已經移動了HEAD,你可以使用'git reflog'來查找reflog中更遠的提交。) – Cascabel

2

假設你有沒有推送到您的遠程存儲庫,git reset --soft HEAD^將以丟失提交消息爲代價「重新打開」您的上次提交。

2

使用git commit --amend可以獲得相同的結果。

請參閱comparison chart之間Hg & Git。