簡體   English   中英

將丟失的更改恢復到git工作目錄

[英]Restore lost changes to git working directory

我的存儲庫中有很多未更改的更改。 當嘗試從遠程分支選擇櫻桃時,發生沖突。 我打了中止,這刪除了我對工作目錄所做的所有未暫存的更改,並且丟失了很多代碼。

我該如何找回?

這似乎是個問題:

在此處輸入圖片說明

我嘗試過:git checkout @ {-1}

那給了我一個空頭。

除了通過(例如)MacOS Time Machine或備份進行恢復之外,您可能還不走運。


在Git中,“非階段性的更改”具有誤導性。 沒有這樣的事情。 只有工作樹文件 當Git說工作樹文件不同時,這是一個正確的說法:工作樹副本與其他副本不同。 當Git顯示差異時,是通過工作樹副本與其他副本進行比較構造的。

如果差異消失了,那么肯定發生了兩件事之一(或兩者都有!):

  • 另一個副本現在匹配:因此,工作樹副本仍然相同,但是另一個副本匹配。 這就是發生的情況,例如,當您添加並提交時: git add復制每個文件的工作樹副本以替換陳舊的索引副本,然后該提交從索引副本進行新的提交。

  • 或者,工作樹副本現在匹配:舊的工作樹副本已被丟棄,並用您要與之進行比較的副本取代(很可能是索引或HEAD提交)。

值得記住的是,在使用Git時,每個提交都具有永久凍結成這種形式的每個文件的完整副本 (嗯,提交中的每個文件,但這都是多余的)。 1但是這些副本采用特殊的,僅Git的壓縮形式。 除了 Git 外,它們對其他任何功能都沒有用。

因此,Git提供了一種提交中提取文件的方法,將它們轉換回有用的形式。 這會將文件的副本放入工作樹中,您可以在其中查看和處理它。 這些副本不是由Git管理和維護的 ,它們只是在Git提取它們之后坐在工作樹中。 除了在提取過程中創建它們(或用提取的內容替換它們的內容)期間,Git不能對它們負責。

在當前的(凍結的) HEAD提交和(完全流動的,未由Git管理的)工作樹之間,Git還會保留每個文件的某種“幾乎凍結”或“骯臟”的副本。 該副本最初與HEAD提交匹配,並且始終采用特殊的僅Git格式。

每個文件的這些副本都存在於Git調用的內容中,即索引暫存區緩存中 ,具體取決於Git的執行人員/角色。

當您使用git add ,您告訴Git: 取得工作樹副本中的所有內容,然后將其復制回索引,替換舊的索引副本 這個Git修改了內容,使它們大部分都被凍結了,以使它們准備好進入下一個提交。 如果您之前是git add -ing的文件不在索引中,那么現在它以特殊的僅Git格式存在於索引中,可以提交了。

因此,我所知道的關於索引的最佳簡短描述是它是您打算進行的提交 每個文件都有自己的副本,隨時可以提交。 與大多數其他面向提交的版本控制系統相比,這就是讓git commit如此之快的原因:其他人不得不(通常是非常緩慢地)掃描整個工作樹,重新壓縮每個文件以查看是否不同或獲取它。准備下一次提交。 通過將當前提交中的內容保存到該索引中,Git使它們都准備好進行下一次提交。

因此,每個文件都有三個副本: HEAD副本,索引副本和工作樹副本。 與每個提交的副本一樣, HEAD (當前提交)副本被凍結且安全。 索引和工作樹副本可以更改。 如果要確保不會丟失文件,請將其復制到索引中並提交。 有時您可以稍后使用git rebase -i將提交git rebase -i下來,從而刪除提交。


1更確切地說,提交中的文件副本會一直持續到提交本身持續的時間。 通常,那是永遠的。 但是,如果您進行了一些提交,則永遠不要將其發送/推送給任何人,然后使用git rebase -i將它們壓縮在一起,最終您將執行一次最終提交,而其他中間提交最終將過期(並且永遠不會發送/推送) 。

暫無
暫無

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

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