在之前的git合并之后git rebase

INS*_*INS 72 git merge rebase git-rebase

我有以下情况:

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

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

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

Jon*_*mon 106

git merge --squash在经过大量工作和许多合并之后,现在是我首选的变基方式(参见这个答案).如果您正在处理的分支被调用my-branch并且您想要从那里进行rebase,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
Run Code Online (Sandbox Code Playgroud)

  • 如果分支跟踪远程分支,您可以添加“gitbranch--set-upstream-to origin/my-branch”和可选的“gitpush--force”。如果没有这个,新的“my-branch”将不会与遥控器建立链接。强制推送也允许重写远程历史记录,只需将压缩的提交记录在其历史记录中即可。也就是说,我的评论假设除了我自己之外没有人正在跟踪远程分支,以避免破坏历史记录 (2认同)

Kar*_*ldt 79

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

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

  • 我完全不同意“干净”的历史被高估了。它并没有被高估,它可以节省时间并使事情变得不那么混乱。 (5认同)
  • @ytpete,是的确切.我觉得上面只是一种做出合并的迂回方式 - 从开发到掌握."创建一个新分支"只是指向与master相同的位置."把一切都变成一个大承诺"只是在做壁球. (3认同)
  • 尝试查看单个分支上的完整更改集时,合并提交会很吵。当干净的历史使它变得简单时,提取差异并查看它是一种痛苦。 (3认同)
  • @isakgilbert 只有与`--squash`合并时才相同。如果分支上有 _N_ 个提交,则常规合并会将 _N_ 或 _N + 1_ 个提交添加到 master。上面的建议,或 `merge --squash`,将始终只向 master 添加一个提交。 (2认同)

Von*_*onC 10

两个评论:

  • 你可以在新获取的提交之上尽可能多地重新定义你自己的(非推送的)工作.
  • 如果您已激活git rerere,则可以避免合并冲突(在rebase期间),这是针对这种情况所做的.
    http://git-scm.com/images/rerere2.png 查看更多信息git rerere.


dba*_*ton 9

您可以使用分支中的所有更改并将它们放入新的提交中master,如下所示:

git diff master > my_branch.patch
git checkout master
patch -p1 < my_branch.patch
Run Code Online (Sandbox Code Playgroud)

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