2010-10-20 37 views

回答

32

Git通常不會拋棄任何東西,但從中恢復可能仍然很棘手。

如果你有正確的來源,那麼你可以用--force選項將它推入遙控器。除非你告訴它,否則Git不會刪除任何分支。如果你實際上已經失去了提交,那麼看看this useful guide to recovering commits。如果你知道你想要的提交的SHA-1,那麼你可能沒問題。

最好的事情:把所有東西都放回來,看看你的本地存儲庫中還有什麼。如果可能,請在遙控器上執行相同操作。使用git fsck來查看是否可以收回東西,最重要的是請勿運行git gc

以上所有,絕不使用--force選項,除非您真的,真的是這個意思。

+37

你可以很可能只是看reflogs以確定遠程分支最初。例如'git reflog show remotes/origin/master'。你應該能夠在那裏看到你的推動力;前一行中的提交是在你搞砸之前的地方。然後,您可以將該修訂版(使用'--force')推到原來的位置,然後回到原來的位置! – Cascabel

+0

@David:哦。你沒有提到你的問題,你沒有回購。 (這當然是你永遠不想做的事情。)但是,如果你有文件系統訪問權限的話,你仍然可以在那裏完成所有這些。 – Cascabel

+1

@大衛:嗨。總是希望將當前目錄作爲提示的一部分來避免此類事情。 – Cascabel

2

我做了同樣的事情,而撤消最後一個推只有一個文件。最終返回到存儲庫的原始狀態。我使用的是Linus的git命令,因爲我在Linux上擁有本地副本。幸運的是,副本仍然完好無損。

我所做的只是(後瘋狂使得當地回購的幾個副本):

git add . 
git status 

(有人說,起源/主一度領先了68個提交,精...這些是所有提交我刪除了)

git remote set-url origin <GIT_SSH_URL> 
git push 

而且一切都恢復了之前我做強制推動的方式。 要記住的最重要的事情是不要做一個git結帳。你被強行推後。但最佳做法是禁用推送選項。我再也不會用它了。學習我的課程!

32

如果你知道提交哈希,很容易,只需重新創建你的分支。

5794458...b459f069 master -> master (forced update) 

刪除遠程分支:

git push origin :master 

然後用下面的命令重新創建分支:

git checkout 5794458 
git branch master 
git push origin master 
+0

謝謝!我喜歡它 –

+0

正是我在找的東西。 –

+0

天才。這爲我節省了很多工作 – fduembgen

0

如果您不是那個強制推送來源的本地倉庫,那麼在原點/主級別無法恢復。但如果你是幸運足夠使用GitHubGitHub for Enterprise,你可以看看到REST API和找回丟失提交補丁,例如:

  1. 列表中的事件,並找到提交SHA1長格式

https://api.github.com/repos/apache/logging-log4j2/events

  • 下載洛斯噸提交和檢索在JSON路徑相關補丁.files [] /補丁
  • https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de

  • 局部應用並再次推
  • git apply patch.patch & & git commit -m「restored commit」& & git push origin master

    相關問題