2012-11-23 87 views
3

我有一個歷史,看起來像這樣如何使我的提交歷史記錄與git rebase一起工作?

H o updated ctools, ds 
G M─┐ merged module file 
F │ o find page 
E o │ work on download restriction 
D o─┘ Report downloading/emailing WIP 
C o migration: find and replace URLs throughout notes 
B o various local things 
A o initial commit 

而且背後,A脫落遠程主的。現在遠程已經開始了,我想使用git rebase來更新我的歷史記錄,使其位於最新的遠程更改之上。

所有這些提交的是關於代碼,遠程主,而是因爲它似乎不知道如何處理d混帳衍合的讓我失望:摹:這是在合併邊支G。 Git rebase嘗試按順序應用它們,但不合並,即A B C D E F H...F將不適用於E。我計劃需要多次重組以保持我的代碼位於最新源代碼的開發之上,所以我想要一個持久的解決方案。

我該如何告訴git衝突的答案是在G?或者我該怎麼做別的東西,讓git rebase能夠回覆提交?我很樂意將壁球D:G分成D'如果這樣做更容易。

回答

2

Git與主合併是您場景中的最佳選擇,因爲rebase不是爲合併提交而設計的(G是您的問題)。但是,如果你真的想和git rebase -p沒有產生預期的結果,您可以:

  1. 底墊AE(然後A'-E')
  2. 分別重新申請F(由cherrypick或其他方式)上d '的頂部,成爲F'
  3. 合併E '和F',成爲G '
  4. cherrypick H於G的頂部'

其他原因合併優先位置:

  1. 那些你正在嘗試重新綁定的提交可能已經屬於遠程的一些功能分支,將它們中的很多重新分配到另一個遠程分支上將導致大量重複提交,這可能會讓其他人感到困惑。

  2. 如果這些提交僅在您的本地分支中,通過重新綁定(但不一定是推送)它們,您有效地「扣留」它們直到它們最終被推入或合併爲止。這可能會對其他人造成干擾,因爲它看起來會在短時間內突然出現大量突發事件;合併應該是工作流程中的常規活動。

這就是說,如果你打算做定期的底墊以任何理由(如用git-svn的工作),最好的辦法是保持一個線性的歷史了,你要變基的提交和/或者將它們限制在少數。對於涉及合併的一系列提交,這些合併需要從前到後摺疊(如迷你底板)。

+0

謝謝你的幫助。正如我所說,我需要定期重複這一點,所以我非常喜歡1-5的聲音作爲一次性修復。你能否給出更多關於如何在(1)中進行部分重新定位的提示?另外,如果我可以做到這一點,那麼對AD進行重新分配並不容易,然後得到一個補丁D:G,將其應用爲E',然後再對其餘部分使用rebase(H繼續前進,在樹的其餘部分分支然後合併的其他例子)。 – artfulrobot

+0

@artfulrobot你可以擠壓一些提交,但這必須由你自己決定,因爲原始提交的意圖並不總是被保留下來。如果H繼續下去,強烈鼓勵合併。 – prusswan

+0

上下文位置:原點是Drupal。我的大部分代碼都在一個新模塊中;特定於我的使用;那永遠不會是原點的一部分。有幾次我修補了核心drupal。當Drupal提出安全更新時,我希望我的代碼應用於此。我希望檢查我的任何核心修補程序,因爲它們可能不再是必需的/正確的。我與我的各種drupal項目共享這些補丁,這就是爲什麼rebase很好。合併會使這個過程更加混亂,我會失去我的補丁。 – artfulrobot

相關問題