【工欲善其事】利用 DeepSeek 实现复杂 Git 操作:从原项目剥离出子版本树并同步到新的代码库中

文章目录

  • 利用 DeepSeek 实现复杂 Git 操作
    • 1 背景介绍
    • 2 需求描述
    • 3 思路分析
    • 4 实现过程
      • 4.1 第一次需求确认
      • 4.2 第二次需求确认
      • 4.3 第三次需求确认
      • 4.4 V3 模型:中间结果的处理
      • 4.5 方案验证,首战告捷
    • 5 总结复盘

利用 DeepSeek 实现复杂 Git 操作


1 背景介绍

今天综合利用 DeepSeek V3R1 推理模型,成功解决了一个复杂的 Git 操作,谨以此文记录 DeepSeek 使用心得,以备后续复盘。这本是我一次操作上的疏漏,未能将 Fork 到本地的代码与原项目彻底脱钩,直到很晚才发现问题,已经很难快速用简单的 Git 命令恢复原样了。于是,我想到了 DeepSeek。

2 需求描述

现有一个从 GitHub 复刻(fork)到我本地的开源项目。从复刻到本地那天起,我又陆续在 main 分支提交了很多次(没有其他分支)。现在需要将我本人提交的所有节点从该副本完整迁移到另一个新仓库,并要求保留所有节点的历史提交记录(提交时间、注释信息等)。

图 0:迁移 Git 子版本树的需求描述示意图

【图 0:迁移 Git 子版本树的需求描述示意图】

3 思路分析

该需求涉及从原 Git 库彻底剥离需要的子版本树。Git 还没有能一步实现节点树 “脱钩” 的操作命令。但大方向是明确的,无非以下四步 ——

  1. 先找到脱钩位置(简单);
  2. 从脱钩点产生一个新的 Git 根节点(未知);
  3. 设法将脱钩点后续产生的提交版本依次追加到新的根节点上(未知);
  4. 最后删除原有版本树,重置远程推送分支 origin(简单);

以上四步逻辑关系清晰,正好可以用 DeepSeek 一试身手。

4 实现过程

4.1 第一次需求确认

因为涉及多次复杂 Git 操作,先用 V3 网页版直接提问(刻意未加任何提示词技巧):

我有一个本地 Git 代码仓库,是从 GitHub 一个开源项目上 fork 到本地的,但这样产生的提交不计入 GitHub 网站的个人贡献,因此我在提交了很多本地新增的版本后决定将其剥离出来。但我不知道应该怎么操作。帮帮我

以下是整理后的 DeepSeek V3 的回复,可以看到 V3 模型第一次理解有偏差:

要将本地 Git 仓库从 GitHubfork 中剥离出来,使其成为一个独立的仓库,并保留所有提交历史,可以按照以下步骤操作:

# 1. 备份当前仓库
# 2. 移除与上游仓库的关联:
cd /path/to/your/repo
git remote remove origin
# 3. 创建新的 GitHub 仓库(不要初始化 README 或 .gitignore)
# 4. 将本地仓库关联到新仓库:
git remote add origin https://github.com/yourusername/new-repo-name.git
# 5. 推送代码到新仓库:
git push -u origin --all
git push -u origin --tags
# 6. 确保本地分支跟踪新的远程分支:
git branch --set-upstream-to=origin/main main

要是按上述回复进行操作,其实只是把远程分支更新到了新仓库,完全没有实现想要的“脱钩”效果。

4.2 第二次需求确认

继续追问:

如果只想保留部分提交历史,比如只有我自己的提交历史,又该如何?

这次它听懂了,但给出的方案是借助第三方工具(由于不是理想回复,具体内容已精简):

# 1. 安装 `git filter-repo`
pip install git-filter-repo
# 2. 为避免直接操作原始仓库,建议先备份
git clone /path/to/your/repo new-repo
cd new-repo
# 3. 通过以下命令保留只有你提交的历史:
git filter-repo --commit-callback '
if b"your-username" not in commit.committer_email:commit.skip()
'
# 4. 清理远程信息
git remote remove origin
# 5. 创建新的 GitHub 仓库 new-repo-name
# 6. 关联新仓库并推送
git remote add origin https://github.com/your-username/new-repo-name.git
git push -u origin --all
git push -u origin --tags
# 7. 效果验证(略)

由于需要安装第三方依赖,解决方案的可移植性较差。因此还需继续追问。

4.3 第三次需求确认

由于我想要的是 Git 原生命令,因此再次追问:

我不想安装第三方工具,Git 没有原生方法实现吗?

这次它终于听懂了,想到了孤立分支(--orphan)和 cherry-pick 节点提取命令 ——

如果你不想安装第三方工具(如 git filter-repo),Git 本身也提供了原生方法来实现部分提交历史的保留,但操作会稍微复杂一些。以下是使用 Git 原生命令实现的方法:

# 1. 克隆你的本地仓库
git clone /path/to/your/repo new-repo
cd new-repo
# 2. 创建一个新的分支
git checkout --orphan new-branch
# 3. 筛选并重新提交你的更改
# 从提交历史筛选想要的提交哈希值:
git log --author="your-username" --oneline
# 逐个挑选提交
git cherry-pick <commit-hash>
# 如果需要挑选多个提交,可以将哈希值列出来:
git cherry-pick <commit-hash-1> <commit-hash-2> <commit-hash-3>
# 4. 清理旧分支
git branch -D main  # 删除旧的主分支
git branch -m new-branch main  # 将新分支重命名为主分支
# 5. 清理旧的远程分支
git remote remove origin
# 6. 创建新的 GitHub 仓库
# 7. 关联新仓库并推送
git remote add origin https://github.com/your-username/new-repo-name.git
git push -u origin main
# 8. 验证

这里 DeepSeek 还漏掉了一个关键细节:cherry-pick 在遇到多个 commit 版本时需要严格遵守先后顺序。在我进一步的提示下,它才补全了这部分内容,并且给出了发生冲突时的解决方案,但比较官方:

如果在挑选提交时发生冲突:

  1. Git 会暂停挑选过程,并标记冲突文件。

  2. 手动解决冲突后,使用以下命令继续:

    git add <resolved-files>
    git cherry-pick --continue
    
  3. 如果你想跳过当前提交(例如冲突无法解决),可以使用:

    git cherry-pick --skip
    
  4. 如果你想取消整个挑选过程,可以使用:

git cherry-pick --abort

4.4 V3 模型:中间结果的处理

由于 git log 命令得到的 commit 顺序是从新到旧,与 cherry-pick 相反,因此可以让 DeepSeek 帮我获取正确排序的哈希列表。这类简单任务 V3 完成得很好:

# 1. 逆序输出提交历史
git log --reverse
# 2. 筛选指定日期之后的提交
git log --since="2024-09-13 00:00:00"
# 3. 只保留哈希值
git log --pretty=format:"%H"
# 4. 组合命令
git log --since="2024-09-13 00:00:00" --reverse --pretty=format:"%H"
# 5. 解释参数
# --since="2024-09-13 00:00:00":筛选出指定日期之后的提交。
# --reverse:将提交历史从最旧到最新排列。
# --pretty=format:"%H":只输出提交的哈希值。

为了节省时间,我将最后的 PowerShell 命令作了进一步格式化处理,只保留 SHA1 哈希值的前八位,并用空格进行分隔:

(git log --since="2024-09-13 00:00:00" --reverse --pretty=format:"%H" | % { $_.Substring(0, 8) }) -join " "

4.5 方案验证,首战告捷

然后按照最后一次需求确认的结果,尝试用 --orphan + cherry-pick 来实现:

# 备份到新文件夹,再行处理
> git clone F:\Courses\Postman2\ newRepo
Cloning into 'newRepo'...
done.
> cd newRepo
# 获取待迁移节点列表(从早到晚排序)
> $tmp = (git log --since="2024-09-13 00:00:00" --reverse --pretty=format:"%H" | % { $_.Substring(0, 8) }) -join " "
# 从 main 分支切到孤立分支 master
> git checkout --orphan master
# 移除暂存区(stage)内的所有提交内容
> git rm --cached *

最后这步是为了清空当前工作区内的无关变更,以便执行 git cherry-pick 命令:

图 1:切到孤立分支 master 后,移除暂存区(stage)内的所有提交内容

【图 1:切到孤立分支 master 后,移除暂存区(stage)内的所有提交内容】

之后就可以删除工作区内的冗余内容了(除了 .git 文件夹保留,其余均可删除):

# 查看当前待删文件(夹)
> git status -s
?? LICENSE
?? README.md
?? code/
?? notes/
> rm -Recurse -Force LICENSE,code,notes,README.md

图 2:清空工作区内的所有无关内容

【图 2:清空工作区内的所有无关内容】

然后就可以放心执行 git cherry-pick 了:

# 批量执行节点迁移
> $tmp
3b2de1fe e8f40cf3 1b02df31 00988a80 b0718962 a29d52c5 71ccc45b 1b0c9af2 24f0bdf5 d77cf64b c6be7f0b a0284fa4 bd0b88f3 3c548a07 e713024c 3b792f58 e29381e8 8cff3c5b 2ae4c28d 11887a88 254d26c7 125356db e6fead8b 2413c3b7 bfdf3bee
> git cherry-pick 3b2de1fe e8f40cf3 1b02df31 00988a80 b0718962 a29d52c5 71ccc45b 1b0c9af2 24f0bdf5 d77cf64b c6be7f0b a0284fa4 bd0b88f3 3c548a07 e713024c 3b792f58 e29381e8 8cff3c5b 2ae4c28d 11887a88 254d26c7 125356db e6fead8b 2413c3b7 bfdf3bee
# ...
error: could not apply 3b2de1f... Init my own repo. Added translation folder
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".
hint: You can instead skip this commit with "git cherry-pick --skip".
hint: To abort and get back to the state before "git cherry-pick",
hint: run "git cherry-pick --abort".
hint: Disable this message with "git config advice.mergeConflict false"
> 

但是按默认的合并方式,会得到很多冲突报错,中断命令:

图 3:批量执行 cherry-pick 后出现一堆冲突文件

【图 3:批量执行 cherry-pick 后出现一堆冲突文件】

此时只需要用 git add * 命令直接将其标记为已解决,就能继续了:

图 4:手动处理冲突内容,并继续 git cherry-pick 操作

【图 4:手动处理冲突内容,并继续 git cherry-pick 操作】

接着,Git 会自动弹出本轮操作的提交注释页,询问是否需要修改注释内容。这里无需修改,直接关闭即可:

图:5:批量操作后的提交界面(无需修改,直接关闭即可)

【图:5:批量操作后的提交界面(无需修改,直接关闭即可)】

最后,再用 gitk --all 命令查看版本树,新的子版本树就诞生了:

图 6:利用 gitk --all 查看当前所有版本树,新的子树(上方)已经生成完毕,且历史提交日期不变

【图 6:利用 gitk --all 查看当前所有版本树,新的子树(上方)已经生成完毕,且历史提交日期不变】

处理完最复杂的两步后,剩下的都是些简单的收尾工作:

# 删除本地旧分支 main
> git branch -D main
Deleted branch main (was bfdf3be).
# 删除远程跟踪分支 origin
> git remote remove origin
# 分支 master 重命名为 main
> git branch -m master main
# 新建目标仓库,重置远程跟踪分支
> git remote add origin git@github.com:SafeWinter/learn-postman2.git
# 推送到远程仓库
> git push -u origin main

这样就实现了 Git 子版本树的完整迁移:

final repo snapshot

5 总结复盘

上述操作过程看似一气呵成,其实中途有很多次微调没有记录,这里略作复盘:

  1. DeepSeek 延续了 “遇强则强” 的大模型风格,要想得到满意的答复,提问者除了精准描述问题外,还需要对相关领域有扎实的基础;否则 DeepSeek 只会跟着你的思路,无法立即看出问题的根源所在;
  2. 一旦需求明确后,DeepSeek 往往能很快提供准确回复,且该方案准确率极高(--orphan + cherry-pick 组合);这种感觉就像是在和付费版 ChatGPT 4x 对话,但又是完全免费使用,非常震撼;
  3. 务必重视 R1 模型的推理过程,这是后续大幅提高准确率的关键。R1 模型会将当前会话的历史记录全部导入推理过程,十分智能;
  4. 建议大家还是多用网页或手机版 DeepSeek,能在本地部署的都是完整模型的蒸馏版,虽然无需联网交流,但表现是大打折扣的;与其跟风“大炼钢铁”,不如多用 DeepSeek 解决一些实际问题;
  5. 本文介绍的版本树剥离方案还存在一个问题:各历史节点的提交时间和作者修改不一致——前者为当前操作时间,后者为历史记录时间 1。要让提交时间也回归到历史节点,只能从历史节点中提取提交时间,然后逐一提交。但这样的单独处理,只要存在对原内容的修改,当次 cherry-pick 操作就会中断,且必须手动处理内容冲突,DeepSeek 暂时无法给出包含手动处理版本冲突的自动化脚本,只能给出没有中断的情况下每次迁移的自动化脚本(如下所示)。要实现彻底自动化,还需要提问者自身对 bash 脚本或 PowerShell 脚本有相当程度的透彻理解。
# runcommit.ps1
param([Parameter(Mandatory=$true, Position=0)][string]$CommitHash
)# 获取作者日期和提交日期
$AUTHOR_DATE = git show -s --format=%aI $CommitHash
$COMMITTER_DATE = git show -s --format=%cI $CommitHash# 设置环境变量
$env:GIT_AUTHOR_DATE = $AUTHOR_DATE.Trim()
$env:GIT_COMMITTER_DATE = $COMMITTER_DATE.Trim()# 执行 cherry-pick
git cherry-pick --keep-redundant-commits --allow-empty $CommitHash
# 运行方法:.\runcommit.ps1 commit_SHA_value (Enter)

  1. 该问题在浏览器查看历史提交记录时才会出现,GitHub 目前只能按实际提交时间排序,而 Gitee 则可以选择排序方式。相比之下,国产的 Git 托管平台在展示历史提交方面更有优势。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12551.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BGP路径属性

公认必遵循 BGP必须都能识别&#xff0c;且必须发送报文必须包含 Origin&#xff1a;起源属性&#xff0c;I,E,&#xff1f;三种&#xff0c;I是BGP通过IGP协议学到的路由&#xff08;比如ospf&#xff0c;isis&#xff0c;rip&#xff09;&#xff0c;E是从EGP协议学到的&am…

Vue 图片引用方式详解:静态资源与动态路径访问

目录 前言1. 引用 public/ 目录2. assets/ 目录3. 远程服务器4. Vue Router 动态访问5. 总结6. 扩展&#xff08;图片不显示&#xff09; 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 在 Vue 开发中&#x…

【网络编程】Java高并发IO模型深度指南:BIO、NIO、AIO核心解析与实战选型

​​ 目录 一、引言1.1 本文目标与适用场景1.2 什么是IO模型&#xff1f;阻塞 IO 模型非阻塞 IO 模型IO 多路复用模型信号驱动 IO 模型异步 IO 模型 二、基础概念解析2.1 IO模型的分类与核心思想IO模型的分类核心思想分类对比与选择依据技术示意图 2.2 同步 vs 异步 | 阻塞 vs…

基序和纯度分数的计算

以下对这两个概念的详细解释&#xff1a; 基序 纯度分数 PWM矩阵的来源 为什么会有PWM矩阵&#xff1f; 一个特定的转录因子&#xff08;TF&#xff09;的结合位点的基序&#xff08;motif&#xff09;并不是唯一的。实际上&#xff0c;TF结合位点通常具有一定的序列变异性&a…

算法日记11:SC63(离散化)

一、题目 二、题解 法一&#xff1a;前缀和&#xff08;会炸&#xff09; 对于这道题目&#xff0c;我们的第一个朴素想法就是用前缀和来进行简化操作&#xff0c;这个思路非常简单&#xff0c;就是前缀和的标准模板题&#xff0c;代码如下 void solve() {int n,q;cin>&g…

w185客户关系管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

[STM32 标准库]EXTI应用场景 功能框图 寄存器

一、EXTI 外部中断在嵌入式系统中有广泛的应用场景&#xff0c;如按钮开关控制&#xff0c;传感器触发&#xff0c;通信接口中断等。其原理都差不多&#xff0c;STM32会对外部中断引脚的边沿进行检测&#xff0c;若检测到相应的边沿会触发中断&#xff0c;在中断中做出相应的处…

Windows下怎么安装FFFmpeg呢?

在Windows下使用Open-webui报错&#xff0c;说Couldnt find ffmpeg or avconv,解决open-webui报错Couldn‘t find ffmpeg or avconv-CSDN博客于是尝试解决问题&#xff0c;那么Windows下怎么安装FFFmpeg呢&#xff1f; 尝试了两种方法。 第一种方法pip安装&#xff08;失败&…

Hive on Spark优化

文章目录 第1章集群环境概述1.1 集群配置概述1.2 集群规划概述 第2章 Yarn配置2.1 Yarn配置说明2.2 Yarn配置实操 第3章 Spark配置3.1 Executor配置说明3.1.1 Executor CPU核数配置3.1.2 Executor内存配置3.1.3 Executor个数配置 3.2 Driver配置说明3.3 Spark配置实操 第4章 Hi…

【OMCI实践】ONT上线过程的omci消息(三)

引言 在上一篇文章【OMCI实践】ONT上线过程的omci消息&#xff08;二&#xff09;-CSDN博客中&#xff0c;主要介绍了ONT上线过程的OMCI交互的第一个阶段和第二个阶段omci消息&#xff0c;本篇介绍第二个阶段剩余的OMCI消息涉及到的受管实体&#xff08;ME&#xff09;的属性。…

保姆级教程Docker部署Zookeeper官方镜像

目录 1、安装Docker及可视化工具 2、创建挂载目录 3、运行Zookeeper容器 4、Compose运行Zookeeper容器 5、查看Zookeeper运行状态 6、验证Zookeeper是否正常运行 1、安装Docker及可视化工具 Docker及可视化工具的安装可参考&#xff1a;Ubuntu上安装 Docker及可视化管理…

【数据结构】栈与队列

栈 栈的概念及结构 栈:一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈&…

安全实验作业

一 拓扑图 二 要求 1、R4为ISP&#xff0c;其上只能配置IP地址&#xff1b;R4与其他所有直连设备间均使用共有IP 2、R3-R5-R6-R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b; 4、所有设备均可访问R4的环回&#x…

e2studio开发RA4M2(6)----GPIO外部中断(IRQ)配置

e2studio开发RA4M2.6--GPIO外部中断&#xff08;IRQ&#xff09;配置 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置SWD调试口设置GPIO口配置按键中断配置中断回调函数主程序 概述 GPIO&#xff08;通用输入/输出&a…

排序算法--快速排序

快速排序是高效的排序算法&#xff0c;平均时间复杂度为 O(nlog⁡n)&#xff0c;适合大规模数据排序。 1.挖坑法 2左右指针法 3.前后指针法 // 交换两个元素的值 void swap(int* a, int* b) {int temp *a;*a *b;*b temp; }// 分区函数&#xff0c;返回分区点的索引 int par…

分享|LLM通过D-E-P-S完成长时间与多步骤的任务

《Describe, Explain, Plan and Select: Interactive Planning with Large Language Models Enables Open-World Multi-Task Agents&#xff1f; 描述、解释、计划和选择&#xff1a;使用大型语言模型进行交互式规划&#xff0c;实现开放世界的多任务代理 问题背景&#xff1a;…

chrome浏览器chromedriver下载

chromedriver 下载地址 https://googlechromelabs.github.io/chrome-for-testing/ 上面的链接有和当前发布的chrome浏览器版本相近的chromedriver 实际使用感受 chrome浏览器会自动更新&#xff0c;可以去下载最新的chromedriver使用&#xff0c;自动化中使用新的chromedr…

swagger使用指引

1.swagger介绍 在前后端分离开发中通常由后端程序员设计接口&#xff0c;完成后需要编写接口文档&#xff0c;最后将文档交给前端工程师&#xff0c;前端工程师参考文档进行开发。 可以通过一些工具快速生成接口文档 &#xff0c;本项目通过Swagger生成接口在线文档 。 什么…

一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署

前言 自从deepseek R1发布之后「详见《一文速览DeepSeek R1&#xff1a;如何通过纯RL训练大模型的推理能力以比肩甚至超越OpenAI o1(含Kimi K1.5的解读)》」&#xff0c;deepseek便爆火 爆火以后便应了“人红是非多”那句话&#xff0c;不但遭受各种大规模攻击&#xff0c;即便…

低通滤波算法的数学原理和C语言实现

目录 概述 1 原理介绍 1. 1 基本概念 1.2 一阶RC低通滤波器模型 2 C语言完整实现 2.1 滤波器结构体定义 2.2 初始化函数 2.3 滤波计算函数 3 应用示例 3.1 噪声信号滤波 3.2 输出效果对比 3.3 关键参数选择指南 4 性能优化技巧 4.1 定点数优化 4.2 抗溢出处理 …