hey guys 大家好 我是Eric 歡迎收聽前端輕鬆聊
這是一個講前端大小事和我在北美工作經驗分享的頻道
如果你覺得這有幫助到你 請幫我五星留言 follow twitter 推廣給其他也在努力的朋友們
上禮拜最大的科技新聞大概就是Meta放出了新的app叫Threads感覺是個文字版的Instagram但對原本Twitter使用者來說應該很簡單
簡單來說就是micro blogging 想到什麼就可以說 文字簡短讓人可以很好的閱讀 對proof reading沒有很大的要求
你可以 actually 你只能用instagram登入 登入完後會問你要不要follow原本在Instagram就有follow的人
我可以想像大部分人大概就是直接import所有人
所以當天除了有beta test的人 直接followers數量突破邊界
那現在上面除了自己follow的人都會推一些其他網紅明星這些我不care的人
Threads官方有說未來會更新algorithm給你比較personalized recommendation
相信之後看到的會比較是我們會想看到的
至於要怎麼用就看個人怎麼摸索了然後未來Meta想拿這個平台做什麼 發展如何 我們就靜觀其變了
回到正題吧
今天講講Git 很多人可能聽過但不清楚這是做什麼的而且這東西還常常出現在job description裡面
Git是一個軟體業常常使用的版本控制工具
當team變大的時候 每個人都在更改code更改檔案 要怎麼確保這份文件這個code是最新版本的
git可以幫我們保存這些更動紀錄而有了這些我們也可以在debug的途中很快的了解可能是哪一個文件的哪一行有問題
如果deploy之後發現問題我們也可以很快的把我們的application回復到上一版我們知道沒問題的版本
在Git還沒出來以前 很多人是在本地端把code寫好之後 整個資料夾複製然後開新的檔名比如version 2
這只有一個人做事的時候或許可以用而且也簡單
但當你一直複製的時候 可想而知的是檔案會越來越大
放在現在這麼做的話 你可能會有好幾個一模一樣的 node_modules
而我們也知道 node_modules
很肥
而且當人多的時候 你可能會把這個放在一個共用的資料夾上但除非你檔案一個一個複製貼上 要不然遲早會出現誰寫的覆蓋誰的
我們有時候也會想要知道這些code為什麼被加上去的和被誰更改的
單純的檔案複製貼上的話 除非有試用特殊工具要不然你可能只會知道上一個人是誰更新了這個檔案和什麼時候
但這不一定代表這一行肯定是上一個人加的
我們當然可以寫comment 但如果一個feature碰了很多地方
也不太可能每個地方都寫comment
然後當你想要比對這兩個版本差別在哪裡的時候可能就很頭大了
找到每一個動過的檔案和找到哪一行不一樣這時間成本是不切實際的
在2005年,Linux的創辦人遇到類似的問題,尤其Linux系統是有很多人一起寫code構建的,所以需要一個可以支援large scale又能有非常好的效能,所以他自己寫了一個,感覺這樣的人都是神,想要什麼,外面沒有,自己搞一個。
有了git之後你可以隨時查看過去哪裡做了更動 什麼時候改的 為了什麼改的 是誰改的
當多人一起工作的時候大家可以一個feature開一個所謂的分支
你可能會有一個main branch 就是主要的code 從這個時間點複製一份到你自己的分支中
你把你該做的feature在你的分支上做完之後
我們會開一個 pull request 或 merge request 簡稱 PR 或 MR
這PR會讓其他人看過做code review 看看你的code是不是哪裡需要改進或是有什麼沒注意到的地方需要處理和修正
當approve之後這個PR就可以被merge進去main branch
也就是說你寫的code就會被合併到main
未來大家從main分支出來時候也會有你寫的code
當他們查看log時候也會看到你什麼時候寫這些code的
如果合併 merge過程中發現你改的code和別人改的code是大概同一個區域的
就會發生conflict 這時候你做為最後一個merge的人需要resolve 這個 git conflict
聽起來很可怕但就是怎麼把你的和最新的共存而已
市面上有很多不同的git網站
最廣為人知的就是github 再來還有bitbucket gitlab等等
功能都大同小異 主要功能就是一個地方讓你存放你的code還有剛才說提到的這些分支
有些還有自帶CI/CD功能 當你的code被merge之後要做什麼之類的
也可以在上面設定有誰才可以動這些code or repository
這邊講一下常用的git指令
git init 就是初始化你的git repo 會在你當前directory設定一個.git資料夾 裡面會包含應該把code push到哪裡去 過去的log 還有已經checkout的branch
如果你需要下載一個既有的project那你可以git clone把那個repo下載下來
當在你local下載好repo後你可以用git checkout 或 git switch來切換和開新的branch
當你code寫的差不多時候 用 git add把你做的更動框起來
用git commit寫上一個message描述一下這個改動是什麼
順便講一下 Angular team他們有自己一套怎麼寫commit message的規範稱作conventional commits
後來被很多人廣泛使用因為可以很好的讀log加上用其他工具可以自動生成changelog
我會在show notes裡面放這連結然後之後在twitter和threads分享
git commit之後我們要把這些code放到某個地方裡
最害怕的事情就是你commit之後但沒有push然後地震停電電腦壞了
那等於沒寫 因為commit之後這些change還是只有在你local上
我們用git push把剛才做的改動push到server上的repo
在你們常用的網站比如github開PR PR被approve之後github會自動做git merge到main branch或是你指定的branch
其他command還有git pull就是local從這個server 或是 origin抓新的更動
其實git pull是git fetch 加上 git merge
git fetch會把更動資料這個訊息抓下來但不會馬上更新你現在的code
然後我常用的還有git stash 當你覺得這些code還沒完成一段落當需要還branch什麼的 你可以git stash暫時把這些更動存在local上
資料夾裡面的東西不代表都要commit進你的repo裡 有些敏感資料比如一些API key或是像node_modules這類很大的東西我們不需要放到repo上面我們可以開一個新的文件叫.gitignore
裡面寫文件的路徑 路徑上的都不會被git抓change也不會被commit進repo
為什麼API key不要commit呢 我push新的commit把那檔案刪掉不就行了
git本身的目的是把這些操作歷史紀錄保留下來 如果commit了但還沒push那還可以刪掉
但若push上去了就有記錄在了 就算刪掉了 如果有其他人已經pull了你這麼做就來不及了
目前很多公司比如OpenAI會偵測API key是不是被push到repo上 如果是的話會自動deactivate
你也不會想到api key被人亂用然後付錢的是你吧
返回來講 git 重要嗎
現在大部分公司都會使用到git來做多人協作寫code的需求
就算不用git也會有一套類似的流程來做code的管理和code review的環節
做有名的例子就是google自己寫了一套做這些事
所以若照工作時候你不會git其實我覺得滿扣分的
除了這是基本工具以外也會說明你可能沒有在需要多人協作場合下工作過
所以就算沒有也要知道一下git怎麼用