我想将我的本地git存储库(最近从svn转换)复制到我的空github帐户。我不想显示每个详细的提交,而是显示与软件的历史版本相对应的更大的聚合更改集。我想在本地保留更详细的提交。所有提交目前都在master上(原来是svn trunk)。
我认为通过在分支上执行所有本地工作并将仅可发布的更改集合并到master,然后我可以将其推送到github,这将变得更容易。但我不确定如何开始这个过程。另外,我是想通过推送或从github中提取来发布更改吗?
答案 0 :(得分:2)
有几种方法我可以想到这样做,但一个简单的方法就是这样:
假设您希望使用master
作为可发布的分支 - 这是一种常见的用法 - 并且您希望将现有提交保留在名为dev
的分支上,您将在其中执行此操作继续发展。让我们假设你是master
分支的负责人。
$ git branch dev
删除master所在的dev分支。现在,您需要以交互方式重新绑定以压缩提交。将所有内容保持在分支上,同时允许自己迭代工作的最简单方法是将refase一直重新设置回第一次提交:
$ git rebase -i <hash of first commit>
这将打开一个编辑器,其中包含提交的“播放列表”,从提交开始你提供的那个(这就是为什么很多人(比如我)喜欢有一个无关紧要的(例如空的)或者只是自述)首次提交 - 见here)。此列表从上到下读取。从第二个条目开始,您可以将pick
更改为squash
或fixup
(或仅s
或f
),这两个条目都会将该提交与之前的提交合并(它上面。前者保留了早期提交的消息,后者保留了后者的消息。
如果你可以处理它,你可以在整个项目的历史中标记你要用这种方式压缩的所有东西,留下'pick'提交作为锚点,并且每个都有任意数量的'fixup'提交到被压扁了。完成后,保存并退出,并观察整个事情崩溃到您想要的聚合提交。如果很难知道哪一个可以一次挤压,那就去做你认识的那些。你总是可以在未来的rebase中压缩更多,甚至可以将提交压缩到同一个提交中。
我可能会调查第一批提交,找出我想要合并的内容 - 例如'前7' - 然后选择reword
交互式rebase中的第一个,在那里键入聚合消息,然后为下一个6选择fixup
。这将停止让我放入一个新的第一个上的(聚合)消息,然后将下一个6压入其中,保留该消息。然后,我会调查下一个之后的那一个,然后压缩并重复直到完成。这有点单调乏味,但很容易。
请注意,这将创建所有新对象,但dev
分支仍将指向旧行,因此您现在将拥有dev中的完整历史记录和master中的压缩历史记录。现在,您可以在dev
上进行开发,并使用主分支中的git rebase --squash dev
将所有新开发工具压缩到主服务器上的单个新提交中。