操作git rebase或git reset 命令看上去很簡單,但是操作過後後悔了,怎麼辦?
由於git rebase或git reset更改/重寫了 git commit log,因此唯一的返回方法是刪除所有內容,然後重新 clone 儲存庫以重新開始。可能您在讀完本文前,都是這樣做的!
在本文中,我將向您展示如何使用reflog(以及其他一些優雅的快捷方式)撤消某些改變歷史的動作,並返回正確的時間表!
設定環境
如果您只想閱讀示例,則可以跳到下一部分。但是,如果您想在自己的終端上按照示例操作,請在終端中作為命令執行以下每一行以設定演示庫:
mkdir reflog-demo && cd reflog-demo && git init
echo "file 1 content" > file1.txt && git add . && git commit -m "add file1"
echo "file 2 content" > file2.txt && git add . && git commit -m "add file2"
git checkout -b my-new-branch
echo "new branch file content" > newbranchfile.txt && git add . && git commit -m "add newbranchfile"
git checkout master
echo "file 3 content" > file3.txt && git add . && git commit -m "add file3"
git checkout my-new-branch
倉庫的 commit 資訊如下(使用git log --oneline --graph --all 檢視):
有乙個master分支,其中包含 3 個檔案,每個檔案都通過乙個單獨的 commit 新增到 git 中。還有乙個單獨的my-new-branch分支。該分支還具有 master 分之前兩個檔案,但隨後與 master 分離,
並擁有自己的第三個檔案newbranchfile.txt。這是期望的狀態。在下面的示例中將其弄亂時,我們的目標是使儲存庫恢復到此狀態。
(1)使用 reflog 重置引用
假設我們處於my-new-branch分支上,並且 rebase master:
我們意識到這是乙個錯誤!rebase 操作後,**邏輯可能不對了。在 rebase 過程中可能存在一些奇怪的合併衝突,並且一切都變得混亂了。無論哪種情況,我們都希望**能像以前一樣,但是
新的 git log 顯示如下,原來的 commit 606d45d 不見了,我們怎麼回去呢?
我們可以刪除所有內容並重新轉殖,但是我們可能沒有最新的 my-new-branch 副本。 我們需要在舊提交的基礎上手動建立乙個新分支,然後重新新增/刪除那裡的檔案,修改裡面的內容,但是很麻煩!
相反,可以嘗試執行git reflog以檢視歷史記錄中的有用資訊:
git reflog顯示了我們當前工作的head所在的所有地方,包括使用破壞性命令(如git reset和git rebase)刪除的提交。只需選出進行破壞性更改之前的 commit id,對gitrevision編號(帶有花括號的編號)
進行硬重置,然後將所有內容重置為恢復基準之前的狀態!本環境中的gitrevision是 3 和 4 都可以,我們用gitrevision 編號 3:
git reset --hard head@
在執行此命令後,git log 恢復到了目標狀態(即 rebase 誤操作前的狀態),如下圖:
(2)重置到 orig_head( 非常棒的方法!!!!! )
如果覺得reflog輸出有點令人困惑,而且很難準確的確定要返回到哪個 reflog。
確實這樣!很慶幸,又乙個非常簡單的方式:
git reset --hard orig_head
**orig_head**會自動指向最新破壞性更改之前的狀態,因此我們可以輕鬆地撤消最新的變基或使用單個命令進行重置!
在上面的示例中執行git reset --hard orig_head與在上面的示例中執行git reset --hard head@完全相同,而無需查詢特定的修訂版!
(3)重置到相對時間點( 非常棒的方法!!!!! )
重置為orig_head很棒,但是如果我們真的陷入了破壞性變化的困境,那該怎麼辦。讓我們以上乙個示例為基礎,並向其新增更多步驟:
git rebase master
git reset --hard head~2
git commit --amend -m 'shablagoo!'
一頓操作猛如虎,然後 git log 的狀態如下:
提交全部亂序,還導致檔案缺失。我們如何才能撤消呢???我們進行了多次破壞性的更改,因此orig_head無法正常工作。我們可以檢查git reflog,但是發生了太多更改,可能很難找到正確的
gitrevision 編號。
試試:git reset --hard head@ //!!!!!!!強烈推薦
//
kmeans聚類非常好用,強烈推薦強烈推薦強烈推薦
coding utf 8 import jieba from sklearn.feature extraction.text import countvectorizer from sklearn.feature extraction.text import tfidftransformer fro...
了解Cookie 強烈推薦
目錄 cookie的誕生 cookie的處理分為 伺服器端的傳送與解析 傳送cookie cookie 是怎麼工作的?cookie是由伺服器端生成,傳送給user agent,瀏覽器會將cookie的key value儲存到某個目錄下的文字檔案內,下次請求同一 時就傳送該cookie給伺服器,對co...
女孩到女人(強烈推薦)
我一直想找乙個理想的男友,結果總是很鬱悶。5歲時,我喜歡和乙個叫仔仔的男生玩,他有兩顆虎牙不算帥,但當他手裡有兩個 紅桔的時候,他會把那個大的給我吃。現在我再遇到他時,他手邊 有乙個5歲的女孩正 在叫他爸爸。16歲,我有點喜歡我們的生物老師,其實現在看起來,那就是 一種純純的喜歡。生物老師瘦瘦的白白...