簡體   English   中英

如何在不刪除代碼更改的情況下刪除特定的舊提交(即基本上更改 git 故事)

[英]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 應該可以幫助您做到這一點。

這是程序。

  1. 打開命令行/git bash

  2. 你想刪除CD所以在CB之前去提交。 您可以執行git rebase -i HEAD~6git rebase -i <B's commit hash>

  3. 應打開一個編輯器窗口(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}

刪除提交CD整行,然后保存並關閉編輯器。 所以你的編輯器現在應該看起來像。

    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}
  1. 變基應該繼續並刪除提交CD 確保您解決了過程中可能出現的任何合並沖突,然后執行git rebase --continue (僅當存在沖突時)

  2. 完成后,運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM