[英]How to delete an specific old commit without deleting the changes in the code (i.e change the git story basically)
我有一個存儲庫,它只是我的,所以破壞任何東西都沒有問題。 而且只有一個分支,我認為這讓事情變得更容易。 假設我有這 7 個提交:
A -> B -> C -> D -> E -> F -> G
我想刪除提交 C 和 D
A -> B -> E -> F -> G
作為 A 有史以來的第一次提交,而 G 是最后一次提交。
我怎樣才能做到這一點? 沒有觸及我的代碼,只是 git 歷史。
我知道我唯一能做的就是重置 Head,但這行不通,因為我不想刪除 E、F 和 G。
正如其他人提到的,交互式 rebase 應該可以幫助您做到這一點。
這是程序。
打開命令行/git bash
你想刪除C
和D
所以在C
即B
之前去提交。 您可以執行git rebase -i HEAD~6
或git rebase -i <B's commit hash>
應打開一個編輯器窗口(vim 或其他基於您的設置的窗口),並且應如下所示
pick {A's commit message} pick {B's commit message} pick {C's commit message} pick {D's commit message} pick {E's commit message} pick {F's commit message} pick {G's commit message}
刪除提交C
和D
的整行,然后保存並關閉編輯器。 所以你的編輯器現在應該看起來像。
pick {A's commit message}
pick {B's commit message}
pick {E's commit message}
pick {F's commit message}
pick {G's commit message}
變基應該繼續並刪除提交C
和D
。 確保您解決了過程中可能出現的任何合並沖突,然后執行git rebase --continue
(僅當存在沖突時)
完成后,運行git log
以檢查 rebase 是否有效
您可以進行交互式變基(請參閱有關重寫歷史記錄的git 手冊,特別是“重新排序提交”部分)。
例如,輸入git rebase -i HEAD~5
將打開默認文件編輯器,其中包含最近 5 次提交的列表,從最舊到最新:
pick f7f3f6d commit C
pick 310154e commit D
pick a5f4a0d commit E
pick aaaaaaa commit F
pick bbbbbbb commit G
您可以刪除提交 C 和 D 的行。與上面鏈接中的示例類似,當您保存並退出編輯器時,Git 將您的分支倒回到這些提交的父級(即提交 B),應用提交 E,然后F然后G,然后停止。 您可以有效地完全刪除提交 C 和 D。
這可能很難撤消,因此請考慮首先創建一個新分支以嘗試 rebase。
您可以進行交互式變基:
git checkout myBranch # with G being myBranch HEAD)
git rebase -i B
這將重播B
之后的所有提交,但您有機會刪除不需要的提交。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.