簡體   English   中英

如何還原對git的推送

[英]How do I revert a push to git

我有一個分支feature-Test從master創建feature-Test feature-Test分支包含以下文件夾結構:

Test/methods ,我錯誤地刪除了該Test/methods ,並將其推送提交給master。

現在如何恢復原樣,使我擁有相同的文件夾結構?

您可以使用git revert <commit_id>還原提交。 這將創建一個新的提交,該提交將還原您使用<commit_hash>指定的提交的更改。

為了獲得<commit_id> ,執行git reflog並找到您進行更改的相關提交。

有兩種方法可以解決此問題。 通常,您可以嘗試重寫歷史記錄以完全消除錯誤,也可以在歷史記錄的末尾添加“還原”,以便歷史記錄包括“提交刪除某些文件”,然后“提交放置”。文件退回”。

要考慮的一件事是,在共享(“推送”)歷史后重寫歷史會產生一些成本。 如果您嘗試遵循大多數其他答案的建議,那么當您嘗試進行push時會遇到錯誤; 這是git告訴您,您正在嘗試重寫歷史記錄,這可能會對其他用戶造成問題。 您仍然可以做到,但不要輕易做出決定。 為什么這么多人認為建議這樣做而不討論所引起的問題,這超出了我的范圍。

另一個要考慮的是,包含文件刪除的提交是否還包含您要保留的更改。

讓我們開始簡單:如果您想完全撤消提交中的所有更改,但又願意將提交保留為分支歷史的一部分,那么您只需

git revert HEAD

這將創建一個新的提交,使內容恢復到最近一次提交之前的外觀-因此,假定刪除后未提交任何新內容,則應返回已刪除的文件。 您可以推送此提交,一切都會恢復git log ,除了git log將顯示帶有錯誤的提交,以及隨后的提交以撤消它。

如果刪除后已執行其他工作,則可以對其進行調整。 您只需為要撤消的提交給revert命令一個有效名稱即可。 這可能是一個提交ID,或類似的表達HEAD~2 (如果有2個提交后一個要撤消)或一些條件引用日志表達下...有很多可能性。

如果您想保留提交中的某些更改,可以說

git revert -n HEAD

這是相似的,但是不是自動提交“撤消”更改,而是將它們放入索引和工作樹中-換句話說,是已分階段但未提交的更改。 然后,您可以對提交進行進一步的編輯,例如使用git checkout HEAD -- path/to/a/file/with/changes/you/want/to/keep

在這個過程中,你可以使用git status ,以確定都在上演什么樣的變化,記住,因為這是你想要從恢復提交保留任何變化的復歸是要在決賽中沒有看到一個status

如果像這樣的“后退”操作令人困惑,或者如果更容易識別已刪除文件的路徑,則可以跳過revert命令並手動執行“撤消”工作。 對於每個刪除的路徑

git checkout HEAD^ -- path/to/deleted/file

如果需要提醒您刪除了哪些文件,可以使用

git show --name-status HEAD

它將在以D開頭的行上顯示每個已刪除的路徑。

現在,如果由於某種原因您覺得值得額外麻煩,則可以修改歷史記錄。 您可能會認為歷史看起來“干凈”而沒有意外提交-但坦率地說,這種虛榮心使許多人付出了不必要的努力。 真正有理由在推動提交后刪除提交的大多數原因(提交包含密碼,提交包含大文件等)需要比我在此詳細說明的過程更徹底的過程。 這只是“清理”歷史外觀的最低限度的過程,您會發現這仍然是一個痛苦的過程。

因此,如果您嘗試類似

git reset --hard HEAD^
git push

git會拒絕推送,因為您的分支將以非快進方式移動。 您可以使用

git push -f

使用push -f是警告您將其他開發人員置於不利境地。 現在,他們的回購協議對分支的狀況做出了錯誤的假設,因此他們將不得不恢復。 請參閱git rebase文檔中的“從上游rebase恢復”; 該指南適用於您推送的所有歷史記錄重寫。

簡而言之,其他開發人員將不得不強制更新其本地引用以反映強制推動。 (如果他們改為強行推銷他們的工作,他們將撤消您的修復;因此,您確實需要與所有人進行協調。)根據錯誤的提交,他們已經完成的任何工作都必須重新設置基礎。

如果其他開發人員很少,或者他們在該分支工作不多; 大家之間的交流很好; 然后就可以開始工作了。 但話又說回來,這樣可以更簡單地revert

我建議您通過以下方法檢查犯錯的提交:

git checkout hash

但是,如果您確定什么是提交,則應該:

git reset --hard hash

然后,推向高手。

使用git reset ~HEAD git commit -am "<your_message>"提交最后一次提交,再次添加文件夾並使用git commit -am "<your_message>"進行新提交,然后再次使用git push origin master推送它

希望您的問題能解決。 嘗試使用它。

暫無
暫無

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

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