2013-08-19 77 views
1

這是我的傷心故事撤消git拉,它對歷史產生影響。

今天我犯了一個錯誤,從一個不同的倉庫拉入我的。我正在處理Repository A,並將存儲庫B的內容拉入A.我這樣做是因爲我想從該存儲庫中找到一些文件。

之後,我將我的存儲庫推送到遠程。

我的問題不是我的代碼,因爲這兩個存儲庫是不同的。但問題是歷史。

現在我的遠程Repository可以被公衆看到,它具有來自Repository B的所有提交歷史記錄以及我在日誌中的提交。

如何從歷史LOG中刪除這些提交?

有沒有辦法讓我的存儲庫重置爲昨天的狀態?這會導致我的歷史記錄庫B中的提交消失嗎?

我試圖重置Merge,Use Re-base和Cherry-pick,但兩種情況下都沒有刪除歷史記錄。

感謝您的時間

回答

0

謝謝大家。我解決了我的問題。我設法通過參考不同的文章和問題來解決它。

我會在這裏解釋答案,以及通過我的努力學到的東西。

首先,以選擇性地除去從歷史提交那些散落各地最好的辦法可以在答案中找到這個question

具體的由Charles Bailey答案。最接近這個答案的是Stuart

注意:恢復提交不會將其從歷史記錄中刪除,Reset會執行此操作。

至於我的特殊情況,我認爲我必須按照以前的方法進行每一次我不想要的提交,但實際上答案更簡單。

在我的情況下,我必須重新將git重置爲提交之前,我拉存儲庫B,它必須完成所有分支。一旦完成,所有來自B的不需要的提交從我的歷史中消失。

另一個值得一提的是,在許多提交中使用git Cherry-Pick或Revert並不像從在線文章中聽到的那樣直截了當,至少對我而言。

謝謝大家。

1

如果你知道你所有的分支是昨天,你可以通過和他們每個人恢復到原來的位置。對於每個相關分支:

git checkout <branch name> 
git reset --hard <old hash> 
git push -f <repository A> <branch name> 

然後,您可以刪除任何不需要的新分支。對於每個這樣的分支:

git branch -D <branch name> 
git push <repository A> :<branch name> 

這是非常粗略的,如果其他人可能從倉庫A同時拉。解決方案可能部分是社會性的,也可能是技術性的 - 其他使用存儲庫的人可能需要知道發生了什麼,以便他們修復本地克隆。

+0

問題是來自回購B的提交比我的提交更舊,現在出現在我的歷史記錄中,與我的提交混淆在一起。 –

0

git reflog是你想要看的地方。只要你在一段時間內沒有收集垃圾,你應該可以做一個git reset --hard [email protected]{x},x是歷史中的特定點,你希望將本地分支中的所有內容重新設置回。

只要你做到這一點,我會做一個git push --force把你的公共回購回到你想要的......

這有不幸的問題是,如果別人已經從遠程拉,他們的歷史將會搞砸。

+1

如果沒有明確的指示,git會在reflog中保留90天的歷史記錄,並且不會從那裏刪除任何可達的提交。 – jthill