www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式微處理器
[導(dǎo)讀]來(lái)源:cnblogs.com/zhenbianshu/p/12018714.html 前言 從接觸編程就開(kāi)始使用 Git 進(jìn)行代碼管理,先是自己玩 Github,又在工作中使用 Gitlab,雖然使用時(shí)間挺長(zhǎng),可是也只進(jìn)行一些常用操作,如推拉代碼、提交、合并等,更復(fù)雜的操作沒(méi)有使用過(guò),看過(guò)的教程也逐

來(lái)源:cnblogs.com/zhenbianshu/p/12018714.html

前言

從接觸編程就開(kāi)始使用 Git 進(jìn)行代碼管理,先是自己玩 Github,又在工作中使用 Gitlab,雖然使用時(shí)間挺長(zhǎng),可是也只進(jìn)行一些常用操作,如推拉代碼、提交、合并等,更復(fù)雜的操作沒(méi)有使用過(guò),看過(guò)的教程也逐漸淡忘了,有些對(duì)不起 Linus 大神。
出來(lái)混總是要還的,前些天就遇到了 Git 里一種十分糟心的場(chǎng)景,并為之前沒(méi)有深入理解 Git 命令付出了一下午時(shí)間的代價(jià)。
先介紹一下這種場(chǎng)景,我們一個(gè)項(xiàng)目從 N 版本升到 A 版本時(shí)引入了另一項(xiàng)目的 jar 包,又陸續(xù)發(fā)布了 B、C 版本,但在 C 版本后忽然發(fā)現(xiàn)了 A 版本引入的 jar 包有極大的性能問(wèn)題,B、C 版本都是基于 A 版本發(fā)布的,要修復(fù) jar 包性能問(wèn)題,等 jar 包再發(fā)版還得幾天,可此時(shí)線(xiàn)上又有緊急的 Bug 要修,于是就陷入了進(jìn)退兩難的境地。
最后決定先將代碼回退到 A 版本之前,再基于舊版本修復(fù) Bug,也就開(kāi)始了五個(gè)小時(shí)的受苦之路。

基礎(chǔ)試探

revert

首先肯定的是 revert, git revert commit_id  能產(chǎn)生一個(gè) 與 commit_id 完全相反的提交,即 commit_id 里是添加, revert 提交里就是刪除。
但是使用  git log  查看了提交記錄后,我就打消了這種想法,因?yàn)樘峤淮螖?shù)太多了,中途還有幾次從其他分支的 merge 操作。
”利益于”我們不太干凈的提交記錄,要完成從 C 版本到 N 版本的 revert,我需要倒序執(zhí)行 revert 操作幾十次,如果其中順序錯(cuò)了一次,最終結(jié)果可能就是不對(duì)的。
另外我們知道我們?cè)谶M(jìn)行代碼 merge 時(shí),也會(huì)把 merge 信息產(chǎn)生一次新的提交,而 revert 這次  merge commit  時(shí)需要指定 m 參數(shù),以指定  mainline
這個(gè) mainline 是主線(xiàn),也是我們要保留代碼的主分支,從 feature 分支往 develop 分支合并,或由 develop 分支合并到 master 的提交還好確定,但 feature 分支互相合并時(shí),我哪知道哪個(gè)是主線(xiàn)啊。
所以 revert 的文案被廢棄了。

Reset

然后就考慮  reset  了, reset 也能使代碼回到某次提交,但跟 revert 不同的是, reset 是將提交的 HEAD 指針指到某次提交,之后的提交記錄會(huì)消失,就像從沒(méi)有過(guò)這么一次提交。
但由于我們都在 feature 分支開(kāi)發(fā),我在 feature 分支上將代碼回退到某次提交后,將其合并到 develop 分支時(shí)卻被提示報(bào)錯(cuò)。
這是因?yàn)?feature 分支回退了提交后,在 git 的 workflow 里,feature 分支是落后于 develop 分支的,而合并向 develop 分支,又需要和 develop 分支保持最新的同步,需要將 develop 分支的數(shù)據(jù)合并到 feature 分支上,而合并后,原來(lái)被 reset 的代碼又回來(lái)了。
這個(gè)時(shí)候另一個(gè)可選項(xiàng)是在 master 分支上執(zhí)行 reset,使用  --hard  選項(xiàng)完全拋棄這些舊代碼,reset 后再?gòu)?qiáng)制推到遠(yuǎn)端。
    
master> git  reset --hard commit_id
master> git  push --force origin master
但是還是有問(wèn)題,首先,我們的 master 分支在 gitlab 里是被保護(hù)的,不能使用  force push ,畢竟風(fēng)險(xiǎn)挺大了,萬(wàn)一有人 reset 到最開(kāi)始的提交再?gòu)?qiáng)制 push 的話(huà),雖然可以使用  reflog  恢復(fù),但也是一番折騰。
另外,reset 畢竟太野蠻,我們還是想能保留提交歷史,以后排查問(wèn)題也可以參考。

升級(jí)融合

rebase

只好用搜索引擎繼續(xù)搜索,看到有人提出可以先使用  rebase  把多個(gè)提交合并成一個(gè)提交,再使用 revert 產(chǎn)生一次反提交,這種方法的思路非常清晰,把 revert 和 rebase 兩個(gè)命令搭配得很好,相當(dāng)于使用 revert 回退的升級(jí)版。
先說(shuō)一下 rebase,rebase 是”變基”的意思,這里的”基”,在我理解是指[多次] commit 形成的 git workflow,使用 rebase,我們可以改變這些歷史提交,修改 commit 信息,將多個(gè) commit 進(jìn)行組合。
介紹 rebase 的文檔有很多,我們直接來(lái)說(shuō)用它來(lái)進(jìn)行代碼回退的步驟。
  1. 首先,切出一個(gè)新分支 F,使用 git log 查詢(xún)一下 要回退到 的 commit 版本 N。
  2. 使用命令   git rebase -i N , -i 指定交互模式后,會(huì)打開(kāi) git rebase 編輯界面,形如:
    pick 6fa5869 commit1
    pick 0b84ee7 commit2
    pick 986c6c8 commit3
    pick 91a0dcc commit4
  3. 這些 commit 自舊到新由上而下排列,我們只需要在 commit_id 前添加操作命令即可。

    在合并 commit 這個(gè)需求里,我們可以選擇 pick(p) 最舊的 commit1,然后在后續(xù)的 commit_id 前添加 squash(s) 命令,將這些 commits 都合并到最舊的 commit1 上。

  4. 保存 rebase 結(jié)果后,再編輯 commit 信息,使這次 rebase 失效,git 會(huì)將之前的這些 commit 都刪除,并將其更改合并為一個(gè)新的 commit5

    如果出錯(cuò)了,也可以使用 git rebase --abort/--continue/--edit-todo 對(duì)之前的編輯進(jìn)行撤銷(xiāo)、繼續(xù)編輯。

  5. 這個(gè)時(shí)候,主分支上的提交記錄是  older, commit1, commit2, commit3, commit4
    而 F 分支上的提交記錄是  older, commit5 ,由于 F 分支的祖先節(jié)點(diǎn)是 older,明顯落后于主分支的 commit4,將 F 分支向主分支合并是不允許的

    所以我們需要執(zhí)行 git merge master 將主分支向 F 分支合并,合并后 git 會(huì)發(fā)現(xiàn) commit1 到 commit4 提交的內(nèi)容和 F 分支上 commit5 的修改內(nèi)容是完全相同的,會(huì)自動(dòng)進(jìn)行合并,內(nèi)容不變,但多了一個(gè) commit5。

  6. 再在 F 分支上對(duì) commit5 進(jìn)行一次 revert 反提交,就實(shí)現(xiàn)了把 commit1 到 commit4 的提交全部回退。

這種方法的取巧之處在于巧妙地利用了 rebase 操作歷史提交的功能和 git 識(shí)別修改相同自動(dòng)合并的特性,操作雖然復(fù)雜,但歷史提交保留得還算完整。
rebase 這種修改歷史提交的功能非常實(shí)用,能夠很好地解決我們遇到的一個(gè)小功能提交了好多次才好使,而把 git 歷史弄得亂七八糟的問(wèn)題,只需要注意避免在多人同時(shí)開(kāi)發(fā)的分支使用就行了。
遺憾的是,當(dāng)天我并沒(méi)有理解到 rebase 的這種思想,又由于試了幾個(gè)方法都不行太過(guò)于慌亂,在 rebase 完成后,向主分支合并被拒之后對(duì)這些方式的可行性產(chǎn)生了懷疑,又加上有同事提出聽(tīng)起來(lái)更可行的方式,就中斷了操作。

文件操作

這種更可行的方式就是對(duì)文件操作,然后讓 git 來(lái)識(shí)別變更,具體是:
  1. 從主分支上切出一個(gè)跟主分支完全相同的分支 F。

  2. 從文件管理系統(tǒng)復(fù)制項(xiàng)目文件夾為 bak,在 bak 內(nèi)使用 git checkout N 將代碼切到想要的歷史提交,這時(shí)候 git 會(huì)將 bak 內(nèi)的文件恢復(fù)到 N 狀態(tài)。

  3. 在從文件管理系統(tǒng)內(nèi),將 bak 文件夾下 除了 .git 文件夾下的所有內(nèi)容復(fù)制粘貼到原項(xiàng)目目錄下。git 會(huì)純從文件級(jí)別識(shí)別到變更,然后更新工作區(qū)。

  4. 在原項(xiàng)目目錄下執(zhí)行 add 和 commit,完成反提交。

這種方式的巧妙之處在于利用 git 本身對(duì)文件的識(shí)別,不牽涉到對(duì) workflow 操作。

小結(jié)

最后終于靠著文件操作方式成功完成了代碼回退,事后想來(lái)真是一把心酸淚。
為了讓我的五個(gè)小時(shí)不白費(fèi),復(fù)盤(pán)一下當(dāng)時(shí)的場(chǎng)景,學(xué)習(xí)并總結(jié)一下四種代碼回退的方式:
  • revert 適合需要回退的歷史提交不多,且無(wú)合并沖突的情景。

  • 如果你可以向 master 強(qiáng)推代碼,且想讓 git log 里不再出現(xiàn)被回退代碼的痕跡,可以使用 git reset --hard + git push --force 的方式。

  • 如果你有些 geek,追求用”正規(guī)而正統(tǒng)”的方式來(lái)回退代碼,rebase + revert 滿(mǎn)足你的需求。

  • 如果你不在乎是否優(yōu)雅,想用最簡(jiǎn)單,最直接的方式,文件操作正合適。

git 真的是非常牛逼的代碼管理工具,入手簡(jiǎn)單,三五個(gè)命令組合起來(lái)就足夠完成工作需求,又對(duì) geeker 們非常友好,你想要的騷操作它都支持,學(xué)無(wú)止境啊。
        
            


-END-




推薦閱讀



【01】GitHub 上100個(gè)優(yōu)質(zhì)前端項(xiàng)目整理,非常全面!
【02】這位小姐姐用動(dòng)圖展示了10個(gè)Git命令,看完過(guò)目不忘!
【03】重磅!一次登錄,終身免費(fèi):GitHub宣布向所有人免費(fèi)開(kāi)放所有核心功能
【04】Github上這幾個(gè)沙雕項(xiàng)目,夠我玩三天!
【05】工程師深度:嵌入式項(xiàng)目開(kāi)發(fā)的 Git & GitHub 實(shí)用教程


免責(zé)聲明:整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉