2010-11-01 64 views
0

問題標題可能沒有意義,但我嘗試過。 :)Git的用法:「插入」提交之前提交

這裏是我的情況:

我有一個單一的分支(主)的存儲庫。 (從我的倉庫中,當我「發貨」時,我在代表發貨版本的提交處添加了一個標籤,所以我可以回到它。)

如果我查看提交的時間線,讓我們來說一下似乎是這樣的:

Start ----------> A --> HEAD 

其中,「A」是一些承諾在最近的過去,但在此之前HEAD。我希望「發佈」一個省略了自A以來所有更改的構建版本。但是,在發佈它之前,我還想對該版本的樹進行一兩個調整。我試圖在概念上做的事情是回滾到A點,提交一些更改,然後在發送後,重新應用從A - > HEAD發送的所有差異,這將使我恢復到最新狀態幷包含我也對A做了一些調整。

這就是我想要做的概念。我不確定如何考慮用git實現這一點的最佳方式。有人可以在這裏提供一些周到的指導嗎?

謝謝!

回答

1

git checkout -b release_A A;會給你一個分支來玩基於該版本。 (假設它被標記爲release_A - 你也可以使用sha1sums來引用特定的提交)。

黑客和git commit創建新的提交。

git tag release_A_2所以你有這個版本的標籤。

然後準確選擇下列之一:

  1. git rebase A mastergit checkout master; git rebase A
  2. git checkout master; git merge A

在這兩種情況下,你可以任選git branch -d A遵循,以消除你不再分支使用。

選擇1將完全符合你的要求。但是,如果其他人將這個分支用於任何事情,這通常是一個壞主意。根據你的設置,這可能是你想要的。

選擇2實際上不會改變歷史 - 所有提交都代表實際的歷史。相反,它會將該分支中的更改合併到master中。合併通常會因爲痛苦而聲名狼借,但這個git應該和案例1一樣聰明。如果自release_A以來已經標記或發佈了任何內容,我強烈建議使用此方法,因爲這意味着這些方法仍然可以重現。

+0

感謝這裏的細節。 – 2010-11-04 16:05:52

2

你可以從字面上做你正在問的與git rebase -i。提交新的更改,然後使用rebase -i移動它們。

但是,如果您曾與任何人共享該樹,則最好不要替換這些中間版本,而是執行諸如git checkout -b release_A A之類的操作,然後在該分支上進行更改。然後您可以將其git mergegit cherry-pick重新放回您的主人。

+1

謝謝,本。 「與任何人共享樹」是否包含從本地存儲庫到遠程存儲庫的操作? (儘管我知道除了我之外沒有人從它身上拉出來。) – 2010-11-01 06:37:11

+0

如果你這樣做,你將不得不強制推送。如果任何人*在*之後推* /克隆,那麼他們會對您非常不滿。 – 2010-11-01 06:45:57