2016-08-20 62 views
2

我正在爲開源項目工作,但我不小心將我的更改提交給了我的本地master分支。沒有足夠強硬的思考,我只是繼續前進,將其推到我的起源,並提交我的主分支作爲公關。然後,我後來將上游主人拉入我的主人,這樣我就可以修復合併衝突以保持我的公共關係處於最新狀態。從那時起,更多的承諾已經上游。在叉中修復了一個破損的主分支

所以現在我有:

upstream master: A - B - C ... H - I - J 

my fork master: A - B - X - Y 

其中X是我的公關的第一個版本,和Y是C-H的合併到十

所以現在我的叉子是一個相當糾結。如果不在B之前啓動分支,然後每次將上游主機拉入該分支,我都無法在不相關的PR上工作。如果我的原始公關被拒絕或需要一年的時間才能獲得反饋,我將無限期地陷入這種狀態。

有沒有解決這個問題的方法?我是否必須覈實我的公關程序,並且我的X和Y提交併手動重做(如果是這樣,如何執行)?或者我可以以某種方式拯救我的公關,並讓我的主分支恢復與上游同步?

回答

2

我會做在這個場景看上去有點像這樣:

首先,從現有的master檢查出一個新的分支:

git checkout -b master-preserve 

然後,重置masterupstream/master

git checkout master 
git fetch upstream 
git reset --hard upstream/master 

現在,創建另一個分支:

git checkout -b upstream-with-commits 

而且櫻桃採摘XY到它:

git cherry-pick X Y # Replace with the appropriate commit IDs 

那麼這個分支推送到你的叉子,核彈現有的PR,並打開對upstream-with-commits一個新的。爲了讓您的叉的爲了master回來,這樣做:

git checkout master 
git push -f origin HEAD 

git push -f將迫使一推,並覆蓋所有歷史origin/master。要警告的是,如果其他人從您的叉子克隆出來,可能會給他們帶來問題。

哦,不要忘記刪除master-preserve

git branch -D master-preserve 

一旦你從它已經cherry-pick版,它不再是必要的。

+0

這工作很好。每個人都贊同這一點,因爲我只能做一次。 :) Github的一件好事...一旦我強制推動固定主分支,它會自動關閉原始公關。 – Tenfour04

+0

感謝您修復我的錯字。沒有注意到我不小心在那裏丟棄了'-b'。 :) –