2014-02-14 71 views
0

我對git比較陌生,我想我打破了我的主人。希望有人能幫我解開它。退出承諾起源/主

我在GitHub上有我的主人,我的開發系統上有本地主人和跟蹤分支。我也有我的QA系統的主人。

在我的開發系統上,我提交了本地分支,並將它合併到(本地)主設備中,然後將主設備推送到GitHub的origin/master。然後,我把主人帶到QA系統。然後,我對本地分支做了一些進一步的修改。

我所做的是:

dev branch -- merge --> dev master 
dev master -- push --> GitHub master -- pull --> QA master 

我想我應該做的:

dev **branch** -- push --> GitHub **branch** -- pull --> QA **branch** 

是嗎?

現在:我想在提交之前恢復QA和GitHub主...實際上,退出整個合併。然後,我想將分支(而不是主分支)推到GitHub上,並將分支拉到QA。

  1. 如何恢復對QA和GitHub上的主人?
  2. 我是否還需要恢復開發者?
  3. 如何保留我在開發中進行的分支更改?

請幫忙嗎?

回答

1

如果你推送了一個分支,而不是合併到主?

這是一個很好的問題。如果提交是高度實驗性的,那麼推動分支可能會更好。否則,如果你對提交有很高的信心,那麼合併到主人是正確的。如果您不需要,無需使用遠程分支來污染您的工作區。

假設您想要將此提交切換到分支並遠程推送。我就畫一個圖形提交了這樣的場景:

A-C-D 
\ \ 
    B---E < master, your_branch 

比方說,主人在B和C & d,其中上your_branch製造。 E是兩者的合併提交。在你的問題上。通過修復本地存儲庫,然後強制GitHub特別匹配它,您可以在GitHub & QA上恢復主服務器。所以實際上你的問題最好以相反的順序回答。

我們首先解決your_branch

git checkout your_branch 
git reset --hard D 

這將移動分公司d,產生:

A-C-D < your_branch 
\ \ 
    B---E < master 

現在,我們解決當地發展總體

git checkout master 
git reset --hard B 

哪得到:

A-C-D < your_branch 
\ 
    B < master 

再見,不需要合併提交E.

修復GitHub上(和QA)

git checkout master 
git push -f 

這將迫使主GitHub上回B.如果你用合作其他開發者,他們會因爲你重寫歷史而討厭這個。但是,由於這可能是你的個人存儲庫沒有合作,所以去做吧。現在做一個遠程分支:

git checkout your_branch 
git push origin your_branch 

現在GitHub上已經固定,以配合發展,更新QA應該是一個簡單:

git checkout master 
git pull 
git reset --hard origin/master # I'm assuming master will be on an orphaned commit after the pull 
+0

對不起,在響應長時間的延遲。你的指示很有魅力。當然,我已經簡化了情況,使問題清楚。在我的實際git歷史記錄中找到正確的點,並在響應中對應重置點「D」和「B」,花了我一段時間。 我還使用了@miqid提到的「隱藏」命令 - 這給了我更大的信心,如果我重置到錯誤的點,我可以恢復。 而且,正如你猜測的那樣,這個提交是「高度實驗性的」。推動大師以前工作,但這次是一個壞主意。 –

+0

很高興它工作得很好! –

0

對我而言,最初的問題似乎是個人工作流程偏好的問題,您是否希望開發分支在達到質量保證體系時已經合併到主體中。至於你目前的困境,我的(不那麼一定是最好的)建議:

  1. 在當地的主人,git revert <merge-commit>,恢復您的開發分支合併帶來的變化。向上推本地主機。把這個交給QA。在此之後,掌握所有存儲庫應該處於相同的歷史狀態。
  2. 根據上述觀點,爲了保持資料庫的一致性,我會這樣做,是的。
  3. 在進行恢復之前,請保存您的更改(參見git stash)。完成整個恢復過程後,彈出更改(參見git stash pop)。

希望你覺得有用。

+0

謝謝你的「藏匿」提示。這是一個有價值的安全網,我用它。 –