git reset后本地拉取_一份值得收藏的 Git 异常处理清单
本文首發于政采云前端團隊博客:一份值得收藏的 Git 異常處理清單
https://www.zoo.team/article/git-exception前言
Git 作為一種分布式版本控制系統已經成為現在開發的寵兒,不僅應用在前端、后端、客戶端等開發場景中,也成為各行業互聯網企業分工協作的必備技能之一。大家在使用過程中總會碰到這樣那樣的問題,本文主要針對以下經常發生的幾種異常情況提供一些解決方案:本地工作區文件恢復
遠程分支刪除后,刪除本地分支與其關聯
修改提交時的備注內容
修改分支名,實現無縫銜接
撤回提交
撤銷本地分支合并
恢復誤刪的本地分支
不確定哪個分支有自己提交的 commit
(一)本地工作區文件恢復
大家都知道,一個文件夾中的文件如果被刪掉了,那只有在垃圾箱里面找了。如果垃圾箱里面的也被刪掉了,以筆者的常識在不借助工具的情況下怕是就找不到了,emmmm。。。不過,關聯了 Git 的文件和文件夾就不一樣了,有了本地倉庫和遠程倉庫的雙重保護,找到一個被刪除的文件也不過就分分鐘,一個命令行的事情吧。語法:git checkout
命令:git checkout 1.js
這一命令主要用于本地工作區文件的撤回,下圖是一個工作區文件被刪除后的完美恢復過程。
1.png(二)遠程分支刪除后,刪除本地分支及關聯
為方便分支提交,一般情況下會用本地命令 git branch --set-upstream-to=origin/master master ?建立本地分支與遠程分支的關聯,從 master 拉出的分支可以自動建立與遠程已有分支的關聯,這樣可以很方便的使用 git pull ?和 ?git push 拉取遠程分支的代碼和將本地分支提交到遠程。Git 遠程分支刪除之后,本地分支就無法成功推送到遠程,想要重新建立與遠程倉庫的關聯,就需要先刪除其原本的與已刪除的遠程分支的關聯。如下圖所示,需要刪除的遠程分支為 feature/test,使用 git push origin --delete feature/test 刪除掉對應的遠程分支之后,刪除本地分支關聯。2(1).png語法:git branch --unset-upstream
命令:git branch --unset-upstream feature/test
刪除掉關聯關系之后,用 git branch -vv ?命令可查看到本地分支與遠程分支的關聯關系如下圖所示,可觀察到 feature/test 分支已經沒有關聯的遠程分支了。
2(2).png(三)修改提交時的備注內容
平時提交代碼很多時候因為軍情緊急,會在剛提交的時候填寫了自己不太滿意的備注,但筆者本人有點強迫癥,一定要把它改成想要的樣子咋辦。。。。,不要慌,還是有解決辦法滴!想要修改最近一次提交的“修改xxx功能”的備注:3(1).png語法:git commit --amend
命令:git commit --amend3(2).png使用 git log --pretty=oneline 查看內容,發現已經成功修改啦。需要注意的是此項命令會修改提交時的commit-id,即會覆蓋原本的提交,需要謹慎操作。
(四)修改分支名,實現無縫銜接
開發中的大佬都是擁有極快手速的人,建了個分支一不小心打錯了某個字母或者兩個字母打反了,可能就與本意存在較大誤差了,Git 提供一種已經拉取了分支,在上面開發了不少的內容,但后來發現原本拉的分支名字就有問題的修復方法。例如,我們的想新建的分支名為 feature/story-13711,卻寫成了 ?feature/stor-13711:語法:git branch -m
命令:git branch -m feature/stor-13711 feature/story-137114.png執行完之后發現文件的工作區已修改內容一點都沒有變化,真正的實現了無痛過渡,皆大歡喜!
(五)撤回提交
日常工作中,可能由于需求變更、或者誤操作等原因需要進行提交的撤回:如下分析了各種原因撤銷的場景,主要包括:已將更改交到本地存儲,需要撤回提交
用新的提交內容替換上一次的提交
本地提交了錯誤的文件
已將更改提交到本地,需要撤回提交
語法:git reset --soft [/HEAD~n>]
命令:git reset --soft HEAD~1
命令執行完成后,查看文件變更記錄,可發現如下圖所示:
5(2).png文件變更記錄與未提交之前的文件變更記錄是一致的,只是撤銷了 commit 的操作。
用新的更改替換撤回的更改
提交之中可能有些地方需要優化,我們可以撤銷本次的 commit 以及文件暫存狀態,修改之后再重新添加到暫存區進行提交。語法:git reset --mixed [/HEAD~n>]
命令:git reset --mixed HEAD~1
命令執行完成后,查看文件變更記錄,可發現如下圖所示:
5(3).png已變更的文件都未添加到暫存區,撤銷了 commit 和 add 的操作。
本地提交了錯誤的文件
本地將完全錯誤的,本不應提交的內容提交到了倉庫,需要進行撤銷,可以使用 --hard 參數語法:git reset --hard [/HEAD~n>]
命令:git reset --hard HEAD~1
命令執行完成后,查看文件變更記錄,可發現如下圖所示:
5(4).png已追蹤文件的變更內容都消失了,撤銷了 commit 和 add 的操作,同時撤銷了本地已追蹤內容的修改;未追蹤的內容不會被改變。從上面的效果可以看到,文件的修改都會被撤銷。-hard ?參數需要謹慎使用。
(六)撤銷本地分支合并
實際操作中,總會有很多的干擾,導致我們合并了并不該合并的分支到目標分支上。解決這種問題的方式有兩種,git reset 和 git revert。reset 的語法和命令之前已經介紹過,不做贅述, revert 的語法和命令和 reset 一致。但是產生的實際效果會有不同。可以先來看下 revert 操作的實際效果,合并分支之后的效果如下圖所示:6(1).png撤銷合并:語法:git revert
命令:git revert 700920
下圖為執行命令后的效果:
6(2).png經過前后對比可知,revert 執行之后會在原本的記錄中新增一條提交記錄。reset 如上 “本地文件撤銷” 例子所述,會刪除掉原本已有的提交記錄,在合并分支中,會刪除原本合并分支的記錄。revert 則有不同,會保留原本合并分支的記錄,并在其上新增一條提交記錄,便于之后有需要仍然能夠回溯到 revert 之前的狀態。從需要提交到遠程分支的角度來講,reset 能夠“毀尸滅跡”,不讓別人發現我們曾經錯誤的合并過分支(注:多人協作中,需要謹慎使用);revert 則會將合并分支和撤回記錄一并顯示在遠程提交記錄上。
(七)恢復誤刪的本地分支
本地分支拉取之后,由于疏忽被刪除,而且本地的分支并沒有被同步到遠程分支上,此時想要恢復本地分支。誤刪的分支為 feature/delete,使用 git reflog 命令可查看到該倉庫下的所有歷史操作,如下圖所示:
7(1).png語法:git checkout -b
命令:git checkout -b feature/delete HEAD@{2}
命令執行完成后,分支恢復到 HEAD@{2} 的快照,即從 master 分支拉取 feature/delete 分支的內容,仍然缺少“新增xxx文件”的提交,直接將文件內容恢復到最新的提交內容,使用命令 git reset --hard HEAD@{1} 即可實現硬性覆蓋本地工作區內容的目的。git reflog 命令獲取到的內容為本地倉庫所有發生過的變更,可謂恢復利器,既可向前追溯,亦可向后調整,滿滿的時光追溯器的趕腳啊。。。(八)不確定哪個分支有自己提交的 commit
工作中會經常碰到一種場景,某個提交先后合并到了各個分支上,但后來發現提交的這個修改是有問題的,需要排查到底哪個分支包含這個提交,然后將其修復掉。需要先確定有問題的提交的 commit-id :8(1).png然后查看本地所有的分支:8(2).png可以看到本地有 4 個分支,本地的分支數量非人為控制的,在使用狀態的分支直接刪掉也不合適,分支數量達到一定程度,一個一個分支查找也不現實。Git 提供了一種能夠直接通過 commit-id 查找出包含該內容分支的命令。語法:git branch --contains
命令:git branch --contains 700920
命令執行后可以看到包含該問題提交的分支如下圖所示,就可以很方便的在對應分支上修復內容啦。
8(3).png總結
本文介紹的是實際工作場景中可能出現的幾種異常情況及解決方式,希望能夠對大家有所幫助,不足之處敬請指正。實際上現在已經有很多 Git 操作對應的工具可以使用,需要明白的是工具中的每個操作等同于 Git 命令行的哪個命令,會有什么樣的結果,以避免一些不必要發生的錯誤。
參考文獻
Git 錯誤集錦和修復方法 (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)
看完兩件事如果你覺得這篇內容對你挺有啟發,我想邀請你幫我兩件小事1.點個「在看」,讓更多人也能看到這篇內容(點了「在看」,bug -1 ?)2.關注公眾號「政采云前端團隊」,持續為你推送精選好文招賢納士
政采云前端團隊(ZooTeam),一個年輕富有激情和創造力的前端團隊,隸屬于政采云產品研發部,Base 在風景如畫的杭州。團隊現有 50 余個前端小伙伴,平均年齡 27 歲,近 3 成是全棧工程師,妥妥的青年風暴團。成員構成既有來自于阿里、網易的“老”兵,也有浙大、中科大、杭電等校的應屆新人。團隊在日常的業務對接之外,還在物料體系、工程平臺、搭建平臺、性能體驗、云端應用、數據分析及可視化等方向進行技術探索和實戰,推動并落地了一系列的內部技術產品,持續探索前端技術體系的新邊界。如果你想改變一直被事折騰,希望開始能折騰事;如果你想改變一直被告誡需要多些想法,卻無從破局;如果你想改變你有能力去做成那個結果,卻不需要你;如果你想改變你想做成的事需要一個團隊去支撐,但沒你帶人的位置;如果你想改變既定的節奏,將會是“5 年工作時間 3 年工作經驗”;如果你想改變本來悟性不錯,但總是有那一層窗戶紙的模糊… 如果你相信相信的力量,相信平凡人能成就非凡事,相信能遇到更好的自己。如果你希望參與到隨著業務騰飛的過程,親手推動一個有著深入的業務理解、完善的技術體系、技術創造價值、影響力外溢的前端團隊的成長歷程,我覺得我們該聊聊。任何時間,等著你寫點什么,發給 ZooTeam@cai-inc.com
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的git reset后本地拉取_一份值得收藏的 Git 异常处理清单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么merge分支_实战 Git 分支策
- 下一篇: arduino pmw 串口 字符串_E