簡體   English   中英

我剛剛失去了所有的工作嗎? 如何恢復我的本地數據? (吉特)

[英]Did I just lose all my work? How to restore my local data? (Git)

我對 git 很陌生。 我是個白痴,我在不知道自己在做什么的情況下使用它。 我不小心用主人覆蓋了我本地的所有內容。 36e6aed 是我 9 天前在 master 上執行的提交。 我可以恢復我的“重大更新”提交嗎?

注意:在此之前我做了 git add 。 然后我在那之后輸入了一些錯誤的東西,感到困惑,退出了窗口,然后做了下面打印的操作。

location/of/local/branch (master|MERGING)
$ git stash
Saved working directory and index state WIP on master: 36e6aed Restructure

location/of/local/branch (master)
$ git commit -m 'major updates'
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

location/of/local/branch (master)
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

location/of/local/branch (master)
$ git reflog
36e6aed (HEAD -> master, origin/master) HEAD@{0}: reset: moving to HEAD
36e6aed (HEAD -> master, origin/master) HEAD@{1}: commit: Restructure
b1ad2dc HEAD@{2}: pull origin master: Merge made by the 'ort' strategy.
5173228 HEAD@{3}: commit: tortoise mods
3df3009 HEAD@{4}: commit: Restructure
76a5c29 HEAD@{5}: pull origin master: Fast-forward
da38dd1 HEAD@{6}: pull: Fast-forward
122b86d HEAD@{7}: pull: Merge made by the 'ort' strategy.
bdc9928 HEAD@{8}: commit: In & Out folders
f339839 HEAD@{9}: commit (initial): Initial Commit

您沒有進行major updates提交。 幸運的是,您確實做出了提交; 我們馬上就拿回來。 這是 Git 在您嘗試制作時所說的:

 $ git commit -m 'major updates' On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean

這條(不是很有幫助)Git 消息說“我什么都沒做,因為沒有什么可做的。”

這里的訣竅是意識到為什么沒有什么可做的,那是嘗試提交之前:

 location/of/local/branch (master|MERGING) $ git stash Saved working directory and index state WIP on master: 36e6aed Restructure

git stash命令大致意思是:提交我現在擁有的,但根本沒有分支,然后刪除所有工作,因為它已安全保存在提交中。 所以你確實做了一個提交,但它不在任何分支上。 要取回它,只需運行git stash apply仔細檢查結果以確保你喜歡它,然后——當且僅當你喜歡它時——運行git stash drop

(您可以運行git stash pop 。這意味着apply 並立即 drop 。我建議將步驟分開,以便您可以先檢查。通常,apply 很好,drop 是正確的,但這有點像閉上眼睛跳下橋希望你降落在湖里而不是湖邊的岩石上。)

它比這更多,但在你的情況下,你只想取回隱藏的東西,以便你可以正常提交它。

更多的

在您運行git stash之前,您的 shell 提示符顯示:

 location/of/local/branch (master|MERGING)

這意味着您正在使用其中一個支持 Git 的 shell 提示包。 該特定包注意到您正處於合並中間,可能是由於沖突而暫停的合並。 當你調用git merge ——並且git pull你調用 git git merge ,這算作你調用git merge ——Git 會嘗試合並工作 Git 並不總是能夠自己做到這一點。

當 Git 嘗試將您的工作(您在分支上的提交)與其他人的工作(他們在分支1上的提交)結合起來時,這可能會順利進行,也可能不會。 如果進展順利,Git 通常會2進行新的提交。 但是,如果不是,則合並將在中間停止,並且那些提示設置的 shell 插件會插入|MERGING符號。

當合並確實像這樣在中間停止時,Git 會讓你的工作樹變得一團糟。 3你的工作是解決混亂並運行git add 在沖突文件上運行git add會告訴 Git 你已經正確解決了沖突。 Git 假設你知道你在這里做什么,並將此時工作樹副本中的任何內容作為正確的解決方案。

當你運行git add . 你告訴 Git 掃描整個當前目錄和子目錄——可能是你的整個工作樹——然后git add每個文件。 所以這告訴 Git 你解決了所有的沖突。 除非你這樣做,否則你不能做出的提交,即使是git stash所做的那些。 所以你的git stash工作,因為你跑了git add . .

如果你真的准備好了(已經解決了所有問題),你會做的git stash popgit stash apply來取回你想要的東西。 如果沒有,您仍然需要git stash applygit stash pop步驟,但在那之后,您需要繼續解決沖突:apply 步驟將帶回任何未解決的沖突標記部分。 Git 在這里幫不了你,因為你已經告訴 Git 你解決了所有問題,所以 Git 忘記了沖突是什么,並且會認為一個帶有沖突標記的工作樹文件正確的解決方案(盡管它幾乎可以肯定是' t)。 您只需要仔細查看您計划提交的內容(使用git diff和/或git diff --staged來找出答案)。


1 Git 中的分支這個詞有一個很大的問題:它至少意味着兩三個不同的東西,每次有人說或讀到這個詞時,意思就會轉換。 另請參閱“分支”到底是什么意思? 在這種情況下,“你的分支”和“他們的分支”可能具有相同的名稱——例如,兩者都可能被稱為master但它們位於兩個不同的存儲庫中,實際上是不同的分支,至少在多種意義上的“分支”一詞。 這一切都非常令人困惑和不幸。

2 git merge命令有時不必進行任何實際的合並,然后不會進行新的提交,除非您強制它這樣做。 Git 將此非實際合並操作稱為快進合並,即使沒有實際合並。 這也是令人困惑和不幸的。

3你的工作樹工作樹是你工作的地方。 Git從某個commit中復制文件,使其成為普通文件; 但這些文件實際上不在Git 中。 然后,您處理/使用這些副本。 當您准備好將它們用於新的提交時,運行git add讓 Git 掃描更新的文件並准備它們,然后運行git commit提交掃描的結果,這些結果是 Git 的內部形式,而不是工作樹中的文件。


還有一件事

盡管您可能還沒有為此做好准備(並且可以在完成工作時忽略它),但您應該知道git stash實際上至少進行了兩次提交。 git stash進行的兩個提交之一保存了 Git 的索引(也稱為staging area )。 git stash的另一個提交保存了你的工作樹。

然后,完成這兩個提交后, git stash運行git reset --hard 這就是刪除所有工作的原因: git stash savegit stash pushgit reset --hard步驟。 4通常git reset --hard具有相當大的破壞性,但是git stash首先進行了一些提交的事實使得這沒問題(或沒問題)。


4這里的savepush動詞之間的區別是歷史性的:它們對於 stash 的正常情況都做同樣的事情。 然而,在 Git 2.9 左右, git stash學會了制作“部分隱藏”。 為此,Git 人員不得不創建一個新動詞push ,因為原來的動詞save計划不周。 默認的git stash操作是 save-or-push 操作,當您不將 pathspecs 與git stash push一起使用時,它會完全保存並因此完全重置。 當您確實使用路徑規范時,這會將最終清理從git reset --hard更改為更具選擇性的內容。

早期的這個git stash push部分保存代碼中有很多錯誤,所以我建議在 Git 2.17 之前不要使用它。 好吧,我通常建議完全避免使用git stash ,除非在一些非常有限的情況下,但我的意思是,如果您使用git stash push使用部分推送功能,請在這些中間版本的 Git 中格外小心。

暫無
暫無

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

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