Git Study

此篇文章最近更新時間為2009-11-09 20:34:15 目前共有5篇留言

關於作者 - JosephJ

任職於 Faria。喜好戶外運動、2008 年 5 月完成「跑步環島」。對於新技術跟程式碼有著強烈的偏執狂。

來了解一下 Git 的概念,搜尋找到了 jserv 大大的「我愛 Git」投影片,就來拜讀一下。喔!原來 Git 跟我過去所用的 CVS、Perforce、SVN 在架構上非常不一樣!之前我用的都是一台 Server 做 Repository,且所有的動作 (Update/Commit/Add...) 都得跟它做連線;而 Git 的 Client 本身就是 Repositiory,每次的 Commit 都是在 Local 做。問題是... 這樣的架構,該如何做到多人同時開發呢?原來 Git 的每個 Repository 都可透過 Publish / Pull Request 的動作讓其他人做 Merge。簡單來說,CVS / SVN 是以 Trunk 為主、Branch 為輔,而 Git 的主要架構就是以 Branch / Merge 為核心

  • Linus 對 git 的介紹:http://www.youtube.com/watch?v=4XpnKHJAok8 (用 SVN 的人很笨?)
  • http://www.qweruiop.org/nchcrails/posts/49
  • git --bare init

安裝 git client

sudo apt-get install git-core

取得或建立一個 Git Repositiory

  • git clone git://somehost/someone/git.git
  • git clone http://somehost/someone/git.git
  • git init (在目前的目錄)

日常操作與 SVN 一樣

  • git add
  • git diff
  • git commit, git commit -a (automatically in one step) : 建議還是要註解,第一行標題,第二行內容

Branch 如此輕鬆簡單

git 的中心思想就是 Branch:Branches are cheap and easy, so this is a good way to try something out。

  • 只要這樣子做就建立了一個新的名叫 experimental 的 branchgit branch experimental
  • 切換到此新的 branchgit checkout experimental
  • 有哪些 branch(master 就是 SVN 的 trunk): git branch
  • 切換回 master branch : git checkout master
  • 如果有衝突,用 git diff 觀看並修改 : git merge experimental
  • gitk : 顯示 resulting history 圖表
  • 砍 branch (會做確認) : git branch -d experimental
  • 砍 branch (強制砍除) : git branch -D experimental

檢視記錄

  • git log v2.5.. : 從版本 2.5 之後的紀錄
  • git log test..master
  • git log master..test
  • git log master...test
  • git log --since="2 weeks ago"
  • git log Makefile
  • git log fs
  • git log -S'foo()' 有 foo() string 的 commit
  • git log --no-merges
  • git log --stat : how many lines added and removed
  • git log --pretty (oneline : 顯示 title, short, medium, full, fuller, email, raw)
  • git log --pretty=format:'%h : %s' --graph

檢視差異

  • git diff master..test : 目前
  • git diff master...test : 同一基準點
  • git diff HEAD
  • git diff test
  • git diff HEAD -- ./lib
  • git diff --stat

超讚的多工

假設我 josephj 新建立了一個專案(/home/josephj/www/toolbar),虎哥 laudieh 想要來幫忙我,如果在同一台 server 上,他可以這樣做 :

git clone /home/josephj/www/toolbar ~/toolbar

這樣子就會在虎哥的家目錄下建立一個 Repository,這時虎哥跟我都可以獨立作業、互不干擾:

git commit -a

虎哥跟我說他改完了,那我就可以執行下面的指令做 merge

cd ~/www/toolbar
git pull /home/laudieh/toolbar

因為經常要做 pull,所以你可以藉由 remote 來替虎哥的 repositiory 設定一個匿名

git remote add laudieh /home/laudieh/toolbar

如此我們就可以抓虎哥的 change 回來、但是不 merge

git fetch laudieh

其實這個指令會幫你建立一個 branch : laudieh/master

git log -p master..laudieh/master

檢視過後,我才會做 merge

git merge laudieh/master

我也可以直接從遠端做 merge

git pull . remotes/laudieh/master

之後虎哥可以抓我 merge 後的版本(虎哥不需要指定路徑,因為當初在 clone 的時候便已經記錄了! git config --get remote.origin.url)

git pull

其實虎哥那邊也會偷偷開一個 branch 叫 origin/master (可以用下列指令觀看)

git branch -r

如果非本機的情況,也可以使用 ssh:

git clone josephj.com:/home/josephj/www/toolbar toolbar

Public git repositories

小的 project 或 Team work 只要用 priviate repository 做互相 sync (pull) 即可,但是大的 project 需要有一個獨立的共用 repository。工作流程一樣,但多了不定時的 push changes:

工作流程一樣,但多了不定時的 push changes


Comments

  1. puremonkey 2012-03-07 22:46:24
    感謝分享 ^^
  2. garyzyg 2011-06-28 23:43:14
    git 需要 training 成本. 小弟任職的公司用的是 svn, 即使小弟在試用期玩熟 git 也介紹給同事, 也沒有導入的願意. 畢竟改變是人所畏懼的.
  3. josephj 2011-03-10 17:58:39
    facebook 跟 yahoo! 都有把 Open souce project 用 github 來做控管
    內部就不清楚了
    但是 Linux Kernal 每一秒都有人在 commit,所以 Scalability 應該不用擔心

    IDE 的可以用 TortoriseGit
    http://code.google.com/p/tortoisegit/
  4. sophia 2011-03-09 20:09:20
    有沒有大規模rd公司用gitㄚ 那種人數超過2,3千人的?
    還有git都用command line, 有3rdparty 廠商 有IDE solution嗎?
  5. Mr.King 2010-01-13 12:53:32
    好像比SVN還要簡單一點,

    現在都利用google在當SVN server

    看來改天可以試試看這套了
暱稱: 必填。
Email: 非必填。若填寫為不公開欄位,僅供站長參考聯繫。
內容: 必填。限 255 個字元以內。
驗證碼:
送出

Facebook Comment