2014-09-26 73 views

回答

16

假設你在一個乾淨的工作狀態,並且您的回購如下所示:

enter image description here

如果你再運行

git commit --amend 

寫提交信息,保存並退出您的編輯器發生以下情況:

  1. 您的暫存區域 - 如果您沒有s進行任何新的更改,將與提交f42c5相同 - 用於創建新提交:31b8e。它的父代將與您正在修改的提交(那些)相同:f42c5
  2. master分支引用移至指向新提交(31b8e)。
  3. HEAD參考master

enter image description here

需要注意的是修改後的提交(f42c5)現在從您的回購協議(因此它的「透明」在我的圖形樣式)的任何引用不可達。它仍然存在於你的存儲庫的對象數據庫中,但是當Git運行定期清理時,或者如果通過運行git gc(垃圾回收)顯式觸發它,最終會被刪除。


附錄(基於Jason Baker's comment):需要注意的是,只要修改後提交,f42c5,仍然存在於你的回購,你必須找出它的提交ID(例如的方式,通過釣魚它出於master分支的reflog),你仍然可以檢查出來。運行

git checkout master # just to be sure that master is the current branch 
git reset --hard f42c5 

或(假設你沒有,在此期間,所做的任何新承諾上master,復位master,或以其他方式移動master分支參考)

git checkout master # just to be sure that master is the current branch 
git reset --hard [email protected]{1} 

將使您在以下情況:

enter image description here

但現在,提交31b8e將BEC ome無法訪問。


+0

您可以通過「checkout」或通過reflog回到'f42c5'嗎?我承認這將是一件愚蠢的事情,但我很好奇,如果可以訪問舊提交* * – 2014-09-26 00:59:20

+1

@JasonBaker是的,你總是可以檢查修改後的(現在無法訪問的)提交,只要它還沒有被垃圾收集,你有一個方法來提及它。 – Jubobs 2014-09-26 01:11:29

+1

呵呵,現在命令不太正確,'git reset' * always *會重置* current *分支(這意味着'HEAD'也不能被分離)。把結賬大師放在第一位,等等...... – torek 2014-09-26 01:19:44

4

說你只是犯了「B」

... --- A --- B 
      ^
       | 
      master 
      HEAD 

修訂「B」將建立一個平行的承諾成爲新的分支頭。

 +---- B 
     | 
... --- A --- B' 
      ^
       | 
      master 
      HEAD 

B」是從提交的從B改變加時發出的git commit --amend你已經上演了變化的組合產生。

+1

要建立在此答案上,B'將包含來自B的更改的組合,以及您現在坐在回購中的任何分階段更改 – 2014-09-26 00:47:59

+0

@Jason Baker,Added。 – ikegami 2014-09-26 00:50:16

0

據我所知,ammend作品這樣的:

git commit --ammend工作的變化ammend必須到腳手架區(SA)

  1. 它使git reset -- soft對帶回的變化在SA的最後一次提交(提交給ammend)中提交併將索引移動到先前的提交(在提交之前提交以進行修改)。一切都保持了git commit命令之前的使用。
  2. 它使git add與所有文件添加到新的提交(這將是ammend承諾)。要添加的文件是那些在git reset --soft登陸之前進入SA的文件,重置後此文件將保存到WD中,因此有必要將它們添加到SA以生成推薦提交
  3. 使git提交。它將生成一個新的提交,因此推薦提交的新ID。對於這一點,git的承諾--ammend不應該被用來與推提交

如果使用--no-edit註釋重新應用於ammended提交,否則你必須引入一個新的評論(becouse它是一個新的提交,每個提交需要註釋)。

有關腳手架區和工作目錄的詳細信息,請參閱Reset Demystified