摘要:如果要維護一組本地更改,處理上游存儲庫的長期運行跟蹤的最佳做法是什麼?在github上跟蹤fork上游的最佳實踐
我想保持github上的fork與上游同步,但仍然允許明確跟蹤fork的唯一更改。 (對於這個討論,假定upstream
點主體工程庫和origin
指的是我的存儲庫叉)
想象我有這樣的事情,我一個分叉倉庫時,上游/大師在E.
Upstream:
A-B-C-D-E-F
Fork:
A-B-C-D-E ----- P ------T
\-L-M-/ \-Q-R-/
分叉倉庫後,我創建了兩個特徵分支(LM和QR)來添加我需要的新特徵,並將它們合併回我的原點/主。所以現在我的分支有上行不存在的改進。
我發現上游有一些有趣的修復,所以我想回到與上游同步。根據我發現的大多數參考文獻(git hub fork),推薦的方法是將上游/主文件合併到您的原點/主文件夾中,然後繼續。所以我會發出如下命令:
git checkout master
git fetch upstream
git git merge upstream/master
git push
那我就結束了倉庫,看起來像這樣:
Upstream:
A-B-C-D-E-F
Fork:
A-B-C-D-E ----- P ------T-F'
\-L-M-/ \-Q-R-/
有一對夫婦的我雖然這個問題看。
我實際上沒有在我的回購中提交F,我有F'具有相同的內容,但不同的散列。所以我不能輕易地引用這兩個倉庫之間的提交,並知道我有一個改變。 (當考慮到上游可能有多個更改並且它自己已經合併的一組特徵分支時,它變得更加複雜)
隨着我向前邁進並繼續這樣做,我越來越難以知道我的存儲庫中有什麼變化超出了上游的變化。舉例來說,我可能會將這些變化中的一部分提交回上游,同時繼續添加我自己的改進。經過幾次迭代後,如何看待我的存儲庫知道它與上游有什麼不同? (是否有git命令來查找這些更改?)
與#2類似,如何找到上游的修復程序並檢查是否包含修復程序?
我想這個問題的根源是沒有辦法,我保證我的倉庫是在「同步」在任何給定的點上游,因爲代碼和哈希值是不一樣的。那麼,我該如何準確地追蹤變化並保持自己不會瘋狂地嘗試保持同步?
注意:我曾經考慮過使用rebase來繼續將我的存儲庫重新綁定到上游,但這有一組完全不同的問題。例如,如果任何人通過子模塊,分支等引用我的respository,那麼歷史重寫將會破壞它們的引用。另外,我不認爲我的分支歷史能夠在rebase存活下存活下來,所以我不能完整查看我所做的所有功能分支和相關的歷史記錄。
其他人怎麼處理?我應該研究哪些最佳實踐?
更新:
基於來自賽斯的反饋,我創建了一組測試庫,以顯示我在談論它是如何工作了,他說的方式。
的倉庫是:
他們應該更清楚地顯示瞭如何從上游合併時有局部的變化,以及外觀。
感謝您的指點。我添加了一個示例來表明它的行爲與您描述的相同。現在看起來很明顯,但我錯過了從上游帶來匹配提交哈希的歷史合併。 還有一個問題:如果我在我的分支上,我怎麼能夠輕鬆找到所有與上游不同的更改,並以一種方式讓我理解/瞭解分支具有上游沒有的功能。 – Allen 2012-07-13 12:04:14
@Allen:'git log --graph --decorate --oneline master..upstream/master'根據你要做的事情,改變兩者的順序。分隔參數或將點數改爲三點可能會有所幫助。 – 2012-07-14 09:47:08