2013-06-23 26 views
4

我意識到我在之前的承諾變更中犯了錯誤。還有幾個其他的提交依賴於這個(錯誤的)提交。修改以前在git中承諾的變更

我可以修改它並將這些更改傳播到工作副本嗎?

回答

3

(有關修改公共歷史的常見警告......)

由於需要修改的承諾,就做如下的最簡單方法之一:

1)檢查出使用gitkgit log你想使用git checkout <SHA>(找到合適的SHA修改提交)。

2)使用git checkout -b <new branch name>在此提交中創建一個新分支。

3)根據需要修改代碼。

4)使用git commit --amend修改提交。

5)執行「到」重新綁定以將剩餘的提交從原始分支移過。要做到這一點,記得改變的SHA提交你從上面修改了它之前,和:使用git checkout <original branch name>

  • 切換到原來的分支。
  • 運行git rebase --onto <new branch name> <before SHA of the modified commit>

這將產生在新分支頂部的原始分支上的SHA之後重放提交的效果。您可能需要在重新綁定期間解決合併衝突(照常)。

6)使用git branch -d <new branch name>刪除新分支。

和往常一樣,看看gitk中發生了什麼,以確保它是您的想法,並且(爲了安全起見)在進行rebase之前標記原始分支。

1

如果提交已被推遲,你可以通過

git revert <commit hash> 

恢復它爲了得到提交哈希,只需使用git log命令

6

這是可以做到的,但我寧願不這樣做。改變過去有副作用。您的分支或提交樹不會快進,您必須覆蓋服務器上的分支(如果有)。換句話說,除非你是最後一個看到它並且只在你的計算機上。這可能會產生更多問題,如果出現任何問題,您可能會丟失任何東西。

如果你準備好進入時間旅行和替代現實的世界!

歡迎git rebase

率先上手,創建要變基一個新的分支,這將創造你想要的情況下,任何改變不順心的只是刪除底墊和什麼都不會分支副本不斷變化。你可以只注意提交散列。

最簡單的入門方式是git rebase -i HEAD~N,其中N是您想要更改的過去提交數量。

它應該打開一個編輯器,您可以將每行的第一個單詞更改爲類似編輯的內容。然後保存文件,你正在重塑!

重新綁定時,您可以做任何更改添加文件,刪除文件等。當你提交時,如果沒有衝突,它應該自動繼續。一旦完成了一切,那麼你將擁有一個重新設計的分支,其中的commit可以被刪除,編輯,重命名或任何你想要的。然後,如果一切正常。刪除舊的分支(未重新分配)推新的分支分支和瞧。

編輯

除非不是很清楚,否則打開編輯器。刪除一行將刪除選定的提交。如果你刪除了文件中的所有內容,它將不會執行任何操作。在重新綁定的任何時候,你都可以放棄它,並且git項目的狀態不應該改變。重新編制是一件相當安全的事情,因爲它實際上並沒有改變任何東西。如果您保留對舊提交的引用,那麼它們不會消失。重新綁定後,它會創建一條替代路徑。你將有一條老路和一條新路。舊路徑可能會被取消引用,並且任何引用此舊路徑的內容都應移至新路徑。

重要

順便說一句,有一件事我會做相反,是剛剛提交該修復舊提交的東西。我認爲必須僅在需要時才使用重新分配。例如,當你的同事偶然提交了一個4GB的數據庫備份。

2

首先進行更改並提交爲fixup! Original's commit message

然後決定你想在回購看到什麼(以及什麼是允許的)。 如果你不允許重寫歷史記錄,那麼就完全停下來,你可能會發生什麼。

如果允許,請在原始提交的父級上啓動交互式資產重置。您會看到前兩個條目是原創選項,並修復了該問題。將所有其他提交設置爲「編輯」,然後啓動。

該進程將停止在每次進一步的提交,在那裏編譯,重寫內容以瞭解更改,工作正常。並使用rebase --continue。然後強行推動分支(並且執行爲歷史重寫案例規定的所有儀式)。

+0

你也可以用'git的承諾,而不是拷貝--fixup原始sha1' /粘貼原來的承諾主題。 – adl