Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使我的提交历史与git rebase一起工作?_Git_Git Rebase - Fatal编程技术网

如何使我的提交历史与git rebase一起工作?

如何使我的提交历史与git rebase一起工作?,git,git-rebase,Git,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 再

我有一段类似这样的经历

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
再后面,一个远程主机发出了一个声音。现在遥控器已经移动了,我想使用git rebase更新我的历史记录,以了解最新的遥控器更改

所有这些提交都是在不在远程主机中的代码上进行的,但是git rebase将使我失败,因为它似乎不知道如何处理D:G:在G合并的分支。Git rebase尝试在没有合并的情况下按顺序应用它们,即
A B C D e F H..
F将不会应用于e。我计划需要多次重定基址,以使我的代码保持在最新版本的开发之上,所以我想要一个持久的解决方案


我如何告诉git冲突的答案是在G找到的?或者我如何做其他事情,使git rebase能够回复提交?我很乐意将d:G压缩成d',如果这能让事情变得更简单的话。

Git与master合并是您场景中的最佳选择,因为rebase不是为合并提交而设计的(这里的问题是G)。但是,如果您确实想这样做,并且
git-rebase-p
没有产生所需的结果,您可以:

  • 重新设置A-E(即A'-E')
  • 在D'顶部单独重新涂抹F(通过cherrypick或其他方式),使其成为F'
  • 将E'和F'合并为G'
  • 樱桃在G'上面摘H'
  • 此处首选合并的其他原因:

  • 您正在尝试重定基础的那些提交可能已经属于远程上的某个功能分支,将它们中的许多重定基础到另一个远程分支只会导致大量重复提交,这可能会让其他人感到困惑

  • 如果这些提交仅在您的本地分支中,那么通过重定(但不一定推送)它们,您实际上是在“扣留”它们,直到它们最终被推送或合并。这可能会对其他人造成破坏,因为它看起来像是在短时间内突然出现了大量的犯罪行为;合并应该是工作流中的常规活动


  • 这就是说,如果出于任何原因(例如与git svn合作)计划定期重新设置基础,最好的方法是为您希望重新设置基础的提交维护线性历史记录和/或将其限制在一个较小的数量。对于涉及合并的一系列提交,这些合并需要从前到后折叠(如小回扣)。

    感谢您的帮助。正如我所说,我需要定期重复这一点,所以我真的很喜欢你的1-5作为一次性修复的声音。你能在(1)中给出更多关于如何进行部分重定基址的建议吗?另外,如果我能做到这一点,那么重新设置A-D的基址,然后获得一个补丁D:G,将其作为E'应用,然后在其余部分再次使用重新基址,不是更容易吗(H继续下去,还有其他例子,这种分支然后合并到树的其余部分)。@artfulrobot您可以挤压一些提交,但这必须由您自行决定,因为原始提交的意图并不总是得到保留。如果H继续下去,则强烈鼓励合并。上下文:源代码是Drupal。我的大部分代码都在一个新模块中;特定于我的使用;这永远不会是起源的一部分。有几次我修补了核心drupal。当Drupal发布一个安全更新时,我希望我的代码能够应用在上面。我想回顾一下我的任何核心补丁,因为它们可能不再必要/正确。我将这些补丁与我的各种drupal项目共享,这就是为什么rebase很好的原因。合并会使这个过程更加混乱,我会丢失我的补丁。@artfulrobot在这种情况下,我建议将核心补丁保留在单独的分支中,并以一种更容易重基的方式维护它们。