簡體   English   中英

您如何刪除 git 歷史記錄中的特定修訂版?

[英]How do you remove a specific revision in the git history?

假設您的 git 歷史記錄如下所示:

1 2 3 4 5

1-5 是單獨的修訂版。 您需要在保留 1、2、4 和 5 的同時刪除 3。如何做到這一點?

刪除后有數百個修訂版,有沒有有效的方法?

這是一種非交互式刪除特定<commit-id> ,只知道要刪除的<commit-id>

git rebase --onto <commit-id>^ <commit-id> HEAD

根據這個評論 (我檢查過這是真的),rado的答案非常接近,但是讓git處於一個獨立的頭狀態。 相反,刪除HEAD並使用它從您所在的分支中刪除<commit-id>

git rebase --onto <commit-id>^ <commit-id>

如前所述, git-rebase(1)是你的朋友。 假設提交在你的master分支中,你會這樣做:

git rebase --onto master~3 master~2 master

之前:

1---2---3---4---5  master

后:

1---2---4'---5' master

來自git-rebase(1):

也可以使用rebase刪除一系列提交。 如果我們有以下情況:

 E---F---G---H---I---J topicA 

那么命令

 git rebase --onto topicA~5 topicA~3 topicA 

會導致刪除提交F和G:

 E---H'---I'---J' topicA 

如果F和G在某種程度上存在缺陷,或者不應該成為topicA的一部分,那么這很有用。 請注意,--onto和參數的參數可以是任何有效的commit-ish。

要將版本3和4組合到單個版本中,可以使用git rebase。 如果要刪除修訂版3中的更改,則需要在交互式rebase模式下使用edit命令。 如果要將更改組合到單個修訂中,請使用squash。

我已成功使用此壁球技術,但從未需要刪除修訂版。 “Splitting commits”下的git-rebase文檔應該會給你足夠的想法來解決它。 (或其他人可能知道)。

git文檔

使用您希望保留的最早提交啟動它:

git rebase -i <after-this-commit>

編輯器將被激活當前分支中的所有提交(忽略合並提交),這些提交在給定的提交之后。 您可以將此列表中的提交重新排序到您的內容,然后您可以刪除它們。 該列表看起來或多或少像這樣:

  選擇deadbee這個提交的原則\n pick fa1afe1下一次提交的oneline\n ... 

在線描述純粹是為了您的樂趣; git-rebase不會查看它們,而是查看提交名稱(本例中為“deadbee”和“fa1afe1”),因此不要刪除或編輯名稱。

通過使用命令“edit”替換命令“pick”,您可以告訴git-rebase在應用該提交后停止,以便您可以編輯文件和/或提交消息,修改提交並繼續重新定位。

如果要將兩個或多個提交折疊為一個,請將命令“pick”替換為“squash”以進行第二次和后續提交。 如果提交具有不同的作者,則它會將壓縮的提交歸因於第一次提交的作者。

如果您只想刪除在修訂版3中所做的更改,則可能需要使用git revert。

Git revert只是創建一個新版本,其中包含撤消修訂版本中所有更改的更改。

這意味着,您保留有關不需要的提交和刪除這些更改的提交的信息。

這可能是非常友好的,如果有人在同一時間從你的存儲庫中撤出,因為恢復基本上只是一個標准的提交。

到目前為止,所有答案都沒有解決拖尾問題:

在刪除之后有數百個修訂版時,是否有一種有效的方法?

以下步驟,但作為參考,讓我們假設以下歷史:

[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]

C :提交后刪除提交(干凈)

R :要刪除的提交

B :提交之前提交要刪除(基礎)

由於“數百個修訂”約束,我假設以下前提條件:

  1. 你希望從未存在過一些令人尷尬的承諾
  2. 還有ZERO后續提交,實際上取決於那個令人尷尬的提交(恢復時的零沖突)
  3. 你不在乎你會被列為數百個干預提交的“提交者”('作者'將被保留)
  4. 你從未共享過存儲庫
    • 或者你實際上對所有曾經克隆過歷史記錄的人有足夠的影響力來說服他們使用你的新歷史
    • 不關心 重寫歷史

這是一組相當嚴格的約束,但有一個有趣的答案實際上適用於這個角落的情況。

以下是步驟:

  1. git branch base B
  2. git branch remove-me R
  3. git branch save
  4. git rebase --preserve-merges --onto base remove-me

如果確實沒有沖突,則應該不再進行中斷。 如果存在沖突,您可以解決它們並rebase --continue或決定只是忍受尷尬和rebase --abort

現在你應該在master ,不再有提交R了。 save分支指向您之前的位置,以防您想要協調。

您希望如何安排其他人轉移到您的新歷史記錄取決於您。 你需要熟悉stashreset --hardcherry-pick 你可以刪除baseremove-me ,並save分支

所以這是我面臨的情景,以及我是如何解決它的。

[branch-a]

[Hundreds of commits] -> [R] -> [I]

這里R是承諾,我需要被移除,而I是一個提交自帶之后R

我做了一個還原提交並將它們壓在一起

git revert [commit id of R]
git rebase -i HEAD~3

在交互式rebase壓縮期間,最后2次提交。

我也陷入了類似的境地。 使用以下命令使用交互式rebase,在選擇時,刪除第3次提交。

git rebase -i remote/branch

rado和kareem的答案對我沒有任何幫助(只有消息“當前分支是最新的。”出現)。 可能會發生這種情況,因為'^'符號在Windows控制台中不起作用。 但是,根據這個評論,將'^'替換為'~1'可以解決問題。

git rebase --onto <commit-id>^ <commit-id>

要從git repo中刪除舊的提交歷史記錄:

首先在cmd下面運行

rm -rf .git

- 從當前重新創建回購

git init                                                                           
git add .                                                  
git commit -m "first commit"

- 推送到github遠程回購

git remote add origin git@github.com<your git mail>   
git push -u --force origin master

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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