2015-11-06 118 views
8

作出區別我是否可以顯示差異兩個提交之一是什麼是修正?換句話說,git是否將修改的提交保存在歷史記錄中?與修改承諾

回答

4

修改後的提交與其他提交沒有區別。從這個意義上說,完全可以在「正常」提交和已修改的提交之間進行區分。

換句話說,git保存修改的提交歷史記錄嗎?

沒有一些列表包含所有已修改的提交,否。修改後的提交與其他所有提交一樣在歷史記錄中。

當你修改一個提交時,它基本上被刪除並被一個新的代碼替換(它也得到了一個新的提交哈希),它有原始提交+修改後的更改。

git reflog中,您可以看到最近的操作,並確實顯示修改提交。從那裏引用可用於例如撤消git commit --amend。有關詳細信息,另請參閱How to undo "git commit --amend" done instead of "git commit"

+1

好的,謝謝Tim,_git reflog_ - > _git diff commit1_hash amend_commit_hash_解決了我的問題! –

0

我不認爲我理解這個問題,但我認爲其中的一部分是因爲我認爲你對git commit --amend的作用有錯誤的想法。

git中的提交實際上無法更改。 git commit --amend所做的就是編寫新的提交一個故意改變的父ID。

讓我們來看看進行新提交的正常流程。

在您進行新提交之前,您需要修改工作樹中的某些文件,然後使用git add來對這些更改進行暫存,以便提交新版本的文件。這個git add把文件的新版本放到git的「索引」中,即它的暫存區域。

已經在上次提交中的文件已經在暫存區域中。因此,您將提交的新提交將包含所有原始文件,但您更改的任何內容都將是新版本,而不是舊版本。

現在你運行git commit(不--amend)和git執行以下操作:

  • 收集提交的信息(從-m-F,或給編輯);
  • 獲取您的姓名和電子郵件,以及當前時間;
  • 獲取當前提交(而不是新提交)的SHA-1 ID;
  • 使用暫存區寫入「樹」對象:這是將與新提交相關聯的源樹;
  • 使用所有這些信息(作者+提交者,樹,父ID和消息)創建一個提交對象 - 此新提交對象具有新的唯一SHA-1 ID;
  • 最後,將新的ID寫入分支,以便分支標籤指向新的ID,而不是以前用作最尖端分支的分支。

的最後一步「成長的分支」,因此,如果您曾經有過一些提交,這樣的事情:

... <- E <- F <- G <-- master 

你現在多了一個:

... <- E <- F <- G <- H <-- master 

的分支名稱(master或任何可能的)現在指向您的最新提交HH指向使用作爲您最新的提交G

如果使用git commit --amend,混帳改變這個序列只是一個很小位:而不是使新的提交(H)點回當前(G),混帳使得新的點回到當前的父(在這種情況下,F):

   G 
      /
... <- E <- F <- H <-- master 

現在master(或你對)指向H,指向F等任何分支。

如果你運行git log,混帳與當前開始提交(H)並記錄它,然後移動到它的父(F),並將其記錄,依此類推。承諾G似乎已經消失。

G的SHA-1 ID是仍在(默認爲30天),在「reflogs」中。有一個HEAD的推薦日誌,一個用於你當前的分支。如果您在分支master上,而您剛剛製造了H,則[email protected]{1}master的上一個小費,即。或者,如果您將SHA-1 ID保存在屏幕的某個位置,則可以剪切並粘貼它以查看提交G

(該--amend交換機還可以修改合併提交。此作品完全相同的方式如上,那只是意味着Git有從老枝尖複製所有父ID來新的。)