點解我哋要用Git?


GitHub Flow。

呢個係一個關於開發嘅恐怖故事,亦係古老所傳承落黎嘅詛咒。
話說呢排因為公司有個大型活動,我同設計部門一齊去整個註冊頁面。正當我諗住修改返其中一頁嘅資料嗰陣,發現入面啲Javascript無晒反應。瀏覽器報唔到錯,咁我唯有自己每個位都試下改。最後發現...居然係設計師嗰邊改動咗個檔案所以成個網頁死咗!好恐怖呀!

...好啦,咁樣聽落一啲都唔恐怖。不過,如果啲檔案無辦法還原嘅話,咁就真係好恐怖啦,因為你根本無從還原,唔知點樣改先可以令到個網頁郁得返。幾年前,Git / Subversion等版本控制程式仲未盛行,甚至未出現嘅時候,我哋能夠做嘅就係幫成份專案做backup。可能係幫一個檔案改名做filename.ext.bak,可能係將成個project zip起做一個archive。前者會加大你嘅專案大細,而後者就有機會將你一啲唔用嘅測試碼都塞埋入去。當你要幫個專案瘦身嗰陣,某程度上都幾費時失事。

如果你唔係自己一個人做晒所有嘢,而係同其他人合作就更容易出事。就算團隊入面得你一個係編程嘅,你團隊嘅設計師都有機會郁你嘅Javascript,因為有唔少嘅視覺效果唔能夠單靠CSS / SASS等語言去做出黎。新專案還好,因為你哋可以協調啲檔案分返開唔好撞埋一齊;舊專案嘅話就有機會要改同一個檔案,從而出事。有做backup都好,假如做得太忘我而唔記得備份,咁你都唔知點返轉頭好...

我喺前公司做嘢嗰陣,舊同事教我用Git同GitLab。基本上,如果你只係諗住俾自己做版本控制嘅話,你唔駛去諗GitHub定GitLab。當然,如果你要同團隊合作搞掂個專案,有個remote Git server係最好嘅。作為初學者,你只需要記住以下幾個指令就可以好簡單咁做到版本控制。

git init //將你所在嘅資料夾變成一個git repository。
git add -p {filename} //以問答形式去決定需要儲存嘅更改,並儲入暫定儲存庫。無指定檔案嘅話就會將所有已經改變嘅檔案拎晒黎問。
git add . //將所有改變嘅檔案或者新增嘅檔案直接加入暫定儲存庫。
git rm {filename} //移除repository內嘅檔案。如果係資料夾就要加上-r嘅flag去進行recursive remove。
git commit -m "{message}" //將暫定儲存庫入面嘅檔案正式列入更新(commit)。輸入message可以為該更新寫入更新訊息,例如更新內容等。
git reset HEAD {filename} //將暫定儲存庫嘅檔案回溯返去未修改前嘅版本。
git branch //可以睇到repository包含咗幾多分支。如果輸入"git branch -D {branch}"就會刪除指定嘅分支。
git checkout -- {filename} //回溯未儲存入更新嘅檔案返去原本狀態。
git checkout {branch} //轉換分支。如果打算開新嘅分支就需要落-b嘅flag。
git checkout {commit SHA} //將repository轉換到某個特定嘅更新。每個更新都由一個SHA-1嘅編碼組成。
git merge {branch} //以Fast-forward嘅形式將指定分支嵌入目前分支中。如果需要指定Non-fast-forward,需要加入-no-ff嘅flag。
git tag -a "{tag}" -m "{message}" //為目前嘅分支加入標籤。

仲有其他好似git cherry-pick或者git commit -a等,又或者咩叫fast-forward等,甚至關於remote git repository嘅嘢可以搵下Git嘅官方文件架。

睇到呢堆指令,其實就會明白只要每次更動後就做好啲commit,記得更新前先轉換分支以避免改動咗原本版本嘅話,就唔怕出現問題啦。不過,編程者之間可能都需要改動同一個檔案。如果佢哋可能一個喺底加新嘢,一個改動上面或者中間啲嘢都還好;如果一齊改動咗同一條代碼咁點算?都唔緊要,Git有conflict嘅機制。

Conflict marker。

當合併分支嗰陣,有可能遇上相同檔案但改動咗唔同嘢嘅狀況。呢個時候,合併就會失敗,亦會喺檔案上加上衝突嘅位置,包括兩個分支嘅代碼等。你要做嘅就係修改返呢個位置並重新進行合併,咁就成功啦。

如果遲下有時間就講下remote git啦。 w

Powered by Half-moon Production.

Copyright © 2011-2020 by 泣雨家的雜物房. Version 1.5.2.

點解我哋要用Git?


GitHub Flow。

呢個係一個關於開發嘅恐怖故事,亦係古老所傳承落黎嘅詛咒。
話說呢排因為公司有個大型活動,我同設計部門一齊去整個註冊頁面。正當我諗住修改返其中一頁嘅資料嗰陣,發現入面啲Javascript無晒反應。瀏覽器報唔到錯,咁我唯有自己每個位都試下改。最後發現...居然係設計師嗰邊改動咗個檔案所以成個網頁死咗!好恐怖呀!

...好啦,咁樣聽落一啲都唔恐怖。不過,如果啲檔案無辦法還原嘅話,咁就真係好恐怖啦,因為你根本無從還原,唔知點樣改先可以令到個網頁郁得返。幾年前,Git / Subversion等版本控制程式仲未盛行,甚至未出現嘅時候,我哋能夠做嘅就係幫成份專案做backup。可能係幫一個檔案改名做filename.ext.bak,可能係將成個project zip起做一個archive。前者會加大你嘅專案大細,而後者就有機會將你一啲唔用嘅測試碼都塞埋入去。當你要幫個專案瘦身嗰陣,某程度上都幾費時失事。

如果你唔係自己一個人做晒所有嘢,而係同其他人合作就更容易出事。就算團隊入面得你一個係編程嘅,你團隊嘅設計師都有機會郁你嘅Javascript,因為有唔少嘅視覺效果唔能夠單靠CSS / SASS等語言去做出黎。新專案還好,因為你哋可以協調啲檔案分返開唔好撞埋一齊;舊專案嘅話就有機會要改同一個檔案,從而出事。有做backup都好,假如做得太忘我而唔記得備份,咁你都唔知點返轉頭好...

我喺前公司做嘢嗰陣,舊同事教我用Git同GitLab。基本上,如果你只係諗住俾自己做版本控制嘅話,你唔駛去諗GitHub定GitLab。當然,如果你要同團隊合作搞掂個專案,有個remote Git server係最好嘅。作為初學者,你只需要記住以下幾個指令就可以好簡單咁做到版本控制。

git init //將你所在嘅資料夾變成一個git repository。
git add -p {filename} //以問答形式去決定需要儲存嘅更改,並儲入暫定儲存庫。無指定檔案嘅話就會將所有已經改變嘅檔案拎晒黎問。
git add . //將所有改變嘅檔案或者新增嘅檔案直接加入暫定儲存庫。
git rm {filename} //移除repository內嘅檔案。如果係資料夾就要加上-r嘅flag去進行recursive remove。
git commit -m "{message}" //將暫定儲存庫入面嘅檔案正式列入更新(commit)。輸入message可以為該更新寫入更新訊息,例如更新內容等。
git reset HEAD {filename} //將暫定儲存庫嘅檔案回溯返去未修改前嘅版本。
git branch //可以睇到repository包含咗幾多分支。如果輸入"git branch -D {branch}"就會刪除指定嘅分支。
git checkout -- {filename} //回溯未儲存入更新嘅檔案返去原本狀態。
git checkout {branch} //轉換分支。如果打算開新嘅分支就需要落-b嘅flag。
git checkout {commit SHA} //將repository轉換到某個特定嘅更新。每個更新都由一個SHA-1嘅編碼組成。
git merge {branch} //以Fast-forward嘅形式將指定分支嵌入目前分支中。如果需要指定Non-fast-forward,需要加入-no-ff嘅flag。
git tag -a "{tag}" -m "{message}" //為目前嘅分支加入標籤。

仲有其他好似git cherry-pick或者git commit -a等,又或者咩叫fast-forward等,甚至關於remote git repository嘅嘢可以搵下Git嘅官方文件架。

睇到呢堆指令,其實就會明白只要每次更動後就做好啲commit,記得更新前先轉換分支以避免改動咗原本版本嘅話,就唔怕出現問題啦。不過,編程者之間可能都需要改動同一個檔案。如果佢哋可能一個喺底加新嘢,一個改動上面或者中間啲嘢都還好;如果一齊改動咗同一條代碼咁點算?都唔緊要,Git有conflict嘅機制。

Conflict marker。

當合併分支嗰陣,有可能遇上相同檔案但改動咗唔同嘢嘅狀況。呢個時候,合併就會失敗,亦會喺檔案上加上衝突嘅位置,包括兩個分支嘅代碼等。你要做嘅就係修改返呢個位置並重新進行合併,咁就成功啦。

如果遲下有時間就講下remote git啦。 w