校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Git里多種撤銷操作的最佳方法

Git里多種撤銷操作的最佳方法

熱門標簽:忻州外呼系統(tǒng)接口對接 醫(yī)院地圖標注 地圖標注和圖片標注 洛陽便宜外呼系統(tǒng)廠家 嘟聲的電銷機器人 滄州智能外呼系統(tǒng)收費 語音平臺系統(tǒng) 電銷機器人怎么收費 湖北穩(wěn)定外呼系統(tǒng)

前言

相信大家都知道任何版本控制系統(tǒng)的一個最有的用特性就是“撤銷 (undo)”你的錯誤操作的能力。在 Git 里,“撤銷” 蘊含了不少略有差別的功能。當你進行一次新的提交的時候,Git 會保存你代碼庫在那個特定時間點的快照;之后,你可以利用 Git 返回到你的項目的一個早期版本。

撤銷一個“已公開”的改變

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

方法: git revert SHA>

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

這是 Git 最安全、最基本的撤銷場景,因為它并不會改變歷史 — 所以你現(xiàn)在可以  git push 新的“反轉(zhuǎn)” commit 來抵消你錯誤提交的 commit。

修正最后一個 commit 消息

場景: 你在最后一條 commit 消息里有個筆誤,已經(jīng)執(zhí)行了 git commit -m "Fxies bug #42",但在 git push 之前你意識到消息應該是 “Fixes bug #42″。

方法: git commit --amend git commit --amend -m "Fixes bug #42"

原理: git commit --amend 會用一個新的 commit 更新并替換最近的 commit ,這個新的 commit 會把任何修改內(nèi)容和上一個 commit 的內(nèi)容結(jié)合起來。如果當前沒有提出任何修改,這個操作就只會把上次的 commit 消息重寫一遍。

撤銷“本地的”修改

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

方法: git checkout -- bad filename>

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

記住:你用這種方法“撤銷”的任何修改真的會完全消失。因為它們從來沒有被提交過,所以之后 Git 也無法幫助我們恢復它們。你要確保自己了解你在這個操作里扔掉的東西是什么!(也許可以先利用 git diff 確認一下)

重置“本地的”修改

場景: 你在本地提交了一些東西(還沒有 push),但是所有這些東西都很糟糕,你希望撤銷前面的三次提交 — 就像它們從來沒有發(fā)生過一樣。

方法: git reset last good SHA>git reset --hard last good SHA>

原理: git reset 會把你的代碼庫歷史返回到指定的 SHA 狀態(tài)。 這樣就像是這些提交從來沒有發(fā)生過。缺省情況下, git reset 會保留工作目錄。這樣,提交是沒有了,但是修改內(nèi)容還在磁盤上。這是一種安全的選擇,但通常我們會希望一步就“撤銷”提交以及修改內(nèi)容 — 這就是 --hard 選項的功能。

在撤銷“本地修改”之后再恢復

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

方法: git reflog 和 git reset git checkout

原理: git reflog 對于恢復項目歷史是一個超棒的資源。你可以恢復幾乎 任何東西 — 任何你 commit 過的東西 — 只要通過 reflog。

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

一些注意事項:

      它涉及的只是 HEAD 的改變。在你切換分支、用 git commit 進行提交、以及用 git reset 撤銷 commit 時,HEAD 會改變,但當你用  git checkout -- bad filename> 撤銷時(正如我們在前面講到的情況),HEAD 并不會改變 — 如前所述,這些修改從來沒有被提交過,因此 reflog 也無法幫助我們恢復它們。

      git reflog 不會永遠保持。Git 會定期清理那些 “用不到的” 對象。不要指望幾個月前的提交還一直躺在那里。

      你的 reflog 就是你的,只是你的。你不能用 git reflog 來恢復另一個開發(fā)者沒有 push 過的 commit。
reflog

那么…你怎么利用 reflog 來“恢復”之前“撤銷”的 commit 呢?

它取決于你想做到的到底是什么:

     如果你希望準確地恢復項目的歷史到某個時間點,用 git reset --hard SHA>

     如果你希望重建工作目錄里的一個或多個文件,讓它們恢復到某個時間點的狀態(tài),用 git checkout SHA> -- filename>

     如果你希望把這些 commit 里的某一個重新提交到你的代碼庫里,用 git cherry-pick SHA>

利用分支的另一種做法

場景: 你進行了一些提交,然后意識到你開始 check out 的是 master 分支。你希望這些提交進到另一個特性(feature)分支里。

方法: git branch feature, git reset --hard origin/master, and git checkout feature

原理: 你可能習慣了用 git checkout -b name> 創(chuàng)建新的分支 — 這是創(chuàng)建新分支并馬上 check out 的流行捷徑 — 但是你不希望馬上切換分支。這里, git branch feature 創(chuàng)建一個叫做 feature 的新分支并指向你最近的 commit,但還是讓你 check out 在 master 分支上。

下一步,在提交任何新的 commit 之前,用 git reset --hard 把 master 分支倒回 origin/master 。不過別擔心,那些 commit 還在 feature 分支里。

最后,用 git checkout 切換到新的 feature 分支,并且讓你最近所有的工作成果都完好無損。

及時分支,省去繁瑣

場景: 你在 master 分支的基礎上創(chuàng)建了 feature 分支,但 master 分支已經(jīng)滯后于 origin/master 很多。現(xiàn)在 master 分支已經(jīng)和 origin/master 同步,你希望在 feature 上的提交是從現(xiàn)在開始,而不是也從滯后很多的地方開始。

方法: git checkout feature git rebase master

原理: 要達到這個效果,你本來可以通過 git reset (不加 --hard, 這樣可以在磁盤上保留修改) 和 git checkout -b new branch name> 然后再重新提交修改,不過這樣做的話,你就會失去提交歷史。我們有更好的辦法。

git rebase master 會做如下的事情:

     首先它會找到你當前 check out 的分支和 master 分支的共同祖先。

     然后它 reset 當前  check out 的分支到那個共同祖先,在一個臨時保存區(qū)存放所有之前的提交。

     然后它把當前 check out 的分支提到 master 的末尾部分,并從臨時保存區(qū)重新把存放的 commit 提交到 master 分支的最后一個 commit 之后。

大量的撤銷/恢復

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

方法: git rebase -i earlier SHA>

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

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

前面兩列是鍵:第一個是選定的命令,對應第二列里的 SHA 確定的 commit。缺省情況下, rebase -i  假定每個 commit 都要通過  pick 命令被運用。

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

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

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

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

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

在你保存并退出編輯器的時候,Git 會按從頂部到底部的順序運用你的 commit。你可以通過在保存前修改 commit 順序來改變運用的順序。如果你愿意,你也可以通過如下安排把 af67f82 和 0835fe2 合并到一起:

修復更早期的 commit

場景: 你在一個更早期的 commit 里忘記了加入一個文件,如果更早的 commit 能包含這個忘記的文件就太棒了。你還沒有 push,但這個 commit 不是最近的,所以你沒法用 commit --amend.

方法: git commit --squash SHA of the earlier commit>git rebase --autosquash -i even earlier SHA>

原理: git commit --squash 會創(chuàng)建一個新的 commit ,它帶有一個 commit 消息,類似于 squash! Earlier commit。 (你也可以手工創(chuàng)建一個帶有類似 commit 消息的 commit,但是 commit --squash 可以幫你省下輸入的工作。)

如果你不想被提示為新合并的 commit 輸入一條新的 commit 消息,你也可以利用 git commit --fixup 。在這個情況下,你很可能會用commit --fixup ,因為你只是希望在 rebase 的時候使用早期 commit 的 commit 消息。

rebase --autosquash -i  會激活一個交互式的 rebase 編輯器,但是編輯器打開的時候,在 commit 清單里任何 squash! 和 fixup! 的 commit 都已經(jīng)配對到目標 commit 上了,如下所示:

在使用 --squash 和 --fixup 的時候,你可能不記得想要修正的 commit 的 SHA 了— 只記得它是前面第 1 個或第 5 個 commit。你會發(fā)現(xiàn) Git 的 ^ 和 ~ 操作符特別好用。HEAD^ 是 HEAD 的前一個 commit。 HEAD~4 是 HEAD 往前第 4 個 – 或者一起算,倒數(shù)第 5 個 commit。

停止追蹤一個文件

場景: 你偶然把 application.log 加到代碼庫里了,現(xiàn)在每次你運行應用,Git 都會報告在 application.log 里有未提交的修改。你把 *.login 放到了 .gitignore 文件里,可文件還是在代碼庫里 — 你怎么才能告訴 Git “撤銷” 對這個文件的追蹤呢?

方法: git rm --cached application.log

原理: 雖然 .gitignore 會阻止 Git 追蹤文件的修改,甚至不關注文件是否存在,但這只是針對那些以前從來沒有追蹤過的文件。一旦有個文件被加入并提交了,Git 就會持續(xù)關注該文件的改變。類似地,如果你利用 git add -f 來強制或覆蓋了 .gitignore, Git 還會持續(xù)追蹤改變的情況。之后你就不必用-f  來添加這個文件了。

如果你希望從 Git 的追蹤對象中刪除那個本應忽略的文件, git rm --cached 會從追蹤對象中刪除它,但讓文件在磁盤上保持原封不動。因為現(xiàn)在它已經(jīng)被忽略了,你在  git status 里就不會再看見這個文件,也不會再偶然提交該文件的修改了。

總結(jié)

以上這就是如何在 Git 里撤銷任何操作的方法,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

您可能感興趣的文章:
  • 簡單談談Git中的回滾操作
  • git 刪除分支和回滾的實例詳解
  • Git 撤銷操作、刪除文件和恢復文件
  • 基于Git的常用撤銷技巧與解決沖突方法(推薦)
  • Git使用小技巧之回滾與撤銷詳解

標簽:防城港 宜賓 定州 巴彥淖爾 內(nèi)蒙古 96 日照 山南

巨人網(wǎng)絡通訊聲明:本文標題《Git里多種撤銷操作的最佳方法》,本文關鍵詞  Git,里,多種,撤銷,操作,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關。
  • 相關文章
  • 下面列出與本文章《Git里多種撤銷操作的最佳方法》相關的同類信息!
  • 本頁收集關于Git里多種撤銷操作的最佳方法的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产成人精品影视| 久久综合九色综合97_久久久| 蜜臀99久久精品久久久久久软件| 中文字幕一区二区三区四区 | 精品国产三级a在线观看| 欧美日韩一本到| 欧美日韩国产大片| 欧美精品第1页| 欧美成人高清电影在线| 精品成a人在线观看| 久久久久国产精品麻豆| 国产精品视频一二| 亚洲精品日产精品乱码不卡| 亚洲激情中文1区| 裸体一区二区三区| 国产91精品欧美| 91亚洲资源网| 91麻豆精品国产91久久久久久| 一级中文字幕一区二区| 久久99国产精品久久99 | 色哟哟亚洲精品| 欧美亚一区二区| 26uuu成人网一区二区三区| 亚洲欧美偷拍三级| 激情欧美一区二区| 精品视频免费看| 国产精品沙发午睡系列990531| 亚洲综合在线五月| 国产成人精品影院| 欧美一区二区三区视频在线| 国产精品精品国产色婷婷| 久久超碰97中文字幕| 色综合久久综合网97色综合 | 国产成人精品亚洲午夜麻豆| 欧美性色综合网| 一区二区成人在线| 91丨九色丨国产丨porny| 国产亚洲精品精华液| 国产原创一区二区三区| 日韩一区二区三区高清免费看看 | 99久久er热在这里只有精品15 | 不卡一区二区中文字幕| 日韩欧美电影一区| 九九国产精品视频| 久久婷婷国产综合精品青草| 麻豆一区二区在线| 精品成人一区二区三区四区| 精品一区二区三区不卡 | 精品亚洲国产成人av制服丝袜| 7777精品伊人久久久大香线蕉最新版| 亚洲日本va在线观看| 99r国产精品| 一区二区三区四区乱视频| 91激情五月电影| 日韩黄色免费网站| xfplay精品久久| 99久久久国产精品| 视频一区视频二区中文| 日韩欧美一级二级三级久久久| 国产乱色国产精品免费视频| 亚洲国产精品ⅴa在线观看| 一本大道久久a久久综合| 亚洲成年人网站在线观看| 精品少妇一区二区三区免费观看 | 一区二区久久久久久| 精品国产污污免费网站入口 | 久久国产剧场电影| 亚洲欧美激情在线| 国产性色一区二区| 欧美日本一道本在线视频| 久99久精品视频免费观看| 国产精品国产三级国产aⅴ中文 | 欧美日韩精品一区二区三区四区 | 久久久电影一区二区三区| 91麻豆精品在线观看| 国产美女视频一区| 日本三级韩国三级欧美三级| 国产精品国产三级国产a| 久久一二三国产| 欧美精品久久一区| 欧美日韩aaa| 亚洲一区中文在线| 91精品在线麻豆| 国产一区二区三区蝌蚪| 日韩高清不卡一区| 午夜精品久久久久久久久久久| 国产无人区一区二区三区| 国产欧美一区二区三区在线老狼| 这里只有精品99re| 欧美吻胸吃奶大尺度电影 | 中文字幕在线观看不卡| 欧美韩国日本不卡| 国产精品国产馆在线真实露脸| 337p粉嫩大胆噜噜噜噜噜91av | 日韩精品每日更新| 麻豆国产91在线播放| 韩国成人在线视频| 不卡视频在线观看| 精品污污网站免费看| 欧美精品1区2区3区| 337p日本欧洲亚洲大胆精品| 欧美国产一区二区| 亚洲精品亚洲人成人网| 日韩精品午夜视频| 久久超碰97中文字幕| 97精品国产露脸对白| 欧美日韩1234| 亚洲国产岛国毛片在线| 亚洲制服欧美中文字幕中文字幕| 亚洲 欧美综合在线网络| 国产综合久久久久久久久久久久| 成人精品视频一区二区三区| 欧美视频在线一区二区三区| 日韩欧美一区在线观看| 中文字幕中文字幕在线一区| 秋霞电影网一区二区| 成人激情小说乱人伦| 正在播放亚洲一区| 亚洲国产精品一区二区尤物区| 高清视频一区二区| 日韩视频免费观看高清完整版 | 在线视频亚洲一区| 欧美国产日韩a欧美在线观看 | 欧美一区二区三区免费在线看| 国产精品久久久久一区二区三区共| 日本亚洲视频在线| 欧美视频完全免费看| 亚洲精品国产精品乱码不99| 风间由美中文字幕在线看视频国产欧美| 在线日韩av片| 亚洲国产精品久久不卡毛片| 在线视频国产一区| 日韩综合小视频| 91精品国产91久久久久久最新毛片 | 久久久午夜精品| 亚洲国产人成综合网站| 在线观看区一区二| 偷窥少妇高潮呻吟av久久免费| 欧美性猛交xxxxxxxx| 亚洲午夜精品在线| 日韩视频123| 国产成人免费视频一区| 中文字幕视频一区| 色老头久久综合| 裸体歌舞表演一区二区| 国产日产欧美一区二区三区| www.在线欧美| 婷婷成人综合网| 中文幕一区二区三区久久蜜桃| 色婷婷久久久综合中文字幕| 日本欧美韩国一区三区| 精品福利一二区| 欧美性高清videossexo| 久久99精品久久久久婷婷| 亚洲视频一区在线| 日韩精品中文字幕一区二区三区| 成人国产亚洲欧美成人综合网| 亚洲乱码国产乱码精品精98午夜 | 亚洲福中文字幕伊人影院| 国产麻豆午夜三级精品| 亚洲精品视频在线| 久久久777精品电影网影网 | 国产精品初高中害羞小美女文| 欧美日韩一区二区三区在线看| 国产**成人网毛片九色| 国产精品66部| 欧美一区二区三区在线观看 | 3d成人动漫网站| 一区二区三区精品久久久| 日韩精品一区二区三区三区免费| 99精品国产视频| 国产精品资源网| 蓝色福利精品导航| 奇米精品一区二区三区在线观看一| 2014亚洲片线观看视频免费| 日韩三级在线观看| 欧美一区二区在线看| 欧美日本高清视频在线观看| 色妞www精品视频| 91网站最新地址| 91福利精品第一导航| 一本色道久久综合亚洲aⅴ蜜桃| www.亚洲色图.com| av一区二区三区| 在线观看不卡视频| 欧美日韩另类国产亚洲欧美一级| 欧美人狂配大交3d怪物一区| 欧美日韩国产大片| 久久亚洲综合色一区二区三区| 久久夜色精品国产噜噜av| 国产精品欧美一区喷水| 亚洲最新视频在线播放| 日本va欧美va精品发布| 国产精品自在在线| 91浏览器在线视频| 精品国产亚洲在线| 亚洲综合清纯丝袜自拍| 蜜桃久久久久久久| 91在线看国产| 欧美精品一区二区三区蜜桃|