<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【工具】一份值得收藏的 Git 異常處理清單

          共 4353字,需瀏覽 9分鐘

           ·

          2021-03-17 11:28

          本文首發(fā)于政采云前端團(tuán)隊(duì)博客:一份值得收藏的 Git 異常處理清單

          https://www.zoo.team/article/git-exception


          前言

          Git 作為一種分布式版本控制系統(tǒng)已經(jīng)成為現(xiàn)在開發(fā)的寵兒,不僅應(yīng)用在前端、后端、客戶端等開發(fā)場(chǎng)景中,也成為各行業(yè)互聯(lián)網(wǎng)企業(yè)分工協(xié)作的必備技能之一。
          大家在使用過程中總會(huì)碰到這樣那樣的問題,本文主要針對(duì)以下經(jīng)常發(fā)生的幾種異常情況提供一些解決方案:
          1. 本地工作區(qū)文件恢復(fù)

          2. 遠(yuǎn)程分支刪除后,刪除本地分支與其關(guān)聯(lián)

          3. 修改提交時(shí)的備注內(nèi)容

          4. 修改分支名,實(shí)現(xiàn)無縫銜接

          5. 撤回提交

          6. 撤銷本地分支合并

          7. 恢復(fù)誤刪的本地分支

          8. 不確定哪個(gè)分支有自己提交的 commit

          (一)本地工作區(qū)文件恢復(fù)

          大家都知道,一個(gè)文件夾中的文件如果被刪掉了,那只有在垃圾箱里面找了。如果垃圾箱里面的也被刪掉了,以筆者的常識(shí)在不借助工具的情況下怕是就找不到了,emmmm。。。
          不過,關(guān)聯(lián)了 Git 的文件和文件夾就不一樣了,有了本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)的雙重保護(hù),找到一個(gè)被刪除的文件也不過就分分鐘,一個(gè)命令行的事情吧。

          語法git checkout <filename/dirname>

          命令git checkout 1.js

          這一命令主要用于本地工作區(qū)文件的撤回,下圖是一個(gè)工作區(qū)文件被刪除后的完美恢復(fù)過程。

          1.png

          (二)遠(yuǎn)程分支刪除后,刪除本地分支及關(guān)聯(lián)

          為方便分支提交,一般情況下會(huì)用本地命令 git branch --set-upstream-to=origin/master master  建立本地分支與遠(yuǎn)程分支的關(guān)聯(lián),從 master 拉出的分支可以自動(dòng)建立與遠(yuǎn)程已有分支的關(guān)聯(lián),這樣可以很方便的使用 git pull  和  git push 拉取遠(yuǎn)程分支的代碼和將本地分支提交到遠(yuǎn)程。
          Git 遠(yuǎn)程分支刪除之后,本地分支就無法成功推送到遠(yuǎn)程,想要重新建立與遠(yuǎn)程倉(cāng)庫(kù)的關(guān)聯(lián),就需要先刪除其原本的與已刪除的遠(yuǎn)程分支的關(guān)聯(lián)。
          如下圖所示,需要?jiǎng)h除的遠(yuǎn)程分支為 feature/test,使用 git push origin --delete feature/test 刪除掉對(duì)應(yīng)的遠(yuǎn)程分支之后,刪除本地分支關(guān)聯(lián)。
          2(1).png

          語法git branch --unset-upstream <branchname>

          命令git branch --unset-upstream feature/test

          刪除掉關(guān)聯(lián)關(guān)系之后,用 git branch -vv  命令可查看到本地分支與遠(yuǎn)程分支的關(guān)聯(lián)關(guān)系如下圖所示,可觀察到 feature/test 分支已經(jīng)沒有關(guān)聯(lián)的遠(yuǎn)程分支了。

          2(2).png

          (三)修改提交時(shí)的備注內(nèi)容

          平時(shí)提交代碼很多時(shí)候因?yàn)檐娗榫o急,會(huì)在剛提交的時(shí)候填寫了自己不太滿意的備注,但筆者本人有點(diǎn)強(qiáng)迫癥,一定要把它改成想要的樣子咋辦。。。。,不要慌,還是有解決辦法滴!
          想要修改最近一次提交的“修改xxx功能”的備注:
          3(1).png

          語法git commit --amend

          命令git commit --amend
          3(2).png

          使用 git log --pretty=oneline 查看內(nèi)容,發(fā)現(xiàn)已經(jīng)成功修改啦。需要注意的是此項(xiàng)命令會(huì)修改提交時(shí)的commit-id,即會(huì)覆蓋原本的提交,需要謹(jǐn)慎操作。

          (四)修改分支名,實(shí)現(xiàn)無縫銜接

          開發(fā)中的大佬都是擁有極快手速的人,建了個(gè)分支一不小心打錯(cuò)了某個(gè)字母或者兩個(gè)字母打反了,可能就與本意存在較大誤差了,Git 提供一種已經(jīng)拉取了分支,在上面開發(fā)了不少的內(nèi)容,但后來發(fā)現(xiàn)原本拉的分支名字就有問題的修復(fù)方法。
          例如,我們的想新建的分支名為 feature/story-13711,卻寫成了  feature/stor-13711:

          語法git branch -m <oldbranch> <newbranch>

          命令git branch -m feature/stor-13711 feature/story-13711
          4.png

          執(zhí)行完之后發(fā)現(xiàn)文件的工作區(qū)已修改內(nèi)容一點(diǎn)都沒有變化,真正的實(shí)現(xiàn)了無痛過渡,皆大歡喜!

          (五)撤回提交

          日常工作中,可能由于需求變更、或者誤操作等原因需要進(jìn)行提交的撤回:
          如下分析了各種原因撤銷的場(chǎng)景,主要包括:
          • 已將更改交到本地存儲(chǔ),需要撤回提交

          • 用新的提交內(nèi)容替換上一次的提交

          • 本地提交了錯(cuò)誤的文件

          已將更改提交到本地,需要撤回提交

          語法git reset --soft [<commit-id>/HEAD~n>]

          命令git reset --soft HEAD~1

          命令執(zhí)行完成后,查看文件變更記錄,可發(fā)現(xiàn)如下圖所示:

          5(2).png

          文件變更記錄與未提交之前的文件變更記錄是一致的,只是撤銷了 commit 的操作。

          用新的更改替換撤回的更改

          提交之中可能有些地方需要優(yōu)化,我們可以撤銷本次的 commit 以及文件暫存狀態(tài),修改之后再重新添加到暫存區(qū)進(jìn)行提交。

          語法git reset --mixed [<commit-id>/HEAD~n>]

          命令git reset --mixed HEAD~1

          命令執(zhí)行完成后,查看文件變更記錄,可發(fā)現(xiàn)如下圖所示:

          5(3).png

          已變更的文件都未添加到暫存區(qū),撤銷了 commit 和 add 的操作。

          本地提交了錯(cuò)誤的文件

          本地將完全錯(cuò)誤的,本不應(yīng)提交的內(nèi)容提交到了倉(cāng)庫(kù),需要進(jìn)行撤銷,可以使用 --hard 參數(shù)

          語法git reset --hard [<commit-id>/HEAD~n>]

          命令git reset --hard HEAD~1

          命令執(zhí)行完成后,查看文件變更記錄,可發(fā)現(xiàn)如下圖所示:

          5(4).png

          已追蹤文件的變更內(nèi)容都消失了,撤銷了 commit 和 add 的操作,同時(shí)撤銷了本地已追蹤內(nèi)容的修改;未追蹤的內(nèi)容不會(huì)被改變。從上面的效果可以看到,文件的修改都會(huì)被撤銷。-hard  參數(shù)需要謹(jǐn)慎使用。

          (六)撤銷本地分支合并

          實(shí)際操作中,總會(huì)有很多的干擾,導(dǎo)致我們合并了并不該合并的分支到目標(biāo)分支上。解決這種問題的方式有兩種,git resetgit revert。reset 的語法和命令之前已經(jīng)介紹過,不做贅述, revert 的語法和命令和 reset 一致。但是產(chǎn)生的實(shí)際效果會(huì)有不同。
          可以先來看下 revert 操作的實(shí)際效果,合并分支之后的效果如下圖所示:
          6(1).png
          撤銷合并:

          語法git revert <commit-id>

          命令git revert 700920

          下圖為執(zhí)行命令后的效果:

          6(2).png
          經(jīng)過前后對(duì)比可知,revert 執(zhí)行之后會(huì)在原本的記錄中新增一條提交記錄。
          reset 如上 “本地文件撤銷” 例子所述,會(huì)刪除掉原本已有的提交記錄,在合并分支中,會(huì)刪除原本合并分支的記錄。revert 則有不同,會(huì)保留原本合并分支的記錄,并在其上新增一條提交記錄,便于之后有需要仍然能夠回溯到 revert 之前的狀態(tài)。

          從需要提交到遠(yuǎn)程分支的角度來講,reset 能夠“毀尸滅跡”,不讓別人發(fā)現(xiàn)我們?cè)?jīng)錯(cuò)誤的合并過分支(注:多人協(xié)作中,需要謹(jǐn)慎使用);revert 則會(huì)將合并分支和撤回記錄一并顯示在遠(yuǎn)程提交記錄上。

          (七)恢復(fù)誤刪的本地分支

          本地分支拉取之后,由于疏忽被刪除,而且本地的分支并沒有被同步到遠(yuǎn)程分支上,此時(shí)想要恢復(fù)本地分支。

          誤刪的分支為 feature/delete,使用 git reflog 命令可查看到該倉(cāng)庫(kù)下的所有歷史操作,如下圖所示:

          7(1).png

          語法git checkout -b <branch-name> <commit-id>

          命令git checkout -b feature/delete HEAD@{2}

          命令執(zhí)行完成后,分支恢復(fù)到 HEAD@{2} 的快照,即從 master 分支拉取 feature/delete 分支的內(nèi)容,仍然缺少“新增xxx文件”的提交,直接將文件內(nèi)容恢復(fù)到最新的提交內(nèi)容,使用命令 git reset --hard HEAD@{1} 即可實(shí)現(xiàn)硬性覆蓋本地工作區(qū)內(nèi)容的目的。git reflog 命令獲取到的內(nèi)容為本地倉(cāng)庫(kù)所有發(fā)生過的變更,可謂恢復(fù)利器,既可向前追溯,亦可向后調(diào)整,滿滿的時(shí)光追溯器的趕腳啊。。。

          (八)不確定哪個(gè)分支有自己提交的 commit

          工作中會(huì)經(jīng)常碰到一種場(chǎng)景,某個(gè)提交先后合并到了各個(gè)分支上,但后來發(fā)現(xiàn)提交的這個(gè)修改是有問題的,需要排查到底哪個(gè)分支包含這個(gè)提交,然后將其修復(fù)掉。
          需要先確定有問題的提交的 commit-id :
          8(1).png
          然后查看本地所有的分支:
          8(2).png
          可以看到本地有 4 個(gè)分支,本地的分支數(shù)量非人為控制的,在使用狀態(tài)的分支直接刪掉也不合適,分支數(shù)量達(dá)到一定程度,一個(gè)一個(gè)分支查找也不現(xiàn)實(shí)。Git 提供了一種能夠直接通過 commit-id 查找出包含該內(nèi)容分支的命令。

          語法git branch --contains <commit-id>

          命令git branch --contains 700920

          命令執(zhí)行后可以看到包含該問題提交的分支如下圖所示,就可以很方便的在對(duì)應(yīng)分支上修復(fù)內(nèi)容啦。

          8(3).png

          總結(jié)

          本文介紹的是實(shí)際工作場(chǎng)景中可能出現(xiàn)的幾種異常情況及解決方式,希望能夠?qū)Υ蠹矣兴鶐椭?,不足之處敬?qǐng)指正。實(shí)際上現(xiàn)在已經(jīng)有很多 Git 操作對(duì)應(yīng)的工具可以使用,需要明白的是工具中的每個(gè)操作等同于 Git 命令行的哪個(gè)命令,會(huì)有什么樣的結(jié)果,以避免一些不必要發(fā)生的錯(cuò)誤。

          參考文獻(xiàn)

          Git 錯(cuò)誤集錦和修復(fù)方法 (https://www.edureka.co/blog/common-git-mistakes/#pushed)

          Git 中.gitignore的配置語法 (https://www.jianshu.com/p/ea6341224e89)

          git reset 和 git revert (https://juejin.im/post/5b0e5adc6fb9a009d82e4f20)

          歡迎關(guān)注「前端雜貨鋪」,一個(gè)有溫度且致力于前端分享的雜貨鋪

          關(guān)注回復(fù)「加群」,可加入雜貨鋪一起交流學(xué)習(xí)成長(zhǎng)


          瀏覽 28
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产午夜精品久久久 | 免费crm一区二区 | www网站在线观看 | 91干 | 黄色无遮挡亚洲 |