截取 GIT 提交

截取一段 GIT 记录到新仓库

前言

相信你遇到如下场景:
产品:这个功能我们不打算在 产品A 中上了,准备把它独立成一个别的项目
你心想:OK 没问题,我重新建个仓库把代码挪过去就好了

第二天当你好不容易把项目代码移动到新项目中去后突然发现,由于这个功能是由 产品A 中的 git 进行管理的,如果迁移到新项目中所有的提交记录都会丢失!

解决方法
  1. 首先先复制一份源 .git 文件夹到你的新仓库目录下

  2. 将复制过去的 git 中的远端移除,防止误操作

  3. 确定好要截取的 commit 片段。如下:

    在这里插入图片描述

  4. 将复制过去的切到要截取的开头那个 commit 上。如下:

    git checkout d6d38f8f

    在这里插入图片描述

  5. 创建一个孤儿分支,该分支不会有当前 commit 之前的历史记录了。如下:

    1. git checkout --orphan test
    2. git add -A
    3. git commit -am "init test"

    在这里插入图片描述

  6. 附加从开始(d6d38f8f)到结束(e912dfb0)的提交记录到此分支中。如下:

    1. git cherry-pick d6d38f8f..e912dfb0
      • 如果提示中断则可以使用 git status 查看中断原因。通常分为以下几种:
        1. 需要合并:手动合并(合并时通常全部用最新的即可)好并 git add -A 后不要 commit 直接 git cherry-pick --continue 即可。注意此时 git 终端会进入 vim 状态,通常直接按 shift + : 后输入 q! 退出即可。
        2. 有空记录:cherry-pick 过程会自动合并,此时可能产生空的修改,直接 git cherry-pick --skip 即可。
        3. 正常合并:此时用 git status 查看不会有任何冲突,直接 git cherry-pick --continue 即可。
    2. 不断的解决中断直到结束,你就会发现记录已经全部到新分支中了

    在这里插入图片描述

  7. 此时你可以强制删除其它所有分支,并删除所有标签,此时你的记录就会干净如初啦!

    • 删除所有标签可以用命令:git tag -l | xargs git tag -d

    在这里插入图片描述

  8. 此时虽然分支只剩下一个,但你会发现 .git 目录并没有变小,因为里面还存有以前的记录,我们需要再对其进行修剪。如下:

    1. 清理 reflog:git reflog expire --expire=now --all
    2. 清理 git:git gc --aggressive --prune=now

在这里插入图片描述

.git 大小修剪后的 .git 大小
在这里插入图片描述在这里插入图片描述
  1. 附加你需要推送的远端,并推送即可。
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y-S-J

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值