我對 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
uj5u.com熱心網友回復:
你沒有做出承諾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是正確的,但這有點像閉上眼睛跳橋希望你降落在湖里,而不是湖邊的巖石上。)
它比這更多,但在你的情況下,你只想取回隱藏的東西,以便你可以正常提交它。
更多的
在運行之前,您的 shell 提示符git stash顯示:
location/of/local/branch (master|MERGING)
這意味著您正在使用其中一個支持 Git 的 shell 提示包。該特定包注意到您正處于合并中間,可能是由于沖突而暫停的合并。當你呼叫時——并且會為你呼叫,這算作你呼叫git merge——Git會嘗試合并作業。Git 并不總是能夠自己做到這一點。git pullgit merge git merge
當 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 pop或者git stash apply你會做的事情會得到你想要的。如果不是,您仍然需要git stash applyorgit stash pop步驟,但之后,您需要繼續解決沖突:應用步驟將帶回任何未解決的沖突標記部分。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索引(也稱為暫存區)的兩個提交之一。另一個提交git stash保存了你的作業樹。
然后,在完成這兩個提交后,git stash運行git reset --hard. 這就是洗掉您所有作業的原因:or的git reset --hard步驟。4 通常是非常具有破壞性的,但首先進行一些提交的事實使得這沒問題(或沒問題)。git stash savegit stash pushgit reset --hardgit stash
4save這里的 the和動詞之間的區別push是歷史性的:對于 stash 的正常情況,它們都做同樣的事情。然而,在 Git 2.9 左右,git stash學會了制作“部分存盤”。為此,Git 人員不得不創建一個新動詞 ,push因為原來的動詞save計劃不周。默認git stash操作是保存或推送操作,當您不將 pathspecs 與 一起使用時git stash push,它會執行完全保存并因此完全重置。當您使用pathspecs 時,這會將最終清理從 a 更改為git reset --hard更具選擇性的內容。
這個部分保存的代碼在早期有很多錯誤git stash push,所以我建議在 Git 2.17 之前不要使用它。好吧,我通常建議git stash完全避免,除非在一些非常有限的情況下,但我的意思是,如果你要使用git stash push 和使用部分推送功能,在這些 Git 的中間版本中要格外小心。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/477772.html
標籤:混帐
