最近我開始爲我的項目實施新的實驗功能。不幸的是,我忘記了在開始之前進行分支,並將幾個提交到共享存儲庫服務器中推送到主分支。由於其他人可能已經檢查了我的提交,所以我想避免覆蓋服務器上的歷史記錄。如何在不覆蓋歷史的情況下將變更從主人分離到另一個分支?
由於我的變化,主人目前不穩定,這也不好。因此,我想恢復對master進行的更改,創建一個單獨的分支,它將包含這些更改,並且一旦足夠穩定,仍然可以將它們重新引入(合併)回主。
最近我開始爲我的項目實施新的實驗功能。不幸的是,我忘記了在開始之前進行分支,並將幾個提交到共享存儲庫服務器中推送到主分支。由於其他人可能已經檢查了我的提交,所以我想避免覆蓋服務器上的歷史記錄。如何在不覆蓋歷史的情況下將變更從主人分離到另一個分支?
由於我的變化,主人目前不穩定,這也不好。因此,我想恢復對master進行的更改,創建一個單獨的分支,它將包含這些更改,並且一旦足夠穩定,仍然可以將它們重新引入(合併)回主。
我在寫這個問題的時候已經想出瞭解決問題的辦法。我希望這個解決方案能夠對未來的某個人有用。對於我使用gitk和git-gui的所有更改。我建議你這樣做,因爲它比使用命令行更容易,並且你將對目前的情況有一個直觀的理解。以下是我採取的步驟:
爲了安全起見,我建議您在本地進行所有更改,並且只有在完成後確保所有內容都正確無誤。那麼如果發生錯誤,您可以隨時刪除存儲庫並從共享服務器再次克隆。
此答案使用命令行工具,並採用不同的方法來管理分支。它可能比使用多種不同口味的復位更容易混淆。
在GIT中1.7.2 revert
命令和後可以在一個命令恢復多次提交:
git revert last-stable..
這將創建復歸提交對每last-stable
最多提交之後,並且包括當前HEAD提交(以相反的順序)。如果你需要處理很多不必要的提交,那麼你可能要恢復他們都在一個單一的承諾:
這裏是如何把那個連同其他一些命令來重新建立實驗性分支在復歸的頂部犯(S):
(假定共享分支被命名爲master
)
# Make sure we have the latest shared master
git checkout master
git pull
# Mark the last experimental commit
git branch experimental
# Revert the experimental commits
git revert last-stable.. # optionally use -n and manually commit batched reverts
# Replay the experimental commits on top of the reverted commits
git checkout -B experimental master
git cherry-pick [email protected]{1}
我很困惑:你的問題明確表示,要*避免覆蓋服務器上*歷史,那麼你開始一個硬復位,親我寫了不同的歷史...... – Cascabel 2011-02-23 22:50:59
@Jefromi:第二步(混合重置)阻止它實際重寫任何歷史(它將HEAD指向最後的共享提交,因此下一步中的提交建立在共享之上歷史)。另一種方法是使用雙結帳:'git checkout master && git checkout last-stable - 。(第一個位置是構建共享歷史記錄的第一個位置,第二個位置將索引和工作樹恢復爲last-stable的內容')。 – 2011-02-24 06:17:06