第 54 篇原創好文~
本文首發於政採雲前端團隊博客: 一份值得收藏的 Git 異常處理清單
Git 做爲一種分佈式版本控制系統已經成爲如今開發的寵兒,不只應用在前端、後端、客戶端等開發場景中,也成爲各行業互聯網企業分工協做的必備技能之一。前端
你們在使用過程當中總會碰到這樣那樣的問題,本文主要針對如下常常發生的幾種異常狀況提供一些解決方案:git
你們都知道,一個文件夾中的文件若是被刪掉了,那只有在垃圾箱裏面找了。若是垃圾箱裏面的也被刪掉了,以筆者的常識在不借助工具的狀況下怕是就找不到了,emmmm。。。後端
不過,關聯了 Git 的文件和文件夾就不同了,有了本地倉庫和遠程倉庫的雙重保護,找到一個被刪除的文件也不過就分分鐘,一個命令行的事情吧。分佈式
語法:git checkout <filename/dirname>
工具
命令:git checkout 1.js
post
這一命令主要用於本地工做區文件的撤回,下圖是一個工做區文件被刪除後的完美恢復過程。性能
爲方便分支提交,通常狀況下會用本地命令 git branch --set-upstream-to=origin/master master
創建本地分支與遠程分支的關聯,從 master 拉出的分支能夠自動創建與遠程已有分支的關聯,這樣能夠很方便的使用 git pull
和 git push
拉取遠程分支的代碼和將本地分支提交到遠程。優化
Git 遠程分支刪除以後,本地分支就沒法成功推送到遠程,想要從新創建與遠程倉庫的關聯,就須要先刪除其本來的與已刪除的遠程分支的關聯。spa
以下圖所示,須要刪除的遠程分支爲 feature/test,使用 git push origin --delete feature/test
刪除掉對應的遠程分支以後,刪除本地分支關聯。命令行
語法:git branch --unset-upstream <branchname>
命令:git branch --unset-upstream feature/test
刪除掉關聯關係以後,用 git branch -vv
命令可查看到本地分支與遠程分支的關聯關係以下圖所示,可觀察到 feature/test 分支已經沒有關聯的遠程分支了。
平時提交代碼不少時候由於軍情緊急,會在剛提交的時候填寫了本身不太滿意的備註,但筆者本人有點強迫症,必定要把它改爲想要的樣子咋辦。。。。,不要慌,仍是有解決辦法滴!
想要修改最近一次提交的「修改xxx功能」的備註:
語法:git commit --amend
命令:git commit --amend
使用 git log --pretty=oneline
查看內容,發現已經成功修改啦。須要注意的是此項命令會修改提交時的commit-id,即會覆蓋本來的提交,須要謹慎操做。
開發中的大佬都是擁有極快手速的人,建了個分支一不當心打錯了某個字母或者兩個字母打反了,可能就與本意存在較大偏差了,Git 提供一種已經拉取了分支,在上面開發了很多的內容,但後來發現本來拉的分支名字就有問題的修復方法。
例如,咱們的想新建的分支名爲 feature/story-13711,卻寫成了 feature/stor-13711:
語法:git branch -m <oldbranch> <newbranch>
命令:git branch -m feature/stor-13711 feature/story-13711
執行完以後發現文件的工做區已修改內容一點都沒有變化,真正的實現了無痛過渡,皆大歡喜!
平常工做中,可能因爲需求變動、或者誤操做等緣由須要進行提交的撤回:
以下分析了各類緣由撤銷的場景,主要包括:
語法: git reset --soft [<commit-id>/HEAD~n>]
命令:git reset --soft HEAD~1
命令執行完成後,查看文件變動記錄,可發現以下圖所示:
文件變動記錄與未提交以前的文件變動記錄是一致的,只是撤銷了 commit 的操做。
提交之中可能有些地方須要優化,咱們能夠撤銷本次的 commit 以及文件暫存狀態,修改以後再從新添加到暫存區進行提交。
語法: git reset --mixed [<commit-id>/HEAD~n>]
命令:git reset --mixed HEAD~1
命令執行完成後,查看文件變動記錄,可發現以下圖所示:
已變動的文件都未添加到暫存區,撤銷了 commit 和 add 的操做。
本地將徹底錯誤的,本不該提交的內容提交到了倉庫,須要進行撤銷,可使用 --hard 參數
語法: git reset --hard [<commit-id>/HEAD~n>]
命令:git reset --hard HEAD~1
命令執行完成後,查看文件變動記錄,可發現以下圖所示:
已追蹤文件的變動內容都消失了,撤銷了 commit 和 add 的操做,同時撤銷了本地已追蹤內容的修改;未追蹤的內容不會被改變。從上面的效果能夠看到,文件的修改都會被撤銷。-hard 參數須要謹慎使用。
實際操做中,總會有不少的干擾,致使咱們合併了並不應合併的分支到目標分支上。解決這種問題的方式有兩種,git reset
和 git revert
。 reset 的語法和命令以前已經介紹過,不作贅述, revert 的語法和命令和 reset 一致。可是產生的實際效果會有不一樣。
能夠先來看下 revert 操做的實際效果,合併分支以後的效果以下圖所示:
撤銷合併:
語法:git revert <commit-id>
命令:git revert 700920
下圖爲執行命令後的效果:
通過先後對比可知,revert 執行以後會在本來的記錄中新增一條提交記錄。
reset 如上 「本地文件撤銷」 例子所述,會刪除掉本來已有的提交記錄,在合併分支中,會刪除本來合併分支的記錄。revert 則有不一樣,會保留本來合併分支的記錄,並在其上新增一條提交記錄,便於以後有須要仍然可以回溯到 revert 以前的狀態。
從須要提交到遠程分支的角度來說,reset 可以「毀屍滅跡」,不讓別人發現咱們曾經錯誤的合併過度支(注:多人協做中,須要謹慎使用);revert 則會將合併分支和撤回記錄一併顯示在遠程提交記錄上。
本地分支拉取以後,因爲疏忽被刪除,並且本地的分支並無被同步到遠程分支上,此時想要恢復本地分支。
誤刪的分支爲 feature/delete,使用 git reflog
命令可查看到該倉庫下的全部歷史操做,以下圖所示:
語法:git checkout -b <branch-name> <commit-id>
命令:git checkout -b feature/delete HEAD@{2}
命令執行完成後,分支恢復到 HEAD@{2} 的快照,即從 master 分支拉取 feature/delete 分支的內容,仍然缺乏「新增xxx文件」的提交,直接將文件內容恢復到最新的提交內容,使用命令 git reset --hard HEAD@{1}
便可實現硬性覆蓋本地工做區內容的目的。git reflog
命令獲取到的內容爲本地倉庫全部發生過的變動,可謂恢復利器,既可向前追溯,亦可向後調整,滿滿的時光追溯器的趕腳啊。。。
工做中會常常碰到一種場景,某個提交前後合併到了各個分支上,但後來發現提交的這個修改是有問題的,須要排查到底哪一個分支包含這個提交,而後將其修復掉。
須要先肯定有問題的提交的 commit-id :
而後查看本地全部的分支:
能夠看到本地有 4 個分支,本地的分支數量非人爲控制的,在使用狀態的分支直接刪掉也不合適,分支數量達到必定程度,一個一個分支查找也不現實。Git 提供了一種可以直接經過 commit-id 查找出包含該內容分支的命令。
語法:git branch --contains <commit-id>
命令:git branch --contains 700920
命令執行後能夠看到包含該問題提交的分支以下圖所示,就能夠很方便的在對應分支上修復內容啦。
本文介紹的是實際工做場景中可能出現的幾種異常狀況及解決方式,但願可以對你們有所幫助,不足之處敬請指正。實際上如今已經有不少 Git 操做對應的工具可使用,須要明白的是工具中的每一個操做等同於 Git 命令行的哪一個命令,會有什麼樣的結果,以免一些沒必要要發生的錯誤。
政採雲前端團隊(ZooTeam),一個年輕富有激情和創造力的前端團隊,隸屬於政採雲產品研發部,Base 在風景如畫的杭州。團隊現有 50 餘個前端小夥伴,平均年齡 27 歲,近 3 成是全棧工程師,妥妥的青年風暴團。成員構成既有來自於阿里、網易的「老」兵,也有浙大、中科大、杭電等校的應屆新人。團隊在平常的業務對接以外,還在物料體系、工程平臺、搭建平臺、性能體驗、雲端應用、數據分析及可視化等方向進行技術探索和實戰,推進並落地了一系列的內部技術產品,持續探索前端技術體系的新邊界。
若是你想改變一直被事折騰,但願開始能折騰事;若是你想改變一直被告誡須要多些想法,卻無從破局;若是你想改變你有能力去作成那個結果,卻不須要你;若是你想改變你想作成的事須要一個團隊去支撐,但沒你帶人的位置;若是你想改變既定的節奏,將會是「5 年工做時間 3 年工做經驗」;若是你想改變原本悟性不錯,但老是有那一層窗戶紙的模糊… 若是你相信相信的力量,相信平凡人能成就非凡事,相信能遇到更好的本身。若是你但願參與到隨着業務騰飛的過程,親手推進一個有着深刻的業務理解、完善的技術體系、技術創造價值、影響力外溢的前端團隊的成長曆程,我以爲咱們該聊聊。任什麼時候間,等着你寫點什麼,發給 ZooTeam@cai-inc.com