GIT 時間旅行 強烈推薦閱讀

2021-10-03 08:21:35 字數 2920 閱讀 1632

操作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歲,我有點喜歡我們的生物老師,其實現在看起來,那就是 一種純純的喜歡。生物老師瘦瘦的白白...