前言

多人共同開發的專案,有時我們需要開發新功能,同時又要修 Bug,可能主程式也要不斷維護開發,我們需要同步進行以加速開發,這時我們通常會從主 branch(通常預設為 master)開出一個新的 branch 來開發,當完成所要開發的新功能或完成 bug 的修正時,就可以將這個 branch merge 回主 branch,因此使用 git branch 在軟體開發上是非常重要的技能。

git branch

使用 git branch 可以列出所有的 branch 並告訴你目前正在哪個 branch:

$ git branch
  dev
* master

假設要再開一個 bug-fix 的 branch,就可以使用以下指令來開 branch:

$ git branch bug-fix

若要刪除 branch 則使用 git branch -d 來刪除,-D 則為強制刪除

$ git branch -d bug-fix

git checkout

目前我們已有多個 branch,我們可以使用 git checkout 來切換 branch:

$ git checkout dev

git merge

當我們在 branch 完成工作之後,就要將更新的程式碼 merge 回主 branch,這時請先回到主 branch:

$ git checkout master

然後再使用 git merge 來將要 merge 的 branch merge 進去主 branch,比如將 dev merge 進 master:

$ git merge dev

conflict 的處理

有時我們 merge 時會產生 conflict,其實如果兩個人同時在相同的 branch 修改相同一行程式碼也會產生 conflict,總之使用版本控制系統應該幾乎都會碰到 conflict,所以處理 conflict 也是相當重要的。

產生 conflict 的時候 <<<<<<<<<< HEAD 到 ========== 的區域是目前你所要 commit 內容,而從 =========== 到 >>>>>>>>>>> dev 則是你要合併的 dev branch 的內容,總之就是將這一段 conflict 修正成你要的結果,然後再將這個修正 commit 上去就可以了。

發生 confict 時的處理步驟大概就是這樣:

  1. 找到 confict 的檔案,修改成你要的結果。
  2. 使用 git add . 將處理好的檔案加入 stage。
  3. git commit 提交合併訊息。

###結語

以上是一些 Git Branch 的簡易使用教學,但我平常用還是用 GUI 比較多,個人推薦 Github 出品的 GUI 工具,用 Github 的 Client Merge 超簡單的!工具只要簡單易用就好了,不太需要什麼複雜的功能啊。

Github GUI Client 下載:

前言

版本控制一直是軟體開發中非常重要的工具,而 Git 與 Subversion、CVS 不同的地方在於 Subversion 及 CVS 是屬於 Centralized VCS,Centralized VCS 的共同缺點是做什麼事都要跟伺服器連線,這樣開發會比較慢,且只要伺服器壞掉,就無法工作了。

Git 則屬於分散式版本控制系統,讓本地端也維護完整的 Repository,即使沒網路,照常可以 commit 和看 history log,伺服器的 Repository 可以在將來有網路連線時再同步更新。

安裝設定 Git

Github 上有各大平台完整的安裝及設定教學,建議直接參照這個教學來設定就可以了。

其中請特別注意設定好提交者的 name 及 Email,Git 會記錄每個 commit 是由誰提交的,這在版本控制上是很重要的資訊。

我們可以使用以下的指令來進行設定:(–global 表示是全域設定)

$ git config --global user.name "Fukuball Lin"
$ git config --global user.email "[email protected]"

設定完成後可以用以下指令來觀察是否有設定完成

$ git config --list
user.name=fukuball
[email protected]

git init

當 Git 安裝設定好之後,就可以開始使用 Git 版本控制了,假設現在你有一個 Hello-World 的資料夾,那在這個資料夾底下下以下指令就可以開啟一個 Git Repository:

$ git init
Initialized empty Git repository in /Users/fukuball/Projects/Hello-World/.git/

請注意開啟 Git Repository 之後只是在自己的 local 端開啟了一個版本控制資料庫,雖然可以正常在 local 端進行所有版本控制的功能,但因還未連結至 Git Server,他人並無法加入共同開發。

目前比較紅的 Git Server 服務就是使用 Github 了,Github 上也有完整的教學說明如何開 Git Repository,並連結至 Github 上的 Git Server 服務。

git clone

當團隊中有人已開啟了一個在 Git Server 上的 Git Repository,那我們就可以使用 Git clone 來將這個 Repository 抓來自己的 local 端一起進行開發。

首先找到 Git Repository 的位址:

git path

使用以下指令進行 Clone:

$ git clone https://github.com/fukuball/Hello-World.git

特別注意如果有寫入權限的話(被加入成Collaborators),就可以用 SSH 協定 Clone 下來:

$ git clone [email protected]:fukuball/Hello-World.git

使用 SSH Clone 會比較方便,可以不必每次都輸入帳號密碼,但需要事先綁定 SSH Key,如何綁定 SSH Key 在 Github 上也有完整的教學

git status

我們可以使用 git status 來觀察 Git Repository 的狀態,比如目前所在的 branch 及 哪些檔案還沒 commit 等等。

$ git status
# On branch master
nothing to commit, working directory clean

git add (stage)

使用 git add 可以將新增檔案加入 git 版本控制,但我通常就直接使用 git add . 來將所有剛剛修改過或新增加的檔案一次 Add 進 stage 狀態,大部份人不推薦這樣做,認為太暴力,但既然都有版本控制系統了,我個人習慣就不這麼婆婆媽媽的了。

$ git add .

git commit (commit)

stage 狀態的檔案的下一步就是準備提交了,一個 commit 在 Git 中就是一個節點,這些 commit 的節點就是未來可以回朔及追蹤的參考。當檔案都加入到 stage 了,那就可以使用以下指令來 commit:

$ git commit -m "這次 commit 的適當描述"

每個 commit 有個適當的描述是非常重要的,這樣要回朔時會比較容易查找。

當還有檔案沒有進 stage 就下 commit 指令,那就不能 commit,這時可使用 git commit -a -m 這樣的暴力法來一次加入檔案至 stage 然後進行 commit,大部份人不建議這麼做,但我個人習慣不這麼婆婆媽媽。

$ git commit -a -m "這次 commit 的適當描述"

git push

當已經連結了 Git Server,就可以用 git push 來將 local 端的 commit 更新到 Server 上,請注意有修改的檔案還沒 commit 那就無法使用 git push,所以一定要將所有更新都 commit 之後,才有辦法使用 git push。

$ git push

git pull

當已經連結了 Git Server,我們就可以使用 git pull 來將遠端更新的 code 抓回來,同樣如果 local 端有任何更新,一定都要 commit 之後才 有辦法使用 git pull。

$ git pull

git log

我們可以使用 git log 的指令查看過去 commit 的紀錄,例如 commit 的版號、作者等等。

$ git log

.gitigore

log 檔及 build 出來的檔案及系統產生的檔案如 .DS_Store 等等,我們並不需要 commit 上去 Repository,所以我們會在 Repository 編寫一個 .gitignore 文字檔來忽略這些檔案。

範例 .gitigore 如下:

.DS_Store
*.log

結語

以上是一些 Git 指令的簡易使用教學,但我平常用還是用 GUI 比較多,個人推薦 Github 出品的 GUI 工具,工具只要簡單易用就好了,不太需要什麼複雜的功能啊。

Github GUI Client 下載:

Sublime Text 2 好用的地方在於它有許多方便的快捷鍵,當然已經有人整理出這些方便的快捷鍵(請參考:Sublime Text 2 – Useful Shortcuts (Mac OS X)),而我這篇主要是分享我個人常用的,其他冷門的快捷鍵其實不用浪費我們的腦容量去記。

符號說明:

  • ⌘ 為俗稱的蘋果鍵
  • ⇧ 為 shift 鍵
  • ⌃ 為 control 鍵
  • ⌥ 為 option/alt 鍵

以下是我常用的快捷鍵列表:

一般

⌘R 跳至某個 method
⌘⇧P 開啟 Sublime Text 的命令列
⌃ ` 開啟 python console

編輯

⌘L 全選所在行,連續按則往下繼續選下一行
⌘D 全選所在單字,連續按則往下繼續選相同單字,可以一次同時編輯所有選擇的單字
⌃⇧M 選擇花刮號裡所有內容
⌃M 跳至相配對的花刮號
⌃⇧K 刪除所在行,連續按則往下繼續刪下一行
⌘Z 復原
⌘⇧Z 反復原
⌘⌥ + 滑鼠選擇 可以垂直選擇

尋找/取代

⌘F 尋找
⌘⌥F 取代
⌘⇧F 在整個 Project 尋找/取代

使用文字編輯器撰寫程式碼的時候,第一步就是要挑整適合於自己使用的編輯環境,在 Sublime Text 2 裡只要使用快捷鍵 ⌘, 就可以開啟設定頁面,然後就可以依照個人使用情況來做調整啦~

以下是我目前的 Sublime Text 2 設定值,大家可以參考看看

{
    "font_size": 18.0,
    "ignored_packages":
    [
        "Vintage"
    ],
    "tab_size": 4,
    "translate_tabs_to_spaces": true,
    "highlight_line": true,
    "trim_trailing_white_space_on_save": true
}

我將 font_size 設成 18,這樣對眼睛比較好,畢竟要長時間看程式碼,還是大一點的字型比較好。

另外,Sublime Text 可以透過 Vintage 這個內建的 package 提供 vi 模擬模式,讓使用者可以使用 vi 的指令模式來操作 Sublime Text,由於我個人不熟悉 vi,所以就在 ignored_packages 將這個 packeage ignore 掉,其實 Sublime Text 一開始預設就是 ignore 這個 package 的,畢竟都已經使用 Sublime Text 了,要使用 vi 就使用真正的 vi 吧。

tab_size 我是設成 4,其實之前我都是使用 3,但實在太多 open source 的 project 都是使用 4,只好改變我的習慣。

translate_tabs_to_spaces 設成 true 可以將 tab 都轉成空白,這樣使用別人的 code 比較不會造成排版亂掉(如果大家的 tab_size 不同的話)。

highlight_line 設成 true 可以讓游標所在的行高亮顯示,一樣是為了自己的眼睛好,當然要設成 true。

trim_trailing_white_space_on_save 設成 ture,可以在儲存檔案時自動將多餘的空白去除掉,有時行末多餘的空白可能會造成一些奇怪的問題,就讓 Sublime Text 來幫我們把關吧~

首先在開 AWS EC2 之前,應該會先取得一組 Private Key,請好好保存這組 Private Key,它會是個 .pem 或 .cer 檔。

開啓 Terminal 之後,請用以下指令登入 AWS EC2:

Step 1:更改 Private Key 檔案權限

$chmod 600 path/to/private-key.pem

Step 2:使用 SSH 登入 AWS EC2

$ssh -i path/to/private-key.pem [email protected]

這樣應該就可以順利登入 AWS EC2 了,其中 Step 1 只要執行過一次就可以了,簡單。

ice dog

某天騎車的時候突然很懷念小時候養蠶寶寶的時光,看著蠶寶寶成長茁壯,慢慢從小小隻變得肥滋滋的,然後再結成繭、變成蛹,最後蛻變成蛾,而養蠶寶寶最令人期待的就是當牠們變成蛾交配產卵的時刻,一切就是這麼的自然,讓人感到生命的生生不息。天真的小時候總是這麼企盼著。

正當懷念著這天真的小時候,突然有種莫名的既視感。

將生物放在盒子裡看牠們交配,這句乍看之下非常不人道的句子,用在養蠶寶寶這樣生物養成觀察的例子上似乎再正常不過,而電影人工進化裡也有這樣的一幕。

人工進化電影中生化工程師克萊夫與艾爾莎,成功地在實驗室中製造出了一個富含高蛋白的生命體(就是圖片中的肉球),期盼未來將可能解決人類的多項疾病,在他們完成了一些階段性目標時,實驗室決定舉行一場公開展示來公開他們的研究成果。

公開展示的時候,實驗室將一公一母的高蛋白生命體放在一個盒子裡,讓這兩個高蛋白生命體來個運命中浪漫的相遇,為了戲劇效果,他們甚至用了一些浪漫的話語來介紹這兩團肉球,搭配上浪漫的音樂,讓所有的觀眾都沈浸在浪漫的氣氛裡面,觀眾們一致發出讚嘆的聲音!

一切就是這麼的美好。兩團肉球在人類扮演上帝的時候誕生了,而人類上帝又讓牠們相遇,期待牠們相愛、交配,生下牠們愛的結晶。即使你在看前面這句話的時候,似乎有那麼點覺得怪怪的,但仔細一想,這似乎跟我們小時候期待著蠶寶寶的蛾交配產卵那樣的單純。當觀眾為這兩團肉球發出讚嘆的歡呼聲時,我真心覺得他們就是單純著期待著生命美好的那一刻。

當然,電影的下一幕不是那麼美好,高蛋白生命體性別狀態並不穩定,因此原本雌性的肉球突然變性成雄性,於是美好的戀情竟演變成了一場血腥的殺戮。

ice dog

這一幕就是我對人工進化這部電影最深刻的印象,當你看到這一幕時,會是感到生命的單純美好亦或是對這樣的情景感到噁心呢?還是會像星爺一樣吆喝著:「我給你錢,快點做!」

我只想到小時候養蠶寶寶的時光!

Fukuball

我是林志傑,網路上常用的名字是 Fukuball。我使用 PHP 及 Python,對機器學習及區塊鏈技術感到興趣。 https://www.fukuball.com

Co-Founder / Head of Engineering at OurSong

Taipei, Taiwan