87

我有以下情况:

  • clone从主存储库(X)创建了一个(Y),因为有很多人在 Y 上工作,我们没有做任何事情rebase,只做merges。当我们想要将(push) Y 传递到 X 时,我们想做 arebase以使事情变得干净整洁

问题是,当我们这样做时,rebase我们被要求做我们在前面的merge步骤中已经做过的所有合并。除了意味着实际重新进行合并的解决方案之外,是否有解决方案?

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

4

5 回答 5

141

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
于 2013-06-17T06:25:29.317 回答
86

重新定位以获得“干净”的历史记录被高估了。如果您想保留历史记录,最好的方法就是进行合并而不是变基。这样,如果您需要返回修订版,它与您在开发期间测试的版本完全相同。这也解决了您关于先前解决的合并冲突的问题。

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

于 2011-06-06T22:16:33.177 回答
14

两个备注:

  • 在新获取的提交之上,您可以根据需要多次重新调整您自己的(尚未推送的)工作。
  • 如果您已激活git rerere,则可以避免合并冲突(在变基期间),这是针对这种情况所做的。
    http://git-scm.com/images/rerere2.png 查看更多信息git rerere
于 2011-06-06T07:24:04.803 回答
9

您可以将分支中的所有更改放入新的提交中master,其中包含以下内容:

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

然后暂存您的文件并提交。

于 2017-04-28T18:56:07.680 回答
3

关于合并冲突的重放,您可以使用 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

于 2019-03-05T23:51:09.387 回答