如何使用git rebase清理混乱的历史记录

9
在我的笔记本电脑、工作电脑以及家里的台式机上,我与半打不同的分支和合并一起工作了几个星期,我的历史记录变得有点复杂。例如,我刚刚执行了一次fetch,然后将master与origin/master合并。现在,当我执行git show-branches时,输出如下所示:
! [login] Changed domain name. ! [master] Merge remote branch 'origin/master' ! [migrate-1.9] Migrating to 1.9.1 on Heroku ! [rebase-master] Merge remote branch 'origin/master' ---- - - [master] Merge remote branch 'origin/master' + + [master^2] A bit of re-arranging and cleanup. - - [master^2^] Merge branch 'rpx-login' + + [master^2^^2] Commented out some debug logging. + + [master^2^^2^] Monkey-patched Rack::Request#ip + + [master^2^^2~2] dump each request to log ....
我想用git rebase来清理它。为此,我创建了一个名为rebase-master的新分支,并在该分支上尝试了git rebase <common-ancestor>。但是,我必须解决许多冲突,在rebase-master分支上的最终结果不再与已经测试过且可行的master分支相匹配!
我记得曾经在某个地方看到过解决方法,但现在找不到了。有人知道如何做吗?或者当我开始删除已经合并的不需要的分支时,这些复杂的引用名称会消失吗?
我是该项目的唯一开发人员,因此没有其他人会受到影响。

9
哲学笔记:历史变得复杂是事实,接受它吧。 - Tomek Szpakowicz
2个回答

14

清理一个复杂的历史记录的最佳方法是保持历史记录线性。你可以通过避免任何形式的合并(除了快进方式)来实现这一点。

工作流程如下:

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

在将分支集成到主分支时,不要合并它。相反,将此分支与主分支进行变基操作。这将使该分支不再像一个分支,而只是树顶上更多的生长。在变基过程中解决任何合并冲突。

$ git fetch origin
$ git rebase origin/master

现在,将该分支合并到主分支(master)。这将是一次快进式合并。

$ git checkout master
$ git merge foobranch

现在将工作推到上游。

$ git push

6

在可以强制推送分支的存储库中(用本地的重新基于创建的新历史记录替换远程历史记录),正常流程是执行以下操作:

git rebase --interactive

但是,这仅在您是唯一从您的存储库中提取代码的人时才有效,即使如此,您也需要重新初始化一些本地分支以便根据已被重写的新远程跟踪分支进行跟踪。

从rebase会话中,您可以修剪 Git 提交和压缩历史记录,以获取所需类型的历史记录。


请参见https://dev59.com/SXE85IYBdhLWcg3wikS-#2719631。 - VonC
嗯...不需要从远程拉取也是完全有效的。你可以轻松地在本地分支、远程分支、提交中重新基于 -i <commit-ish>(或基本上几乎任何东西)。 - xenoterracide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接