在之前的git合并之后git rebase

问题描述 投票:69回答:5

我有以下情况:

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

问题是,在做rebase时,我们被要求进行我们在之前的merge步骤中已经完成的所有合并。有没有解决方案,除了意味着重新进行合并的那个?

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

git merge rebase git-rebase
5个回答
79
投票

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

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


102
投票

在经过大量工作和许多合并(git merge --squash)之后,see this answer现在是我首选的变基方式。如果您正在处理的分支称为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

10
投票

两个评论:

  • 你可以在新获取的提交之上尽可能多地重新定义你自己的(非推送的)工作。
  • 如果你有activated git rerere,你可以避免合并冲突(在rebase期间),这是针对这种情况做的。 在git rerere查看更多信息。

4
投票

您可以在分支中进行所有更改,并使用以下内容将它们放入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

© www.soinside.com 2019 - 2024. All rights reserved.