如何使用git rebase来清理复杂的历史记录

Law*_*den 8 git merge rebase

在我的笔记本电脑和工作以及家里的桌面上工作了几个星期与六个不同的分支和合并之后,我的历史变得有点复杂.例如,我只是进行了一次获取,然后将origin与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上的相应版本,该版本已经过测试并且可以工作!

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

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

Way*_*rad 13

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

工作流程是这样的.

$ git checkout -b foobranch
<do stuff>
$ git commit
<do stuff>
$ git commit
...
Run Code Online (Sandbox Code Playgroud)

什么时候将分支集成到master中,不要合并它.相反,将这个分支重新对抗主人.这将使分支不再看起来像一个分支,但只是在树顶上更多的增长.您可以在rebase期间解决任何合并冲突.

$ git fetch origin
$ git rebase origin/master
Run Code Online (Sandbox Code Playgroud)

现在,将分支合并为master.这将是一个快速合并.

$ git checkout master
$ git merge foobranch
Run Code Online (Sandbox Code Playgroud)

现在推动上游工作.

$ git push
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 6

正常的过程,对于你可以强制推送分支的repos(用一个由rebase本地创建的新的远程历史记录代替),就是这样做:

git rebase --interactive
Run Code Online (Sandbox Code Playgroud)

但同样,只有你是唯一一个从你的回购中撤出的人才有效,即便如此,你也必须将一些本地分支机构重新初始化为已经重写的新远程跟踪分支机构.

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