在之前的git合并之后git rebase

时间:2011-06-06 05:54:23

标签: git merge rebase git-rebase

我有以下情况:

  • 我从主存储库(X)创建了一个clone(Y),因为有很多人在Y上工作,我们没有rebase但只有merge。当我们想要将(push)Y传递给X时,我们希望做一个rebase以便让事情变得干净整洁

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

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

5 个答案:

答案 0 :(得分:99)

经过大量工作和许多合并(see this answer)后,

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

答案 1 :(得分:79)

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

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

答案 2 :(得分:10)

两个评论:

  • 你可以在新获取的提交之前尽可能多地重新安排自己的(非推送)工作。
  • 如果您有activated git rerere,则可以避免合并冲突(在rebase期间),这是针对这种情况而做的。
    http://git-scm.com/images/rerere2.png 请参阅git rerere
  • 了解详情

答案 3 :(得分:4)

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

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

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

答案 4 :(得分:1)

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

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

git config --global rerere.enabled true

要注意的一件事是,如果您错误地解决了 问题,那么下次它也会自动为您烦恼,您可能并没有真正意识到这一点。

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