之前的git合并后git rebase


79

我有以下情况:

  • clone从主存储库(X)创建了(Y),因为有很多人在Y上工作,我们rebase只做merges就不做任何事情。当我们想将pushY交付给X时,我们想做一个arebase以便使事情变得干净整洁

问题在于,这样做时,rebase我们被要求执行之前merge步骤中已经完成的所有合并。除了实际上意味着重新进行合并的解决方案之外,还有其他解决方案吗?

我希望它非常简单,因为我们已经解决了冲突的合并。


在:“因为有很多人在做Y,我们没有做任何基础,而只是合并”,您的意思是与上游合并是吗?
西罗Santilli郝海东冠状病六四事件法轮功2014年

Answers:


82

重新获得“干净的”历史记录被高估了。如果要保留历史记录,最好的方法是进行合并而不是重新设置基准。这样,如果您需要返回到修订版本,则该版本与您在开发过程中测试的版本完全相同。这也解决了有关先前解决的合并冲突的问题。

如果您不关心保存历史记录,则可以从master分支创建一个新分支,将其检出,然后执行agit read-tree -u -m dev更新您的工作树以匹配该dev分支。然后,您可以将所有内容提交到一个大提交中,然后像往常一样将其合并到master中。


1
您在这里有效完成的工作是合并。新分支是不必要的。
isak gilbert 2014年

1
@isakgilbert如果与合并,则只有相同--squash。如果分支上有N个提交,则常规合并会将N个N + 1个提交添加到master 。上面的建议或将始终仅向master添加一次提交。merge --squash
peterflynn 2015年

3
@ytpete,是的。我觉得以上只是从开发到熟练掌握合并的一种a回方式。“创建一个新分支”仅与master指向同一位置。“将所有内容都提交给一个大提交”只是在做壁球。
isak gilbert 2015年

2
尝试在单个分支上查看完整的更改集时,合并提交很嘈杂。当历史记录很简单时,提取差异并查看差异就很痛苦。
阿贾克斯

2
我完全不同意“干净”的历史被高估了。它没有被高估,它可以节省时间并减少混乱。
basickarl

121

git merge --squash现在是我在大量工作和许多合并之后重新部署的首选方式(请参阅此答案)。如果您正在使用的分支已被调用,my-branch并且您想从该分支开始变基,master则只需执行以下操作:

git checkout my-branch
git branch -m my-branch-old
git checkout master
git checkout -b my-branch
git merge --squash my-branch-old
git commit

12

两句话:

  • 您可以根据需要在新获取的提交之上重新建立自己(尚未推送)的工作。
  • 如果已激活git rerere,则可以避免合并冲突(在变基期间),这是针对这种情况而完成的。
    http://git-scm.com/images/rerere2.png 查看更多git rerere

@lulian:在这种情况下,如果您必须重新设定工作基础,我认为您将不得不再次执行合并冲突解决方案。
VonC

@krlmlr谢谢。我已经恢复了链接,并添加了插图和对该命令的手册页的引用。
VonC

7

您可以在分支中进行所有更改,并使用以下命令将其放入新的提交中master

git diff master > my_branch.patch
git checkout master
patch -p1 < my_branch.patch

然后暂存文件并提交。


1

关于合并冲突的重播,您可以使用git rerere维护一个数据库,该数据库已解决合并冲突的方式,因此执行导致相同冲突的rebase将自动为您完成繁琐的工作。

https://hackernoon.com/fix-conflicts-only-once-with-git-rerere-7d116b2cec67

git config --global rerere.enabled true

需要注意的一件事是,如果您解决不正确的问题,下一次它也会自动为您困扰,您可能并没有真正意识到这一点。

此处提供更多正式文档:https//git-scm.com/docs/git-rerere

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.