截取一段 GIT 记录到新仓库
前言
相信你遇到如下场景:
产品:这个功能我们不打算在 产品A
中上了,准备把它独立成一个别的项目
你心想:OK 没问题,我重新建个仓库把代码挪过去就好了
第二天当你好不容易把项目代码移动到新项目中去后突然发现,由于这个功能是由 产品A
中的 git
进行管理的,如果迁移到新项目中所有的提交记录都会丢失!
解决方法
-
首先先复制一份源
.git
文件夹到你的新仓库目录下 -
将复制过去的 git 中的远端移除,防止误操作
-
确定好要截取的
commit
片段。如下: -
将复制过去的切到要截取的开头那个
commit
上。如下:git checkout d6d38f8f
-
创建一个孤儿分支,该分支不会有当前
commit
之前的历史记录了。如下:git checkout --orphan test
git add -A
git commit -am "init test"
-
附加从开始(d6d38f8f)到结束(e912dfb0)的提交记录到此分支中。如下:
git cherry-pick d6d38f8f..e912dfb0
- 如果提示中断则可以使用
git status
查看中断原因。通常分为以下几种:- 需要合并:手动合并(合并时通常全部用最新的即可)好并
git add -A
后不要commit
直接git cherry-pick --continue
即可。注意此时 git 终端会进入 vim 状态,通常直接按shift + :
后输入q!
退出即可。 - 有空记录:cherry-pick 过程会自动合并,此时可能产生空的修改,直接
git cherry-pick --skip
即可。 - 正常合并:此时用
git status
查看不会有任何冲突,直接git cherry-pick --continue
即可。
- 需要合并:手动合并(合并时通常全部用最新的即可)好并
- 如果提示中断则可以使用
- 不断的解决中断直到结束,你就会发现记录已经全部到新分支中了
-
此时你可以强制删除其它所有分支,并删除所有标签,此时你的记录就会干净如初啦!
- 删除所有标签可以用命令:
git tag -l | xargs git tag -d
- 删除所有标签可以用命令:
-
此时虽然分支只剩下一个,但你会发现
.git
目录并没有变小,因为里面还存有以前的记录,我们需要再对其进行修剪。如下:- 清理 reflog:
git reflog expire --expire=now --all
- 清理 git:
git gc --aggressive --prune=now
- 清理 reflog:
源 .git 大小 | 修剪后的 .git 大小 |
---|---|
![]() | ![]() |
- 附加你需要推送的远端,并推送即可。