[導讀]來源:cnblogs.com/zhenbianshu/p/12018714.html 前言 從接觸編程就開始使用 Git 進行代碼管理,先是自己玩 Github,又在工作中使用 Gitlab,雖然使用時間挺長,可是也只進行一些常用操作,如推拉代碼、提交、合并等,更復雜的操作沒有使用過,看過的教程也逐
來源:cnblogs.com/zhenbianshu/p/12018714.html
前言
從接觸編程就開始使用 Git 進行代碼管理,先是自己玩 Github,又在工作中使用 Gitlab,雖然使用時間挺長,可是也只進行一些常用操作,如推拉代碼、提交、合并等,更復雜的操作沒有使用過,看過的教程也逐漸淡忘了,有些對不起 Linus 大神。
出來混總是要還的,前些天就遇到了 Git 里一種十分糟心的場景,并為之前沒有深入理解 Git 命令付出了一下午時間的代價。
先介紹一下這種場景,我們一個項目從 N 版本升到 A 版本時引入了另一項目的 jar 包,又陸續(xù)發(fā)布了 B、C 版本,但在 C 版本后忽然發(fā)現(xiàn)了 A 版本引入的 jar 包有極大的性能問題,B、C 版本都是基于 A 版本發(fā)布的,要修復 jar 包性能問題,等 jar 包再發(fā)版還得幾天,可此時線上又有緊急的 Bug 要修,于是就陷入了進退兩難的境地。
最后決定先將代碼回退到 A 版本之前,再基于舊版本修復 Bug,也就開始了五個小時的受苦之路。
基礎試探
revert
首先肯定的是 revert,
git revert commit_id
能產(chǎn)生一個 與 commit_id 完全相反的提交,即 commit_id 里是添加, revert 提交里就是刪除。
但是使用
git log
查看了提交記錄后,我就打消了這種想法,因為提交次數(shù)太多了,中途還有幾次從其他分支的 merge 操作。
”利益于”我們不太干凈的提交記錄,要完成從 C 版本到 N 版本的 revert,我需要倒序執(zhí)行 revert 操作幾十次,如果其中順序錯了一次,最終結果可能就是不對的。
另外我們知道我們在進行代碼 merge 時,也會把 merge 信息產(chǎn)生一次新的提交,而 revert 這次
merge commit
時需要指定 m 參數(shù),以指定
mainline
這個 mainline 是主線,也是我們要保留代碼的主分支,從 feature 分支往 develop 分支合并,或由 develop 分支合并到 master 的提交還好確定,但 feature 分支互相合并時,我哪知道哪個是主線啊。
Reset
然后就考慮
reset
了, reset 也能使代碼回到某次提交,但跟 revert 不同的是, reset 是將提交的 HEAD 指針指到某次提交,之后的提交記錄會消失,就像從沒有過這么一次提交。
但由于我們都在 feature 分支開發(fā),我在 feature 分支上將代碼回退到某次提交后,將其合并到 develop 分支時卻被提示報錯。
這是因為 feature 分支回退了提交后,在 git 的 workflow 里,feature 分支是落后于 develop 分支的,而合并向 develop 分支,又需要和 develop 分支保持最新的同步,需要將 develop 分支的數(shù)據(jù)合并到 feature 分支上,而合并后,原來被 reset 的代碼又回來了。
這個時候另一個可選項是在 master 分支上執(zhí)行 reset,使用
--hard
選項完全拋棄這些舊代碼,reset 后再強制推到遠端。
master> git
reset --hard commit_id
master> git
push --force origin master
但是還是有問題,首先,我們的 master 分支在 gitlab 里是被保護的,不能使用
force push
,畢竟風險挺大了,萬一有人 reset 到最開始的提交再強制 push 的話,雖然可以使用
reflog
恢復,但也是一番折騰。
另外,reset 畢竟太野蠻,我們還是想能保留提交歷史,以后排查問題也可以參考。
升級融合
rebase
只好用搜索引擎繼續(xù)搜索,看到有人提出可以先使用
rebase
把多個提交合并成一個提交,再使用 revert 產(chǎn)生一次反提交,這種方法的思路非常清晰,把 revert 和 rebase 兩個命令搭配得很好,相當于使用 revert 回退的升級版。
先說一下 rebase,rebase 是”變基”的意思,這里的”基”,在我理解是指[多次] commit 形成的 git workflow,使用 rebase,我們可以改變這些歷史提交,修改 commit 信息,將多個 commit 進行組合。
介紹 rebase 的文檔有很多,我們直接來說用它來進行代碼回退的步驟。
-
首先,切出一個新分支 F,使用 git log 查詢一下
要回退到
的 commit 版本 N。
-
使用命令
git rebase -i N
, -i 指定交互模式后,會打開 git rebase 編輯界面,形如:
pick 6fa5869 commit1
pick 0b84ee7 commit2
pick 986c6c8 commit3
pick 91a0dcc commit4
這些 commit 自舊到新由上而下排列,我們只需要在 commit_id 前添加操作命令即可。
在合并 commit 這個需求里,我們可以選擇 pick(p) 最舊的 commit1,然后在后續(xù)的 commit_id 前添加 squash(s) 命令,將這些 commits 都合并到最舊的 commit1 上。
-
保存 rebase 結果后,再編輯 commit 信息,使這次 rebase 失效,git 會將之前的這些 commit 都刪除,并將其更改合并為一個新的 commit5
如果出錯了,也可以使用 git rebase --abort/--continue/--edit-todo 對之前的編輯進行撤銷、繼續(xù)編輯。
-
這個時候,主分支上的提交記錄是
older, commit1, commit2, commit3, commit4
而 F 分支上的提交記錄是
older, commit5
,由于 F 分支的祖先節(jié)點是 older,明顯落后于主分支的 commit4,將 F 分支向主分支合并是不允許的
所以我們需要執(zhí)行 git merge master 將主分支向 F 分支合并,合并后 git 會發(fā)現(xiàn) commit1 到 commit4 提交的內容和 F 分支上 commit5 的修改內容是完全相同的,會自動進行合并,內容不變,但多了一個 commit5。
再在 F 分支上對 commit5 進行一次 revert 反提交,就實現(xiàn)了把 commit1 到 commit4 的提交全部回退。
這種方法的取巧之處在于巧妙地利用了 rebase 操作歷史提交的功能和 git 識別修改相同自動合并的特性,操作雖然復雜,但歷史提交保留得還算完整。
rebase 這種修改歷史提交的功能非常實用,能夠很好地解決我們遇到的一個小功能提交了好多次才好使,而把 git 歷史弄得亂七八糟的問題,只需要注意避免在多人同時開發(fā)的分支使用就行了。
遺憾的是,當天我并沒有理解到 rebase 的這種思想,又由于試了幾個方法都不行太過于慌亂,在 rebase 完成后,向主分支合并被拒之后對這些方式的可行性產(chǎn)生了懷疑,又加上有同事提出聽起來更可行的方式,就中斷了操作。
文件操作
這種更可行的方式就是對文件操作,然后讓 git 來識別變更,具體是:
從主分支上切出一個跟主分支完全相同的分支 F。
從文件管理系統(tǒng)復制項目文件夾為 bak,在 bak 內使用 git checkout N 將代碼切到想要的歷史提交,這時候 git 會將 bak 內的文件恢復到 N 狀態(tài)。
在從文件管理系統(tǒng)內,將 bak 文件夾下 除了 .git 文件夾下的所有內容復制粘貼到原項目目錄下。git 會純從文件級別識別到變更,然后更新工作區(qū)。
在原項目目錄下執(zhí)行 add 和 commit,完成反提交。
這種方式的巧妙之處在于利用 git 本身對文件的識別,不牽涉到對 workflow 操作。
小結
最后終于靠著文件操作方式成功完成了代碼回退,事后想來真是一把心酸淚。
為了讓我的五個小時不白費,復盤一下當時的場景,學習并總結一下四種代碼回退的方式:
revert 適合需要回退的歷史提交不多,且無合并沖突的情景。
如果你可以向 master 強推代碼,且想讓 git log 里不再出現(xiàn)被回退代碼的痕跡,可以使用 git reset --hard + git push --force 的方式。
如果你有些 geek,追求用”正規(guī)而正統(tǒng)”的方式來回退代碼,rebase + revert 滿足你的需求。
如果你不在乎是否優(yōu)雅,想用最簡單,最直接的方式,文件操作正合適。
git 真的是非常牛逼的代碼管理工具,入手簡單,三五個命令組合起來就足夠完成工作需求,又對 geeker 們非常友好,你想要的騷操作它都支持,學無止境啊。
-END-
免責聲明:整理文章為傳播相關技術,版權歸原作者所有,如有侵權,請聯(lián)系刪除
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!
掃描二維碼,關注更多精彩內容
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。
關鍵字:
驅動電源
在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。
關鍵字:
工業(yè)電機
驅動電源
LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...
關鍵字:
驅動電源
照明系統(tǒng)
散熱
根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。
關鍵字:
LED
設計
驅動電源
電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...
關鍵字:
電動汽車
新能源
驅動電源
在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...
關鍵字:
發(fā)光二極管
驅動電源
LED
在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...
關鍵字:
LED照明技術
電磁干擾
驅動電源
開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源
關鍵字:
LED
驅動電源
開關電源
LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。
關鍵字:
LED
隧道燈
驅動電源
LED驅動電源在LED照明系統(tǒng)中扮演著至關重要的角色。由于LED具有節(jié)能、環(huán)保、長壽命等優(yōu)點,使得LED照明在各個領域得到廣泛應用。然而,LED的電流、電壓特性需要特定的驅動電源才能正常工作。本文將介紹常用的LED驅動電...
關鍵字:
LED驅動電源
led照明
LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電源轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。
關鍵字:
LED
驅動電源
高壓工頻交流
種種跡象都在表明,半導體行業(yè)或已提前進入寒冬時期,越來越多的廠商開始扛不住了……
關鍵字:
LED
半導體
驅動電源
崧盛股份9日發(fā)布投資者關系活動記錄表,就植物照明發(fā)展趨勢、行業(yè)壁壘等問題進行分享。植物照明未來市場需求廣闊崧盛股份指出,植物照明將會走向長期產(chǎn)業(yè)領域。主要原因有三:第一,LED植物照明賦能終端種植更具有經(jīng)濟價值。由于LE...
關鍵字:
崧盛股份
驅動電源
在當今高度發(fā)展的技術中,電子產(chǎn)品的升級越來越快,LED燈技術也在不斷發(fā)展,這使我們的城市變得豐富多彩。 LED驅動電源將電源轉換為特定的電壓和電流,以驅動LED發(fā)光。通常情況下:LED驅動電源的輸入包括高壓工頻交流電(即...
關鍵字:
LED
驅動電源
高壓直流
人類社會的進步離不開社會上各行各業(yè)的努力,各種各樣的電子產(chǎn)品的更新?lián)Q代離不開我們的設計者的努力,其實很多人并不會去了解電子產(chǎn)品的組成,比如LED電源。
關鍵字:
LED
驅動電源
低壓直流
隨著科學技術的發(fā)展,LED技術也在不斷發(fā)展,為我們的生活帶來各種便利,為我們提供各種各樣生活信息,造福著我們人類。LED驅動電源實際上是一種電源,但是它是一種特定的電源,用于驅動LED發(fā)射帶有電壓或電流的光。 因此,LE...
關鍵字:
LED
驅動電源
電流
LED燈作為一種新型節(jié)能和無污染光源,由于其特有的發(fā)光照明特性,在現(xiàn)代照明應用中發(fā)揮著革命性的作用。作為 LED 照明產(chǎn)業(yè)鏈中最為核心的部件之一,LED 驅動電源的驅動控制技術所存在的可靠性低、成本高等典型問題一直制約著...
關鍵字:
多路
LED
驅動電源
隨著社會的快速發(fā)展,LED技術也在飛速發(fā)展,為我們的城市的燈光煥發(fā)光彩,讓我們的生活越來越有趣,那么你知道LED需要LED驅動電源嗎?那么你知道什么是LED驅動電源嗎?
關鍵字:
LED
開關電源
驅動電源
早前有新聞稱,Cree在2018年開始宣布轉型高科技半導體領域,并一邊逐漸脫離照明與LED相關業(yè)務,一邊持續(xù)投資半導體。在今日,Cree宣布與SMART Global Holdings, Inc.達成最終協(xié)議,擬將LED...
關鍵字:
cree
led照明