2011-10-12 31 views
0

我有幾個分支,對應着被遺棄或後來推遲的開發,其中一些是純垃圾。我用如何剝離分支上的常見提交?

git log master..mybranch 

找出什麼是mybranch一回事,但名單通常不必要的長,因爲它們包含還承諾包含在主,只是以不同的順序。這來自master已經重新設計。

當我嘗試在主控制器上重新設置mybranch時,由於此重新排序而導致衝突。這種衝突不值得解決,因爲這需要時間並導致從master已知的結果。

所以我需要的是一種在mybranch中擺脫這種提交的方法,這樣只有重要的提交仍然存在,並且分支可以更容易地重新分配。

+1

因此,我認爲你不能通過'mybranch'中的'git rebase -i master'獲得你想要的,而不是選擇「common」提交? – Romain

+0

我的主要問題是*識別*「常見」提交。理想情況下,這應該主要是自動發生的,這樣可以減少丟失有用東西的風險。 – maaartinus

回答

4

我認爲你要找的是git cherry。這會從提交體生成sha1值,而不是使用git commit id來比較提交。這使得它獨立於提交順序。您可以使用它來查找可能值得從一個分支添加到另一個分支的提交。

來自msysGit開發樹的一個例​​子可能會有所幫助。我們有一箇舊的分支'work/symlink',它可能已經被合併到'devel'分支。所以:

[email protected] /git (devel) 
$ git cherry devel origin/work/symlink 
+ 7fe3fde1d9b93472faeedb75bfd930825a5abe06 
- aebecb0d31e4a546cf4d21d32e82cc852b6057bb 
+ 1b467d086fd6601cd2feb34d59baf1e804f70acb 
+ 3e735a0bfda6b91ae7cbb20c2c89818405c5bea9 
+ d4db723c482ba4d2fd7539060834d231c35cdf53 

此說,有5次提交的利益(我們也可以從日誌輸出工作了):

$ git log --oneline devel..origin/work/symlink 
d4db723 Place __stdcall between return value and function name 
3e735a0 mingw.c: Use the O_BINARY flag to open files 
1b467d0 Test for WIN32 instead of __MINGW32_ 
aebecb0 Define SNPRINTF_SIZE_CORR=1 for Microsoft Visual C++ 
7fe3fde Support UTF8<=>Unicode filename mapping 

這就是出現在「工作/符號鏈接」的提交,而不是'devel的'。 git cherry的輸出表明aebecb0提交已經應用於'devel'(來自前導減號),但其他的可能值得研究。我們可以檢查這個承諾只出現在工作的分支:

$ git branch --all --contains aebecb0 
    remotes/origin/work/symlink 

,但我們也可以發現提交ID它得到了通過搜索使用git log --crep提交信息看,這其中合併到devel的分支真的被選入開發。

+0

這就是我一直在尋找的東西。實際上,我需要一個更智能的命令,能夠在'mybranch'中找到與'master'中的提交序列相同或相似的提交序列(因爲不僅有重新排序,還有提交分割和連接),但是' git cherry'完成了大部分工作。 – maaartinus

1

如果我理解的很好,mybranch合併或櫻桃選擇master分支時它是活躍的。 Git合併算法非常聰明,如果mybranch的其他提交與master自己的開發中發生的變化無關,則合併將是無衝突的。

如果你有衝突,它只意味着你有兩個分支之間的重疊變化,這與mybranch包含一些master的變化無關。

結論:衝突不是由於您正在討論的重新排序;用手呼吸並解決衝突。

+0

你的結論對於至少一些衝突是錯誤的。但我用一個簡單的分支嘗試了「rebase」,它既不像你寫的那麼容易,也沒有我想象的那麼糟糕。許多衝突來自'master'中的提交已被拆分或加入(我沒有提到我的問題),解決方案很簡單:'git rebase skip'。解決有趣提交的衝突也很容易。 – maaartinus

1

建議這一條評論,但更多的我看了你的帖子,我越覺得你沒有嘗試:

當在mybranch分支,使用git rebase -i master將執行交互式衍合,which'll有效地允許您從rebase中排除「冗餘」提交。這可能需要手動比較提交以瞭解哪些選擇以及哪些要放棄,但它可以起作用。

+0

請注意,如果嘗試合併maaartinus中存在衝突,則不會移除它們。 – CharlesB

+0

@CharlesB取決於。如果他刪除了「已經以另一種順序提交」的提交併將所有其他提交放在'master'頭部的'mybranch'中,他可以通過合併一個不再衝突的樹來避免衝突......儘管它是不一定可行。 – Romain

+0

mmmh不確定,但讓我們等待OP反饋:) – CharlesB

相關問題