2012-02-01 57 views
9

我有提交的線性歷史上的一個簡單的存儲庫,如:如何在無關分支之上重新應用提交?

[A] -> [B] -> [C] -> [D] -> [E] ... 

我基本上需要刪除提交A和B,所以我想我會創建一個新的存儲庫,並想實現這樣的:

[X] -> [C] -> [D] -> [E] ... 

所以我創建了一個新的存儲庫,手動創建提交X是需要存儲從A和B的相關信息,現在需要一個命令,將帶來犯C,d,E等,從原來的存儲庫和將投入它在我的新提交X之上。

如何做到這一點?

編輯:兩個問題我有一個建議的摘櫻桃方法是:

  1. 轉移的提交失去了他們的日期。有什麼辦法保存提交日期嗎?
  2. 當我從原始存儲庫獲取master(並且該遠程主服務器沒有任何與新存儲庫相同的提交)時,我無法刪除這些提取的提交。當我做git branch -D myoriginalrepo/master時,它說沒有這樣的分支存在,而我可以在我的GUI工具中清楚地看到這些提交。
+0

我想你應該看看git cherry-pick。 – 2012-02-01 02:22:41

+0

你有沒有想過如何保持日期變化? – thinsoldier 2014-06-20 17:40:25

回答

15

不知道爲什麼你需要提交日期保持不變,但這裏有雲:

git rebase B E --onto X --committer-date-is-author-date 

如果B..E不在同一個版本庫X(因爲他們可以if you create your fresh start in-place),您需要先獲取它們:

git fetch <path_to_old_repos> 

當然,BEX這裏的意思是他們犯下的IDS,如果你還沒有真正標記/支它們。

您也可以通過在原有的庫從A基礎重建和擠壓B到它做同樣的事情(儘管提交日期將不會被保留):

git rebase -i `A` 

# change "pick b" to "squash b" 

你會得到一個機會來改變承諾消息,在這一點上,你可以使它成爲X的。

+0

這聽起來像是迄今爲止最好的方法,但是,我有一個問題,使用'git fetch'獲取提交。我如何參考他們?他們不在任何分支上,是嗎? – Borek 2012-02-01 12:56:28

+2

'git fetch'將爲您創建一個名爲'FETCH_HEAD'的便利分支,該分支將指向您舊倉庫中的任何「HEAD」(即任何已簽出)。而且,跨存儲庫的commit-id將完全相同,所以你可以直接去'git log '。您也可以選擇在抓取過程中創建相應的分支:'git fetch their_branch:my_branch'。 – antak 2012-02-02 01:00:56

3

您可以使用git cherry-pick。在你的情況下:

git cherry-pick C D E 

而X是你的頭應該這樣做。

+0

謝謝,我認爲rebase會成爲我的朋友,但cherry pick是使用的命令。我希望我可以指定像「C ..」這樣的提交,因爲我在原始回購中有數百個提交。 – Borek 2012-02-01 02:32:15

+0

如果你有很多,有一些櫻桃選項,可以讓你分組。檢查文檔。 Rebase也會起作用 - 如果您在原始存儲庫上使用它來將A和B替換爲X,則最終會得到與您要查找的結果相同的結果。 – 2012-02-01 02:36:06

+1

櫻桃挑選似乎失去了提交日期信息(它可能會創建一個新的提交),這個問題是否與rebase一樣?這將是非常糟糕的,我需要維護提交日期。 – Borek 2012-02-01 02:42:10

1

你說你創建了「一個新的存儲庫」。你可能不想這樣做。如果出於某種原因,您的存儲庫中的提交A和B必須完全停止存在(例如,出於法律方面的原因,或者因爲您意外地提交了信用卡號碼和您的祕密食譜),您需要閱讀如何永久刪除提交。但首先讓我們來修復樹的其餘部分。

試着這麼做

git checkout -b freshstart A 
# modify the state of the system until it reflects your desired new beginning X 
git commit --amend 
git cherry-pick C D E 

現在你有一個分支叫freshstart其中有你的新的X開頭和承諾C,d和E假設他們很好地融合到十

+0

這是正確的,A和B必須從歷史中完全刪除,所以創建一個新的回購似乎是一個很好的開始。我創建了一個狀態X,獲取遠程分支original-repo/master,現在我可以從它挑選提交到主分支。我有兩個問題:1)櫻桃挑選的提交失去日期2)我不能引用原始回購/主分支(因爲它沒有任何與當地主人共同的父母,我站在我的'主'旁邊)。我無法刪除我從櫻桃採摘的那個臨時分支。 – Borek 2012-02-01 02:55:06

+1

你不需要一個新的回購來完全刪除提交。例如,您可以使用rebase來消除提交。唯一的問題是,如果你有法律上的理由或者某些東西需要移除提交,那麼你必須確保當你移除提交時變成垃圾的對象會被清理掉,這樣對於那些知道他們在做什麼的人來說它們仍然不可用。當然,你必須到處回購每個回購克隆,並做同樣的事情,否則你可能不履行法定義務。 – bames53 2012-02-01 05:17:21

+0

A和X沒有任何共同的提交,是否有可能創建一個在我的原始回購中沒有父項的分支? – Borek 2012-02-01 10:28:37