2010-06-02 48 views
42

以下是我的回購狀態。意外退房後取回更改?

[~/rails_apps/jekyll_apps/nepalonrails (design)⚡] ➔ gst 
# On branch design 
# Changed but not updated: 
# (use "git add/rm <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: _layouts/default.html 
# deleted: _site/blog/2010/04/07/welcome-to-niraj-blog/index.html 
# deleted: _site/blog/2010/04/08/the-code-syntax-highlight/index.html 
# deleted: _site/blog/2010/05/01/showing-demo-to-kalyan/index.html 
# deleted: _site/config.ru 
# deleted: _site/index.html 
# deleted: _site/static/css/style.css 
# deleted: _site/static/css/syntax.css 
# modified: static/css/style.css 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

Accedently,我做了git checkout -f現在的變化都沒有了它我不是應該做的。

[~/rails_apps/jekyll_apps/nepalonrails (design)⚡] ➔ git co -f 
[~/rails_apps/jekyll_apps/nepalonrails (design)] ➔ gst 
# On branch design 
nothing to commit (working directory clean) 
[~/rails_apps/jekyll_apps/nepalonrails (design)] ➔ 

我可以找回變化嗎?

回答

31

我不認爲你可以恢復那些私人數據(「私人」在「沒有添加在索引中,也沒有提交」,這是未知的混帳),除非你有其他備份過程適用於你當前的工作目錄。

即使這不是在Git Aliases page提議,我認爲對於一些類型的別名結帳(如存在alias rm /bin/rm -i使用):

[alias] 
co = !sh -c 'git stash; git stash apply; git checkout "$*"' 

,與「git stash; git stash apply」作爲「檢查點技術「使用Brian Campbellhis answer

這個問題讓我想起了上ycombinator(提取物),這些行爲的辯論:


我已經失去了很多使用Git的數據。
大部分與刪除數據時無需確認的無害聽起來的命令有關。例如,git checkout filename相當於svn revert filename
當然git checkout branchname做了完全不同的事情。
如果一個分支和一個文件共享相同的名稱,git將默認切換分支,但這並不能阻止bash自動完成破壞一天。

這裏有一個瘋狂的想法:如果你有一個無害的行爲和一個危險的行爲,不要用同樣的命令標記它們。


惱人的,也許,但是這是用戶錯誤,而不是設計錯誤。有了git,如果我想無損丟棄我的工作副本,我可以「git stash」。
根據你的邏輯,「rm」有缺陷,因爲當你通過-f而不是-i時,它不會要求確認。那麼,是的。抱歉。


你的比喻會更準確,如果rm somename是的apt-get update等效,並rm othernamerm -fr othername
不過,這不可能是正確取決於是否有一個名爲foo在當前目錄


以下文件的兩個完全不同的事情之一是另一種瘋狂的是「get checkout foo」不想法:不要在骯髒的工作樹上運行'git checkout ...'。問題解決了。
另一個:不要重用文件名作爲分支名稱。
說實話:我已經毀了我一天的「rm」不小心調用了同樣的問題,但是當我嘀咕詛咒它在我的lazyness /愚蠢,而不是在bash的完井或「rm

行爲
+0

對於我的git 1.7.9.5,上述別名與'意外的EOF'錯誤。試圖取代';' '&&'。試過「$ @」而不是「$ *」:strace說參數不會傳遞給execve。試過一個「f(){...}; f」。沒有成功。以上是否適用於其他人? – alexei 2014-10-08 20:15:42

+0

@alexei我沒有使用年齡。我必須根據http://blogs.atlassian.com/2014/10/advanced-git-aliases/ – VonC 2014-10-08 20:24:01

17

除非你曾經使用git addgit stash以前的那些文件,那麼不幸的是沒有。如果您添加或隱藏了它們,那麼您應該能夠通過git reflog找到它們的哈希值。

我從來沒有對這種git checkout的破壞行爲感到滿意。也許一個有用的改進是在覆蓋你的工作之前,讓這種git checkout自動創建一個存儲(以便通過reflog捕獲文件)。

+3

我真的希望git做到了這一點。我感到很煩惱,當我改變分支時,我不得不費力地存放我的工作。我希望能夠輸入「git checkout foo; git checkout bar」,並假設我在分支欄上開始,最終以索引和工作目錄與命令之前完全相同的狀態結束,而不管我已經修改,我已經添加到索引等 – divegeek 2011-04-01 19:03:26

+0

所以,你想git自動版本控制文件和更改,無需你告訴它? – destenson 2015-11-27 18:50:52

+0

作爲最新的git版本,所有結帳都記錄在reflog – emaillenin 2016-05-11 05:24:55

35

你可以看到的另一件事是通過你的IDE。我不小心簽出了2個文件,並且能夠通過我的IDE(netbeans)的「本地歷史記錄」恢復更改。真是一件幸事!

+1

更新它。您也可以在Eclipse中通過右鍵單擊該文件並轉到Team- >顯示當地歷史記錄。 – donturner 2013-11-05 22:17:03

+1

你剛剛救了我的命!要在JetBrains中執行此操作,請轉到VCS菜單>本地歷史記錄 – 2013-11-12 05:59:04

+0

它也發生在我身上,Eclipse自動刷新了文本的內容;但幾次按ctrl + Z帶回我的修改,謝天謝地! – 2014-09-10 15:23:23

3

如果您在Linux上使用vim,可能會出現以下情況。

  • 如果文件是一個活躍的緩衝區中打開,然後你只要你不重裝Vim的文件,並且可以保存它恢復了文件內容。 。

  • 如果文件不是一個有效的緩衝器打開,但髒了,那麼就應該是在源目錄中也有一個是通過vim -r file.swp可回收內容的副本的.SWP文件。

  • 如果文件既不antive緩衝,也不開放髒了,如果你的工作副本是一個ext3或ext4的分區,然後extundelete或許能找到最近刪除.SWP文件和/或更舊版本的源文件。以只讀方式重新掛載分區,例如mount -o remount,ro /mnt/point,並運行

    extundelete --recover-directory /path/to/working/copy /dev/sdaX 
    

    如果包含工作副本的分區是根分區,可以拒絕重新安裝,然後嘗試殺死所有的服務,如果仍然沒有去,然後關機和開機使用的Live CD/USB/PXE,如GRML,並運行上述。我以這種方式成功恢復了三個丟失文件中的一個。

2

如果你使用Eclipse作爲IDE例如:It,你必須在你的文件中的團隊菜單:

  1. 右擊你的文件從內部
  2. 列表項「團隊「 - >」顯示當地歷史記錄「

你會看到所有的版本保存在本地沒有任何保存名稱,在我的情況下b ut,你可以很容易地檢查所有沒有跟蹤的git特性變化,並恢復你缺少的代碼。

0

你可以用git命令做任何事情,但如果你使用的是IDE,那麼你可以恢復你的更改。 我正在使用PhpStorm,我們可以在其中查看文件更改歷史記錄。 只需右鍵單擊文件,然後單擊顯示本地歷史記錄。 在外部更改選項卡下,您可以找到您意外刪除的本地更改。