2011-02-23 26 views
1

最近我開始爲我的項目實施新的實驗功能。不幸的是,我忘記了在開始之前進行分支,並將幾個提交到共享存儲庫服務器中推送到主分支。由於其他人可能已經檢查了我的提交,所以我想避免覆蓋服務器上的歷史記錄。如何在不覆蓋歷史的情況下將變更從主人分離到另一個分支?

由於我的變化,主人目前不穩定,這也不好。因此,我想恢復對master進行的更改,創建一個單獨的分支,它將包含這些更改,並且一旦足夠穩定,仍然可以將它們重新引入(合併)回主。

回答

1

我在寫這個問題的時候已經想出瞭解決問題的辦法。我希望這個解決方案能夠對未來的某個人有用。對於我使用gitk和git-gui的所有更改。我建議你這樣做,因爲它比使用命令行更容易,並且你將對目前的情況有一個直觀的理解。以下是我採取的步驟:

  1. 對上一次穩定的提交執行硬重置。這將從索引和工作目錄中刪除所有不穩定的更改。
  2. 對共享服務器上的上次提交執行混合重置。這會將索引重置爲共享服務器上的當前提交,但會使工作目錄保持穩定狀態。
  3. 提交工作目錄中的所有更改。然後您將進行提交,以取消主控上所有不穩定的更改。
  4. 在此提交中創建實驗分支並進行檢查。此時實驗分支將沒有實驗代碼,所以我們來解決這個問題。
  5. 櫻桃挑選應該進入實驗分支的所有提交。這樣您將在實驗分支上重新引入這些更改。確保不要挑選我們剛剛做出的最後一次提交。如果使用gitk,它會顯示一條警告,說明您正嘗試挑選分支中的提交 - 忽略這些警告並繼續。
  6. Viola。你完成了。

爲了安全起見,我建議您在本地進行所有更改,並且只有在完成後確保所有內容都正確無誤。那麼如果發生錯誤,您可以隨時刪除存儲庫並從共享服務器再次克隆。

+1

我很困惑:你的問題明確表示,要*避免覆蓋服務器上*歷史,那麼你開始一個硬復位,親我寫了不同的歷史...... – Cascabel 2011-02-23 22:50:59

+1

@Jefromi:第二步(混合重置)阻止它實際重寫任何歷史(它將HEAD指向最後的共享提交,因此下一步中的提交建立在共享之上歷史)。另一種方法是使用雙結帳:'git checkout master && git checkout last-stable - 。(第一個位置是構建共享歷史記錄的第一個位置,第二個位置將索引和工作樹恢復爲last-stable的內容')。 – 2011-02-24 06:17:06

2

此答案使用命令行工具,並採用不同的方法來管理分支。它可能比使用多種不同口味的復位更容易混淆。

在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} 
相關問題