主頁(yè) > 知識(shí)庫(kù) > Git中一些撤銷和恢復(fù)命令的使用小結(jié)

Git中一些撤銷和恢復(fù)命令的使用小結(jié)

熱門標(biāo)簽:溫州鹿城地圖標(biāo)注找誰(shuí) 南昌crm外呼系統(tǒng)價(jià)格 在抖音做地圖標(biāo)注用手機(jī)標(biāo) 長(zhǎng)治市400企業(yè)電話申請(qǐng)費(fèi)用 電話機(jī)器人近幾年收費(fèi)標(biāo)準(zhǔn) 網(wǎng)絡(luò)外呼系統(tǒng)怎么樣 廈門語(yǔ)音電銷機(jī)器人價(jià)格 北京電話機(jī)器人哪家便宜 ai外呼系統(tǒng)怎樣掛機(jī)賺錢

撤銷一個(gè)“已公開”的改變

場(chǎng)景: 你已經(jīng)執(zhí)行了 git push, 把你的修改發(fā)送到了 GitHub,現(xiàn)在你意識(shí)到這些 commit 的其中一個(gè)是有問(wèn)題的,你需要撤銷那一個(gè) commit.

方法:

復(fù)制代碼
代碼如下:
git revert SHA>

原理: git revert 會(huì)產(chǎn)生一個(gè)新的 commit,它和指定 SHA 對(duì)應(yīng)的 commit 是相反的(或者說(shuō)是反轉(zhuǎn)的)。如果原先的 commit 是“物質(zhì)”,新的 commit 就是“反物質(zhì)” — 任何從原先的 commit 里刪除的內(nèi)容會(huì)在新的 commit 里被加回去,任何在原先的 commit 里加入的內(nèi)容會(huì)在新的 commit  里被刪除。

這是 Git 最安全、最基本的撤銷場(chǎng)景,因?yàn)樗⒉粫?huì)改變歷史 — 所以你現(xiàn)在可以  git push 新的“反轉(zhuǎn)” commit 來(lái)抵消你錯(cuò)誤提交的 commit。

撤銷“本地的”修改

場(chǎng)景: 一只貓從鍵盤上走過(guò),無(wú)意中保存了修改,然后破壞了編輯器。不過(guò),你還沒有 commit 這些修改。你想要恢復(fù)被修改文件里的所有內(nèi)容 — 就像上次 commit 的時(shí)候一模一樣。

方法:

復(fù)制代碼
代碼如下:
git checkout -- bad filename>

原理: git checkout 會(huì)把工作目錄里的文件修改到 Git 之前記錄的某個(gè)狀態(tài)。你可以提供一個(gè)你想返回的分支名或特定 SHA ,或者在缺省情況下,Git 會(huì)認(rèn)為你希望 checkout 的是 HEAD,當(dāng)前 checkout 分支的最后一次 commit。

記?。耗阌眠@種方法“撤銷”的任何修改真的會(huì)完全消失。因?yàn)樗鼈儚膩?lái)沒有被提交過(guò),所以之后 Git 也無(wú)法幫助我們恢復(fù)它們。你要確保自己了解你在這個(gè)操作里扔掉的東西是什么?。ㄒ苍S可以先利用 git diff 確認(rèn)一下)
Git倉(cāng)庫(kù)撤銷至前一次提交時(shí)的狀態(tài)


復(fù)制代碼
代碼如下:
$ git checkout SHA>

“”是你想查看的提交擁有的哈希值Hash Code中前8至10個(gè)字符。 這個(gè)命令會(huì)使HEAD>指針脫離detach,可以讓你在不檢出check out任何分支的情況下查看代碼——脫離HEAD并不像聽上去那么可怕。如果你想在這種情況下提交修改,你可以通過(guò)創(chuàng)建新的分支來(lái)實(shí)現(xiàn):


復(fù)制代碼
代碼如下:
$ git checkout -b SHA>

要想回到當(dāng)前的工作進(jìn)度,只需要檢出check out你之前所在的分支即可。


撤銷最近一次代碼提交
有時(shí)候你可能會(huì)不小心提交了錯(cuò)誤的文件或一開始就遺漏了某些東西。下面這三步操作可以幫助你解決這個(gè)問(wèn)題。

復(fù)制代碼
代碼如下:

$ git reset --soft HEAD~1
# 對(duì)工作文件進(jìn)行必要的更改
$ git add -A .
$ git commit -c ORIG_HEAD

你執(zhí)行第一個(gè)命令時(shí),Git會(huì)將HEAD指針后移到此前的一次提交,之后你才能移動(dòng)文件或作必要的修改。

然后你就可以添加所有的修改,而且當(dāng)你執(zhí)行最后的命令時(shí),Git會(huì)打開你的默認(rèn)文本編輯器,其中會(huì)包含上一次提交時(shí)的信息。如果愿意的話,你可以修改提交信息,或者你也可以在最后的命令中使用-C而不是-c,來(lái)跳過(guò)這一步。


撤銷合并Merge
要想撤銷合并,你可能必須要使用恢復(fù)命令HARD RESET回到上一次提交的狀態(tài)。“合并”所做的工作基本上就是重置索引,更新working tree(工作樹)中的不同文件,即當(dāng)前提交()代碼中與HEAD游標(biāo)所指向代碼之間的不同文件;但是合并會(huì)保留索引與working tree之間的差異部分(例如那些沒有被追蹤的修改)。

復(fù)制代碼
代碼如下:

$ git checkout -b SHA>

在撤銷“本地修改”之后再恢復(fù)

場(chǎng)景: 你提交了幾個(gè) commit,然后用 git reset --hard 撤銷了這些修改(見上一段),接著你又意識(shí)到:你希望還原這些修改!

方法:

復(fù)制代碼
代碼如下:
git reflog

復(fù)制代碼
代碼如下:
git reset

復(fù)制代碼
代碼如下:
git checkout

原理: git reflog 對(duì)于恢復(fù)項(xiàng)目歷史是一個(gè)超棒的資源。你可以恢復(fù)幾乎 任何東西 — 任何你 commit 過(guò)的東西 — 只要通過(guò) reflog。

你可能已經(jīng)熟悉了 git log 命令,它會(huì)顯示 commit 的列表。 git reflog 也是類似的,不過(guò)它顯示的是一個(gè) HEAD 發(fā)生改變的時(shí)間列表.

一些注意事項(xiàng):

它涉及的只是 HEAD 的改變。在你切換分支、用 git commit 進(jìn)行提交、以及用 git reset 撤銷 commit 時(shí),HEAD 會(huì)改變,但當(dāng)你用  git checkout -- bad filename> 撤銷時(shí)(正如我們?cè)谇懊嬷v到的情況),HEAD 并不會(huì)改變 — 如前所述,這些修改從來(lái)沒有被提交過(guò),因此 reflog 也無(wú)法幫助我們恢復(fù)它們。
git reflog 不會(huì)永遠(yuǎn)保持。Git 會(huì)定期清理那些 “用不到的” 對(duì)象。不要指望幾個(gè)月前的提交還一直躺在那里。
你的 reflog 就是你的,只是你的。你不能用 git reflog 來(lái)恢復(fù)另一個(gè)開發(fā)者沒有 push 過(guò)的 commit。


大量的撤銷/恢復(fù)

場(chǎng)景: 你向某個(gè)方向開始實(shí)現(xiàn)一個(gè)特性,但是半路你意識(shí)到另一個(gè)方案更好。你已經(jīng)進(jìn)行了十幾次提交,但你現(xiàn)在只需要其中的一部分。你希望其他不需要的提交統(tǒng)統(tǒng)消失。

方法:

復(fù)制代碼
代碼如下:
git rebase -i earlier SHA>

原理: -i 參數(shù)讓 rebase 進(jìn)入“交互模式”。它開始類似于前面討論的 rebase,但在重新進(jìn)行任何提交之前,它會(huì)暫停下來(lái)并允許你詳細(xì)地修改每個(gè)提交。

rebase -i 會(huì)打開你的缺省文本編輯器,里面列出候選的提交。如下所示:


前面兩列是鍵:第一個(gè)是選定的命令,對(duì)應(yīng)第二列里的 SHA 確定的 commit。缺省情況下, rebase -i  假定每個(gè) commit 都要通過(guò)  pick 命令被運(yùn)用。

要丟棄一個(gè) commit,只要在編輯器里刪除那一行就行了。如果你不再需要項(xiàng)目里的那幾個(gè)錯(cuò)誤的提交,你可以刪除上例中的1、3、4行。

如果你需要保留 commit 的內(nèi)容,而是對(duì) commit 消息進(jìn)行編輯,你可以使用 reword 命令。 把第一列里的 pick 替換為 reword (或者直接用 r)。有人會(huì)覺得在這里直接重寫 commit 消息就行了,但是這樣不管用 —rebase -i 會(huì)忽略 SHA 列前面的任何東西。它后面的文本只是用來(lái)幫助我們記住 0835fe2 是干啥的。當(dāng)你完成 rebase -i 的操作之后,你會(huì)被提示輸入需要編寫的任何 commit 消息。

如果你需要把兩個(gè) commit 合并到一起,你可以使用 squash 或 fixup 命令,如下所示:


squash 和 fixup 會(huì)“向上”合并 — 帶有這兩個(gè)命令的 commit 會(huì)被合并到它的前一個(gè) commit 里。在這個(gè)例子里, 0835fe2 和 6943e85 會(huì)被合并成一個(gè) commit, 38f5e4e 和 af67f82 會(huì)被合并成另一個(gè)。

如果你選擇了 squash, Git 會(huì)提示我們給新合并的 commit 一個(gè)新的 commit 消息; fixup 則會(huì)把合并清單里第一個(gè) commit 的消息直接給新合并的 commit 。 這里,你知道 af67f82 是一個(gè)“完了完了….” 的 commit,所以你會(huì)留著 38f5e4e as的 commit 消息,但你會(huì)給合并了 0835fe2 和 6943e85 的新 commit 編寫一個(gè)新的消息。

在你保存并退出編輯器的時(shí)候,Git 會(huì)按從頂部到底部的順序運(yùn)用你的 commit。你可以通過(guò)在保存前修改 commit 順序來(lái)改變運(yùn)用的順序。如果你愿意,你也可以通過(guò)如下安排把 af67f82 和 0835fe2 合并到一起:

標(biāo)簽:黃石 許昌 隴南 丹東 法律咨詢 荊門 漯河 武漢

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Git中一些撤銷和恢復(fù)命令的使用小結(jié)》,本文關(guān)鍵詞  Git,中,一些,撤銷,和,恢復(fù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Git中一些撤銷和恢復(fù)命令的使用小結(jié)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Git中一些撤銷和恢復(fù)命令的使用小結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章