[英]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 :提交之前提交要刪除(基礎)
由於“數百個修訂”約束,我假設以下前提條件:
這是一組相當嚴格的約束,但有一個有趣的答案實際上適用於這個角落的情況。
以下是步驟:
git branch base B
git branch remove-me R
git branch save
git rebase --preserve-merges --onto base remove-me
如果確實沒有沖突,則應該不再進行中斷。 如果存在沖突,您可以解決它們並rebase --continue
或決定只是忍受尷尬和rebase --abort
。
現在你應該在master
,不再有提交R了。 save
分支指向您之前的位置,以防您想要協調。
您希望如何安排其他人轉移到您的新歷史記錄取決於您。 你需要熟悉stash
, reset --hard
和cherry-pick
。 你可以刪除base
, remove-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>
首先在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.