利用DeepSeek實(shí)現(xiàn)復(fù)雜Git操作的詳細(xì)過程
1 背景介紹
今天綜合利用 DeepSeek V3
和 R1
推理模型,成功解決了一個(gè)復(fù)雜的 Git
操作,謹(jǐn)以此文記錄 DeepSeek
使用心得,以備后續(xù)復(fù)盤。這本是我一次操作上的疏漏,未能將 Fork 到本地的代碼與原項(xiàng)目徹底脫鉤,直到很晚才發(fā)現(xiàn)問題,已經(jīng)很難快速用簡(jiǎn)單的 Git 命令恢復(fù)原樣了。于是,我想到了 DeepSeek。
2 需求描述
現(xiàn)有一個(gè)從 GitHub
復(fù)刻(fork)到我本地的開源項(xiàng)目。從復(fù)刻到本地那天起,我又陸續(xù)在 main
分支提交了很多次(沒有其他分支)?,F(xiàn)在需要將我本人提交的所有節(jié)點(diǎn)從該副本完整遷移到另一個(gè)新倉(cāng)庫(kù),并要求保留所有節(jié)點(diǎn)的歷史提交記錄(提交時(shí)間、注釋信息等)。
【圖 0:遷移 Git 子版本樹的需求描述示意圖】
3 思路分析
該需求涉及從原 Git
庫(kù)徹底剝離需要的子版本樹。Git
還沒有能一步實(shí)現(xiàn)節(jié)點(diǎn)樹 “脫鉤” 的操作命令。但大方向是明確的,無非以下四步 ——
- 先找到脫鉤位置(簡(jiǎn)單);
- 從脫鉤點(diǎn)產(chǎn)生一個(gè)新的
Git
根節(jié)點(diǎn)(未知); - 設(shè)法將脫鉤點(diǎn)后續(xù)產(chǎn)生的提交版本依次追加到新的根節(jié)點(diǎn)上(未知);
- 最后刪除原有版本樹,重置遠(yuǎn)程推送分支
origin
(簡(jiǎn)單);
以上四步邏輯關(guān)系清晰,正好可以用 DeepSeek
一試身手。
4 實(shí)現(xiàn)過程
4.1 第一次需求確認(rèn)
因?yàn)樯婕岸啻螐?fù)雜 Git
操作,先用 V3
網(wǎng)頁(yè)版直接提問(刻意未加任何提示詞技巧):
我有一個(gè)本地 Git 代碼倉(cāng)庫(kù),是從 GitHub 一個(gè)開源項(xiàng)目上 fork 到本地的,但這樣產(chǎn)生的提交不計(jì)入 GitHub 網(wǎng)站的個(gè)人貢獻(xiàn),因此我在提交了很多本地新增的版本后決定將其剝離出來。但我不知道應(yīng)該怎么操作。幫幫我
以下是整理后的 DeepSeek V3
的回復(fù),可以看到 V3
模型第一次理解有偏差:
要將本地 Git 倉(cāng)庫(kù)從 GitHub 的 fork 中剝離出來,使其成為一個(gè)獨(dú)立的倉(cāng)庫(kù),并保留所有提交歷史,可以按照以下步驟操作:
# 1. 備份當(dāng)前倉(cāng)庫(kù) # 2. 移除與上游倉(cāng)庫(kù)的關(guān)聯(lián): cd /path/to/your/repo git remote remove origin # 3. 創(chuàng)建新的 GitHub 倉(cāng)庫(kù)(不要初始化 README 或 .gitignore) # 4. 將本地倉(cāng)庫(kù)關(guān)聯(lián)到新倉(cāng)庫(kù): git remote add origin https://github.com/yourusername/new-repo-name.git # 5. 推送代碼到新倉(cāng)庫(kù): git push -u origin --all git push -u origin --tags # 6. 確保本地分支跟蹤新的遠(yuǎn)程分支: git branch --set-upstream-to=origin/main main
要是按上述回復(fù)進(jìn)行操作,其實(shí)只是把遠(yuǎn)程分支更新到了新倉(cāng)庫(kù),完全沒有實(shí)現(xiàn)想要的“脫鉤”效果。
4.2 第二次需求確認(rèn)
繼續(xù)追問:
如果只想保留部分提交歷史,比如只有我自己的提交歷史,又該如何?
這次它聽懂了,但給出的方案是借助第三方工具(由于不是理想回復(fù),具體內(nèi)容已精簡(jiǎn)):
# 1. 安裝 `git filter-repo` pip install git-filter-repo # 2. 為避免直接操作原始倉(cāng)庫(kù),建議先備份 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. 清理遠(yuǎn)程信息 git remote remove origin # 5. 創(chuàng)建新的 GitHub 倉(cāng)庫(kù) new-repo-name # 6. 關(guān)聯(lián)新倉(cāng)庫(kù)并推送 git remote add origin https://github.com/your-username/new-repo-name.git git push -u origin --all git push -u origin --tags # 7. 效果驗(yàn)證(略)
由于需要安裝第三方依賴,解決方案的可移植性較差。因此還需繼續(xù)追問。
4.3 第三次需求確認(rèn)
由于我想要的是 Git 原生命令,因此再次追問:
我不想安裝第三方工具,Git 沒有原生方法實(shí)現(xiàn)嗎?
這次它終于聽懂了,想到了孤立分支(--orphan
)和 cherry-pick
節(jié)點(diǎn)提取命令 ——
如果你不想安裝第三方工具(如 git filter-repo),Git 本身也提供了原生方法來實(shí)現(xiàn)部分提交歷史的保留,但操作會(huì)稍微復(fù)雜一些。以下是使用 Git 原生命令實(shí)現(xiàn)的方法:
# 1. 克隆你的本地倉(cāng)庫(kù) git clone /path/to/your/repo new-repo cd new-repo # 2. 創(chuàng)建一個(gè)新的分支 git checkout --orphan new-branch # 3. 篩選并重新提交你的更改 # 從提交歷史篩選想要的提交哈希值: git log --author="your-username" --oneline # 逐個(gè)挑選提交 git cherry-pick <commit-hash> # 如果需要挑選多個(gè)提交,可以將哈希值列出來: git cherry-pick <commit-hash-1> <commit-hash-2> <commit-hash-3> # 4. 清理舊分支 git branch -D main # 刪除舊的主分支 git branch -m new-branch main # 將新分支重命名為主分支 # 5. 清理舊的遠(yuǎn)程分支 git remote remove origin # 6. 創(chuàng)建新的 GitHub 倉(cāng)庫(kù) # 7. 關(guān)聯(lián)新倉(cāng)庫(kù)并推送 git remote add origin https://github.com/your-username/new-repo-name.git git push -u origin main # 8. 驗(yàn)證
這里 DeepSeek
還漏掉了一個(gè)關(guān)鍵細(xì)節(jié):cherry-pick
在遇到多個(gè) commit
版本時(shí)需要嚴(yán)格遵守先后順序。在我進(jìn)一步的提示下,它才補(bǔ)全了這部分內(nèi)容,并且給出了發(fā)生沖突時(shí)的解決方案,但比較官方:
如果在挑選提交時(shí)發(fā)生沖突:
Git 會(huì)暫停挑選過程,并標(biāo)記沖突文件。
手動(dòng)解決沖突后,使用以下命令繼續(xù):
git add <resolved-files> git cherry-pick --continue
如果你想跳過當(dāng)前提交(例如沖突無法解決),可以使用:
git cherry-pick --skip
如果你想取消整個(gè)挑選過程,可以使用:
git cherry-pick --abort
4.4 V3 模型:中間結(jié)果的處理
由于 git log
命令得到的 commit
順序是從新到舊,與 cherry-pick
相反,因此可以讓 DeepSeek
幫我獲取正確排序的哈希列表。這類簡(jiǎn)單任務(wù) 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. 解釋參數(shù) # --since="2024-09-13 00:00:00":篩選出指定日期之后的提交。 # --reverse:將提交歷史從最舊到最新排列。 # --pretty=format:"%H":只輸出提交的哈希值。
為了節(jié)省時(shí)間,我將最后的 PowerShell
命令作了進(jìn)一步格式化處理,只保留 SHA1
哈希值的前八位,并用空格進(jìn)行分隔:
(git log --since="2024-09-13 00:00:00" --reverse --pretty=format:"%H" | % { $_.Substring(0, 8) }) -join " "
4.5 方案驗(yàn)證,首戰(zhàn)告捷
然后按照最后一次需求確認(rèn)的結(jié)果,嘗試用 --orphan
+ cherry-pick
來實(shí)現(xiàn):
# 備份到新文件夾,再行處理 > git clone F:\Courses\Postman2\ newRepo Cloning into 'newRepo'... done. > cd newRepo # 獲取待遷移節(jié)點(diǎn)列表(從早到晚排序) > $tmp = (git log --since="2024-09-13 00:00:00" --reverse --pretty=format:"%H" | % { $_.Substring(0, 8) }) -join " " # 從 main 分支切到孤立分支 master > git checkout --orphan master # 移除暫存區(qū)(stage)內(nèi)的所有提交內(nèi)容 > git rm --cached *
最后這步是為了清空當(dāng)前工作區(qū)內(nèi)的無關(guān)變更,以便執(zhí)行 git cherry-pick
命令:
【圖 1:切到孤立分支 master 后,移除暫存區(qū)(stage)內(nèi)的所有提交內(nèi)容】
之后就可以刪除工作區(qū)內(nèi)的冗余內(nèi)容了(除了 .git
文件夾保留,其余均可刪除):
# 查看當(dāng)前待刪文件(夾) > git status -s ?? LICENSE ?? README.md ?? code/ ?? notes/ > rm -Recurse -Force LICENSE,code,notes,README.md
【圖 2:清空工作區(qū)內(nèi)的所有無關(guān)內(nèi)容】
然后就可以放心執(zhí)行 git cherry-pick
了:
# 批量執(zhí)行節(jié)點(diǎn)遷移 > $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" >
但是按默認(rèn)的合并方式,會(huì)得到很多沖突報(bào)錯(cuò),中斷命令:
【圖 3:批量執(zhí)行 cherry-pick 后出現(xiàn)一堆沖突文件】
此時(shí)只需要用 git add *
命令直接將其標(biāo)記為已解決,就能繼續(xù)了:
【圖 4:手動(dòng)處理沖突內(nèi)容,并繼續(xù) git cherry-pick 操作】
接著,Git
會(huì)自動(dòng)彈出本輪 操作的提交注釋頁(yè),詢問是否需要修改注釋內(nèi)容。這里無需修改,直接關(guān)閉即可:
【圖:5:批量操作后的提交界面(無需修改,直接關(guān)閉即可)】
最后,再用 gitk --all
命令查看版本樹,新的子版本樹就誕生了:
【圖 6:利用 gitk --all 查看當(dāng)前所有版本樹,新的子樹(上方)已經(jīng)生成完畢,且歷史提交日期不變】
處理完最復(fù)雜的兩步后,剩下的都是些簡(jiǎn)單的收尾工作:
# 刪除本地舊分支 main > git branch -D main Deleted branch main (was bfdf3be). # 刪除遠(yuǎn)程跟蹤分支 origin > git remote remove origin # 分支 master 重命名為 main > git branch -m master main # 新建目標(biāo)倉(cāng)庫(kù),重置遠(yuǎn)程跟蹤分支 > git remote add origin git@github.com:SafeWinter/learn-postman2.git # 推送到遠(yuǎn)程倉(cāng)庫(kù) > git push -u origin main
這樣就實(shí)現(xiàn)了 Git
子版本樹的完整遷移:
5 總結(jié)復(fù)盤
上述操作過程看似一氣呵成,其實(shí)中途有很多次微調(diào)沒有記錄,這里略作復(fù)盤:
DeepSeek
延續(xù)了 “遇強(qiáng)則強(qiáng)” 的大模型風(fēng)格,要想得到滿意的答復(fù),提問者除了精準(zhǔn)描述問題外,還需要對(duì)相關(guān)領(lǐng)域有扎實(shí)的基礎(chǔ);否則DeepSeek
只會(huì)跟著你的思路,無法立即看出問題的根源所在;- 一旦需求明確后,
DeepSeek
往往能很快提供準(zhǔn)確回復(fù),且該方案準(zhǔn)確率極高(--orphan
+cherry-pick
組合);這種感覺就像是在和付費(fèi)版ChatGPT 4x
對(duì)話,但又是完全免費(fèi)使用,非常震撼; - 務(wù)必重視
R1
模型的推理過程,這是后續(xù)大幅提高準(zhǔn)確率的關(guān)鍵。R1
模型會(huì)將當(dāng)前會(huì)話的歷史記錄全部導(dǎo)入推理過程,十分智能; - 建議大家還是多用網(wǎng)頁(yè)或手機(jī)版 DeepSeek,能在本地部署的都是完整模型的蒸餾版,雖然無需聯(lián)網(wǎng)交流,但表現(xiàn)是大打折扣的;與其跟風(fēng)“大煉鋼鐵”,不如多用 DeepSeek 解決一些實(shí)際問題;
- 本文介紹的版本樹剝離方案還存在一個(gè)問題:各歷史節(jié)點(diǎn)的提交時(shí)間和作者修改不一致——前者為當(dāng)前操作時(shí)間,后者為歷史記錄時(shí)間 1。要讓提交時(shí)間也回歸到歷史節(jié)點(diǎn),只能從歷史節(jié)點(diǎn)中提取提交時(shí)間,然后逐一提交。但這樣的單獨(dú)處理,只要存在對(duì)原內(nèi)容的修改,當(dāng)次
cherry-pick
操作就會(huì)中斷,且必須手動(dòng)處理內(nèi)容沖突,DeepSeek
暫時(shí)無法給出包含手動(dòng)處理版本沖突的自動(dòng)化腳本,只能給出沒有中斷的情況下每次遷移的自動(dòng)化腳本(如下所示)。要實(shí)現(xiàn)徹底自動(dòng)化,還需要提問者自身對(duì)bash
腳本或PowerShell
腳本有相當(dāng)程度的透徹理解。
# 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 # 設(shè)置環(huán)境變量 $env:GIT_AUTHOR_DATE = $AUTHOR_DATE.Trim() $env:GIT_COMMITTER_DATE = $COMMITTER_DATE.Trim() # 執(zhí)行 cherry-pick git cherry-pick --keep-redundant-commits --allow-empty $CommitHash # 運(yùn)行方法:.\runcommit.ps1 commit_SHA_value (Enter)
該問題在瀏覽器查看歷史提交記錄時(shí)才會(huì)出現(xiàn),GitHub
目前只能按實(shí)際提交時(shí)間排序,而 Gitee
則可以選擇排序方式。相比之下,國(guó)產(chǎn)的 Git
托管平臺(tái)在展示歷史提交方面更有優(yōu)勢(shì)。
以上就是利用DeepSeek實(shí)現(xiàn)復(fù)雜Git操作的詳細(xì)過程的詳細(xì)內(nèi)容,更多關(guān)于DeepSeek實(shí)現(xiàn)Git操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于Python和Java實(shí)現(xiàn)單詞計(jì)數(shù)(Word Count)
Spark框架也是MapReduce-like模型,采用“分治-聚合”策略來對(duì)數(shù)據(jù)分布進(jìn)行分布并行處理,本文就來利用Spark實(shí)現(xiàn)單詞統(tǒng)計(jì)的功能,需要的可以參考一下2023-05-05win10 + anaconda3 + python3.6 安裝tensorflow + keras的步驟詳解
這篇文章主要介紹了win10 + anaconda3 + python3.6 安裝tensorflow + keras的步驟,需要的朋友可以參考下2019-09-095個(gè)Linux平臺(tái)程序員最愛的開發(fā)工具匯總
這篇文章主要介紹了5個(gè)Linux平臺(tái)程序員最愛的開發(fā)工具匯總,程序最重要的工具就是源碼編輯器了,或者是一個(gè)全能的IDE,本文就羅列了5個(gè)Linux平臺(tái)最常用的編輯給大家,需要的朋友可以參考下2014-09-09使用Ollama服務(wù)監(jiān)聽0.0.0.0地址
本文介紹了如何配置Ollama以監(jiān)聽0.0.0.0地址,使其能夠接受來自任何網(wǎng)絡(luò)接口的連接,并驗(yàn)證配置是否生效,同時(shí),也提醒了在進(jìn)行此操作時(shí)應(yīng)注意的安全風(fēng)險(xiǎn)2025-02-02MAC快速本地部署Deepseek的實(shí)現(xiàn)步驟
本文介紹了在Mac上快速本地部署Deepseek大語(yǔ)言模型,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02