9

在我的笔记本电脑和工作以及家里的台式机上与六个不同的分支和合并工作了几个星期之后,我的历史变得有点复杂。例如,我只是做了一个 fetch,然后将 master 与 origin/master 合并。现在,当我执行 git show-branches 时,输出如下所示:

![登录] 更改了域名。
 ![master] 合并远程分支'origin/master'
  ![migrate-1.9] 在 Heroku 上迁移到 1.9.1
   ![rebase-master] 合并远程分支 'origin/master'
----
 - - [master] 合并远程分支 'origin/master'
 + + [master^2] 一些重新安排和清理。
 - - [master^2^] 合并分支 'rpx-login'
 + + [master^2^^2] 注释掉了一些调试日志。
 + + [master^2^^2^] Monkey-patched Rack::Request#ip
 + + [master^2^^2~2] 将每个请求转储到日志
……

我想用 git rebase 来清理它。为此,我创建了一个新分支 rebase-master,并在此分支上尝试了 git rebase <common-ancestor>。但是,我必须解决许多冲突,分支 rebase-master 上的最终结果不再匹配 master 上的相应版本,该版本已经过测试并且可以工作!

我以为我在某处看到了解决方案,但再也找不到了。有谁知道如何做到这一点?或者当我开始删除我已经合并的不需要的分支时,这些复杂的引用名称会消失吗?

我是这个项目的唯一开发者,所以没有其他人会受到影响。

4

2 回答 2

14

清理复杂历史的最佳方法是保持历史线性。您可以通过避免快进以外的任何类型的合并来做到这一点。

工作流程是这样的。

$ git checkout -b foobranch
<do stuff>
$ git commit
<do stuff>
$ git commit
...

当需要将分支集成到 master 时,不要合并它。取而代之的是,将此分支重新定位到主分支。这将使树枝看起来不再像树枝,而只是在树顶上更多的生长。您在变基期间解决任何合并冲突。

$ git fetch origin
$ git rebase origin/master

现在,将分支合并到 master。这将是一个快进合并。

$ git checkout master
$ git merge foobranch

现在将工作推向上游。

$ git push
于 2010-07-10T18:02:26.297 回答
6

对于可以强制推送分支(将远程历史记录替换为由 rebase 在本地创建的新历史记录)的 repos 的正常过程是:

git rebase --interactive

但同样,这仅在您是唯一从您的存储库中提取的人时才有效,即使这样,您也必须将您的一些本地分支重新初始化为已重写的新远程跟踪分支。

从 rebase 会话中,您可以修剪 Git 提交和 squash 历史记录,以获得您需要的历史记录。

于 2010-06-11T21:35:54.873 回答