2012-11-23 47 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

相关问题