2012年5月22日 星期二

Git | 簡易遠端協同工作流程

設定遠端Repo


熟悉本機端 Git 指令後,拓展一點可以使用到遠端的 Git 資料夾,
就是 remote 的部分。
...Git 的遠端資料夾可以建在各式各樣只要能連進去的地方,一個指令就ok。





#先到要設成Repo的遠端資料夾底下,例如home/Dropbox/prjname
$ git init --bare


這時候會產生一個沒有.git 的一堆東西,
其實就是把.git 隱藏 folder 內容直接攤在這個遠端資料夾底下,
之後 push 上來的東西也不會有實體檔案在,只是單純記錄著 push 的進度,
換句話說,pull 下來的人 pull 到的也只是進度。


設定本地Repo


在 local 端也要有設定。
要指定本地端想指給哪一個遠端 git folder,所以要先 cd 到本地端要變成 Repo 的 folder 底下,
如果這個 folder 還不是 Repo,請先一樣執行
#先到要設成Repo的本地資料夾底下,例如home/prjname
$ git init

令其變成local Repo


接下來,告訴這個local Repo,他的心電感應對象是誰──
#先到要設成Repo的本地資料夾底下,例如home/prjname
$ git remote add origin [home/Dropbox/prjname]


此時此刻,這個 local Repo 就知道它有了一個新的 remote,
名字叫做 origin,位置在哪個遠端位置。
origin 是 default 值,就如同 branch 的 default 值叫做 master一樣...
當然也可以指給 local Repo 多個不同的 remote 對象,origin 以外的名字就可以了。


有哪些遠端資源


最為知名的自然是 Github,免費的時候你就必須開放全部的程式碼,
有付錢給他的話就可以擁有私用的權限。
此外,我也使用 Dropbox 當作私有槽,各種此類服務都可以,
指向自己電腦上面dropbox 資料夾的位置就可以了。
還有一些 VPN,例如 heroku
最不需要提的就是自有的 server,這應該沒有問題 XD


Push & Pull


在本地事情做完了就可以 push 上去遠端 Git


#先到要設成Repo的本地資料夾底下,例如home/prjname
$ git push origin master


這代表把進度 push 到名為 origin 的遠端,master 那一支 branch。
注意──也可以push 到對應本機 branch 的遠端 branch,例如

#先到要設成Repo的本地資料夾底下,例如home/prjname
$ git push origin develop


如果正 checkout 到 local 端的 develop branch 做事,
又希望 origin 同樣產生一模一樣的 branch,就可以這麼做。


那可能時間流逝,origin 的進度已經被其他工作夥伴 push 多次更改完了,
想要follow 上大家的進度就可以把進度 pull 下來

#先到要設成Repo的本地資料夾底下,例如home/prjname
$ git pull origin master



怎麼這麼多種 pull 方法


仔細研究一下網路上的教學,會發現抓檔案方法很多種:
clone, fetch 和 pull,同樣都是把進度抓下來,為什麼有那麼多種不同的呢?
其實事情是這樣的...

  1. clone
    會把 remote 最新版整包下載,並建立新目錄放在裡面(所以不用 git init,也不用 branch 名)
  2. fetch
    會下載 remote 的最新版,然後放在本地的一個 branch 裡(以上例來說會放在 origin/master 的 branch 裡)
  3. pull
    會下載 remote 的某個 branch 最新版,並與目前的 branch 做合併(等同 fetch + merge)

所以說,視需求使用囉。


還沒有 push 前你都可以後悔


amend
快速修正前一次 commit 的錯誤

reset
git reset 砍掉 commit 重來,但是修改的程式還是留在 working tree。

rebase
可以從指定的版號之後,重新隨你意 commit 一次來重建 history,超威的


拜託不要隨便 push 然後...


如果只是在 local,
無論是怎麼樣 merge 和 commit 都還有機會回到上一動、上上動。
但是如果是在多人共用的 Repo 中,把爆掉的 code push 上去也就罷了,
然後直接時光倒流給他用一些 amend、 reset、 甚至 rebase...That is an actual disaster.

May 22th, 2012
shesee@Taipei

沒有留言:

張貼留言