如何建立一個沒有 Parent 的獨立 Git branch

首先,你一定會問幹嘛這樣做。我在上回的Git 演講中有提到:在 Git,你可以建立毫不相關的分支,用來保存其他資訊,就像目錄一樣。這 Branch 的用途不會被 Merge 進開發主幹,是完全獨立的。

實務上的一個應用,就是 Github 提供的 Github Pages 功能,只要你在專案下開一個 branch 叫做 gh-pages,那這個 branch 的內容就會變成靜態網頁。我之前的作法是先分支出來,然後再 commit 一次砍掉所有檔案。雖然結果是ok可以用啦,但是總覺得 gh-pages 這 branch 有 parent 就是意思不對勁,它是完全獨立於主幹的,不應該有 parent 資訊。

剛突然想到這個問題可以 google 看看(Github Pages上其實也有寫 XD),還真的有:

方法一 (source)

因為 git branch 預設是從 HEAD 分支,所以可以這樣 Hack HEAD:

echo ref: refs/heads/newbranch > .git/HEAD
git rm -rf .   # 砍掉所有檔案重來
.....   # 加新檔案
git add .
git commit -m 'create new branch'

方法二(source)

Git 1.7.2 之後版本有支援 –orphan 參數:

git checkout --orphan newbranch
git rm -rf .    # 砍掉所有檔案重來
...  # 加新檔案
git add .
git commit -m 'create new branch'

方法三(source)

git symbolic-ref HEAD refs/heads/newbranch
rm .git/index
git clean -fdx
...  # 加新檔案
git add .
git commit -m 'create new branch'

結果就像是這樣,master 跟 newbranch 的節點完全是分開的:

RubyConf Taiwan 2011 開跑

終於公告出來了,時間是 2011/8/26-27(週五週六),地點是目前開源社群中最夯的中央研究院人文館會議廳(跟去年一樣的場地),感謝OSSF的協助。

很多人問第一天是週五喔? 對,第一天週五是給初學者的 Tutorial 課程,第二天週六才是主要議程。到時候報名可以只報單獨一天。

公告內容請詳見 Ruby Taiwan 部落格的 Call For PresentationsCall For Sponsors

至於大家期待的國外邀請講者部分,目前已經確定了兩位:一位來自 Ruby Core Team,會來講即將在今年暑假釋出的 Ruby 1.9.3,另一位則是 Ruby 社群中非常知名的 Independent tech publisher。

雖然 CFP 截稿日是 7/1,但是我想應該會提早六月就開放報名,敬請期待 :)

ps. 為什麼今年的RubyConf Taiwan官網還沒有出來呢? 我們的網頁設計贊助Even給我了上面這張圖說明了他現在很忙啊 XD

我的 Git 偏好設定

1. 讓 Command Line 指令列顯示目前處在哪一個 Git Branch 分支,最早是在 RGBA 看到這一招,非常方便。另外我最近看到一個點子是顯示從上一次 commit 之後過了多久時間,這可以提醒你是不是該 commit 了 XD

請修改家目錄的 ~/.bash_profile 檔案 (我是用 Bash)。

結果如下,各位可以看到目前處在 master 分支,並且這個專案已經過了 1821 個小時沒有 commit 了…. :p

2. 安裝 Git 的 Bash autocompletion,這樣按 tab 就會有自動完成的效果,它甚至包括 git checkout 時都可以抓到你的 branch 名稱。這裡我用 Homebrew 來安裝 bash-completion,這套件其實包括很多 autocompletion script,你可以去 /usr/local/etc/bash_completion.d 這個目錄找找看。

brew install bash-completion
cp /usr/local/etc/bash_completion.d/git-completion.bash ~/.git-bash-completion.sh

編輯 ~/.bash_profile 加入

[ -f ~/.git-bash-completion.sh ] && . ~/.git-bash-completion.sh

3. 打開 Git 的 color 顏色設定,這樣 Git 指令的輸出結果才會加上顏色,像是 git status 等:

git config --global color.ui true

4. 設定你偏好的文字編輯器和 diff 工具

git config --global core.editor
git config --global merge.tool opendiff

5. 最後,我個人喜歡以下的 alias:

git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch

這樣只要輸入 git st 就是 git status 了。

FYI,以上 git 設定檔的位置在 ~/.gitconfig,你也可以直接修改這個檔案。

Watchr 不只是 Continuous Testing

Watchr 是一個可以監視檔案變動,然後自動執行特定動作的工具。 我的 Rails3 App Template (+JQuery+RSpec+Watchr) 一文中提到它最常見的用途就是用來做 Continuous Testing,只要檔案一存檔,就自動執行對應的測試。但是它也可以有其他用途,就看你怎麼發揮。

例如,我就拿來寫書。我的 Rails3 一書 是用 Jekyll 搭配 Markdown 語法寫的。因此每次檔案編輯完,都必須執行 jekyll 指令才會產生 HTML,接著還得重新整理一下瀏覽器才會看到最後的結果 :(

透過 watchrautorefresh,我就可以達成當我修改完存檔,就會自動執行 jekyll 產生 HTML,並且重新整理瀏覽器頁面。非常好用。用 watchr 執行以下的 script 就會監視目錄下的 .markdown 檔案,一有變更就執行 jekyll 和 autorefresh。


watch('.*\.markdown') do |md|
  puts "#{md} is updated!"
  
  system("jekyll")
  system('autorefresh rails3book')
end

也有人用 Watchr 來 自動上傳 templates 檔案到 Shopify

各位讀者還有什麼應用嗎? 歡迎分享。

RSpec 演講投影片和示範影片

Update: 主辦單位放出來的影片

釋出今天在 OSDC.TW 的演講投影片,其中有預錄的 Live Demo(偽) 三段不在 PDF 裡面,也上傳到 Viemo 了。

Live demo 的影片連結是:

Git and Github 演講投影片(2011)

Update(2012/7): 有 2012 年新版內容。

釋出明天在Facebook 軟體開發團隊工具心得分享要演講的投影片。如果你是 Git 初學者,建議可以從我之前的文章看起。

我的 Git 系列文章:

其他很棒的英文網頁: