2013-01-07 29 views
2

我在一片泡菜。什麼是合併上游而不丟失變更的正確方法?

幾個月前我開始在一個回購的分支上進行開發。我做了一些改變。我正要推我的代碼回主作爲拉動請求,但我意識到有在此期間,不少變化......

所以,following the instructions at Github下「拉上游的變更」我想:

$ git remote add upstream ... # savon/httpi 
$ git fetch upstream 
$ git merge upstream/master 
$ git push origin/master  # coldnebo/httpi 

但是,現在我的叉子相當混亂。我還是寧願使用Git新手,所以不是試圖猜測的術語是什麼,我會簡單地告訴你什麼是我和我的預期:

這是我想要的差異。有沒有任何方法來重新設定/恢復,並做到這一點,而不會失去我的變化?

什麼亂七八糟的。

也許git pull會更好?

這並不是很多變化,所以如果它是不可恢復的,我總是可以手動對它進行差異化和重新編寫,但我正在尋找「正確的方式」來做到這一點。

回答

4

好吧,如果你的回購協議FUBAR,那麼這裏的步驟來恢復:

$ git remote update  # make sure origin and upstream are up to date 
$ git checkout master 
$ git branch my_changes # just to make sure my stuff isn't lost 
$ git reset --hard upstream/master 
$ git status 
# On branch master 
# Your branch is behind 'origin/master' by 8 commits, and can be fast-forwarded. 
# 

忽略的是快進廢話,它不會幫你,只是重置主。

$ git push origin +master # now, fork matches upstream/master 

現在,如何恢復以前的工作,所以它的可審查?

$ git diff --no-ext-diff --no-prefix master..my_changes > patchfile 
$ patch -p0 < patchfile # apply the patchfile to master 
$ git diff  # to verify patch visually. 
$ rm patchfile # clean up 
$ rake spec  # verify that it really works. 
$ git add . 
$ git status  # double triple verify 
$ git commit . 
$ git push origin master 

那個吸了。我試圖做rebase,但它一直說「沒有改變」,並沒有要求我檢查什麼?我很確定我不明白這裏發生了什麼事,這就是爲什麼我發佈我的鬥爭,所以有人可以解釋我如何能夠避免這個混亂,並從A到B更優雅,現在它已完全記錄。我很樂意將這一點歸咎於缺乏經驗,但我認爲拉動變化應該是git中的一個非常普遍的事情 - 我必須錯過一些東西。

4

您應該始終爲您創建的每個拉取請求創建新的分支。在你將它推送給github來創建請求之前,你應該將你的分支重定位到最新的上游分支。

Github上說,你用git merge對於這一點,我更喜歡使用git rebase upstream/master如果沒有太大的變化,這將防止合併提交


有時,重新裝訂不能繼續,因爲你改變的東西在上游分支已經改變了。舉例來說,假設你有一個text.txt文件,如:

Lorem ipsum 

您創建了一個PR更新這Lorem ipsum!和上游分支已經改變了這Hello World如果你做一個變基,使你的代碼是最新的在創建請求之前,您會遇到合併衝突。該文件與衝突標誌更新,你可以選擇你要使用的版本,你甚至可以編輯它,在我們的例子中,我們在text.txt得到這個:

<<<<<<< YOUR_PR_BRANCH 
Lorem Ipsum 
======= 
Hello World 
>>>>>>> THE_UPSTREAM_BRANCH 

在此之後,添加更新的文件用git add並執行git rebase --continue

+0

爲什麼要防止合併提交?你讓它聽起來像他們錯了或邪惡或什麼? –

+0

@CharlesBailey合併提交併非邪惡,但它們是工作流程中最無用和最隱含的提交。 rebase的另一個特點是它仍然是歷史,它不會在你提交之前/之後提交所有新的提交,它會把它們放在需要的地方。 –

+2

我想你可能誤解了合併提交和歷史。將兩個(或更多)並行工作流合併在一起時,合併提交會正確記錄。 Rebase僞裝了真實的歷史,因爲它將原始變化與合併結合在一起,假裝你在歷史的不同時間點對原來的變化進行了修改。 Rebase做了什麼,但保留了歷史。我不確定是什麼讓你說合並提交是模糊的或無用的;他們準確地記錄了在合併中完成的工作,絕對不是模糊的,可能非常有用。 –

1

git pull --rebase適合我,並保持歷史清潔。

相關問題