2014-04-03 112 views
0

我有兩個回購。起源是上游的一個分支。我試圖做的是從上游分支重新提交一個特定的提交序列回到我的origin/master。從我一直在閱讀的內容來看,雖然櫻桃選擇允許範圍 - 它沒有辦法控制你從哪個分支拉動範圍。所以,我試圖用rebase - 去做這件事。這是我如何去做的。Git:使用rebase --onto/cherry-pick重播一系列提交

  1. 我檢出上游分支(git checkout upstream/feature)。這使我陷入無頭的狀態。

  2. 然後,我從這個無頭狀態(git checkout -b temp)創建一個臨時分支。

  3. 現在我想要將upstream/feature分支上的所有提交從HEAD重新回放到標記。我正在執行命令:git rebase --onto master start_tag^

看起來這應該開始重播從START_TAG高達upstream/feature(現爲分支TEMP)的頭所有的提交。 rebase運行,甚至表示它在輸出中重放正確的提交併且完成並沒有錯誤。但是,當我重新檢查主人時,新的提交不在那裏。看着我的臨時分支,看起來它只是重新提交自己的提交。他們仍然在那裏,但他們現在有新的提交ID。

任何想法如何獲得從上游分支到本地分支的一系列提交?我不知道爲什麼rebase --onto沒有在主人之上玩。

編輯:那我爲什麼要這樣做呢?

這個問題出現了,我試圖這樣做。基本上,我已經跌倒了兔子洞,正在盡我所能來管理我所做的一切。這是故事。

我們從原來的Joomla網站開始(稱爲repo A)。所有的事情都進行得很順利,客戶決定他們想要3個更多的網站,據說這些網站只是一些小的樣式變化。所以,我分出了我原來的repo A三個回購券(repo B,repo C,repo D)。

隨着時間的推移,Repo A有一些變化,它是獨特的,我想發送給叉子。要在所有回購中共享更改,我創建了shared分支。然後,在我的下游回購協議中,我可以從上游repo A中抽取shared分支。

更多的時間過去了,這些網站越來越遠。我遇到的情況是repo B中使用的組件在repo C中不需要。同樣,在repo B AND repo C等需要一些組件。在我的天真中,我決定如果我能夠將各個組件拖入分支,管理起來會更容易。在夢幻世界中,git子模塊應該是我去過的方式,但是我不能在Joomla中使用這些模塊,因爲它們的目錄是結構化的(不僅有一個文件夾可以跳轉到所有組件文件中) 。我最終決定將我的個人組件分拆到他們自己的分支機構(branch componentY,branch componentZ)。我不得不分支repoA master,因爲組件分支中有需要的祖先提交,這些分支在repoA shared分支中尚未結束。

在我的下游分支repo B我現在從repoA shared分支中抽取一般變化。我還需要從repoA組件分支中獲取新更改。我遇到的問題是,我不能簡單地在repoA componentZ中合併,因爲在我創建repoA componentZ分支之前,它會引起master上的所有提交。我標記了第一個componentZ提交,這是從我分支爲start_tag時開始的。

回到我原來的問題,所以我現在倒在repo B。我已成功拉入repoA shared分支併合並。現在我正在尋找合併(合併將是理想的,但我不認爲它適用於這種情況)提交repoA componentZ從該分支的HEAD分支到我已標記爲start_tag的提交。

所以,是的,相當混亂;但這正是我現在正在處理的事情。

+0

你爲什麼重新綁定***上游***回購的提交在你的本地提交之上?這聽起來像你在倒退。人們通常希望通過在上游工作之上重新設置他們的本地提交***來將他們的本地工作與上游代碼同步。如果你重新調整上游工作,上游回購可以更長時間接受來自你的請求,因爲你已經基本重寫了他們的工作。另外,什麼是'start_tag'?這是來自上游回購的標籤,還是您自己製作的標籤? –

回答

1

我懷疑那裏的人是會得到自己變成完全一樣亂作爲我,但這裏是我如何處理這種情況下,如果有幫助其他人在那裏。我發現修補允許我在分支上進行一系列的提交併將其應用到別處。絕對不漂亮,但這是我必須做的,以獲得我需要的結果。

  1. 結帳上游特性分支git checkout upstream/feature
  2. 創建提交的範圍中的貼片我在尋找git format-patch last_pull_tag^..HEAD
  3. 切換回掌握git checkout master
  4. 應用上主的頂部補丁git am --3way *.patch

如果使用此命令,請確保在應用這些修補程序後刪除這些修補程序,以免稍後應用它們。

2

在你自己的工作之上,你真的不應該從上游回購工作中重新組合工作,因爲這基本上會覆蓋上游回購工作,所以他們不能再接受你提出的任何拉動請求,請求包含其覆蓋的提交。

如果你想從上游同步你有新的變化地方工作,你要麼需要merge單位工作,或rebase自己的工作上游工作的首位。

合併:

git checkout master 
git merge upstream/feature 
git push origin master 

衍合:

git checkout myFeatureBranch 
git rebase upstream/feature 
git push origin myFeatureBranch 
+0

感謝您的回覆Cupcake。我編輯了我原來的問題,並詳細說明了我如何達到這個狀態。我認爲我的設置非常混亂,無法使用合併。 – user3116226