2013-02-11

Hello Git

Git 是什麼?

版本控管系統,就像是 CVS 或 SVN(Subversion)。

為什麼要用 Git 取代 SVN?

不同於 CVS 或 SVN 這類中央控管型的版本控管系統,Git 是分散式版本控管系統

什麼是分散式版本控管系統?

CVS 或 SVN 只有一個遠端的檔案庫(repository),分散式版本控管系統有兩個檔案庫,本地端與遠端,就像是本機有一個 SVN Server,供本機專用,而這個本機 SVN Server 又可以和遠端多人共用的 SVN Server 進行同步。

兩個檔案庫有什麼好處?
  • 與本機檔案庫進行同步,不僅速度快,最重要的是可以離線使用
  • 不會因遠端檔案庫掛點,而導致無法使用版本控管,可以一直使用本地端檔案庫,直到遠端檔案庫修復,再進行同步。
  • 可以保有自己的版本,等到大功告成後,才放到遠端檔案庫,不用擔心資料遺失而交付不完整的版本。
  • 若遠端檔案庫因為不明原因自爆,可以使用任何一個本地端檔案庫來重建遠端檔案庫(當然是找最新版的那個),因為所有本地端檔案庫都是遠端檔案庫的複本
  • 遠端檔案庫不是必要的,也就是說,只是自己要作版本控管,不需要和他人共用的話,那就只需要本機端檔案庫就可以了;換句話說,不需要任何檔案控管 Server,就可以使用版本控管的功能。

Git 為什麼可以這麼快?
  • 不同於 CVS 或 SVN 將每個版本儲存差異,Git 是儲存整個檔案,也就是說,當 SVN 要取出某個版本時,得從第一版一路累加到指定的版本,而 Git 則是直接取出指定的版本檔案,當然,Git 檔案庫會使用較多的磁碟空間。
  • 幾乎所有的版本控管操作都是本地端的,只有少數的情況需要呼叫遠端的檔案庫;因為本地端檔案庫是遠端檔案庫的複本,所以除非要修改遠端檔案庫,否則所有的唯讀動作,本地端檔案庫都可以勝任。

安裝 Git
  • 到 http://code.google.com/p/msysgit/downloads/list 下載 Git-[x.x.x]-preview[yyyymmdd].exe,目前是 Git-1.8.0-preview20121022.exe。
  • 使用預設值安裝,唯有在「Adjusting your PATH environment」選擇「Run Git from the Windows Command Prompt」。
  • 完成後就可以在命令提出字元輸入 git 驗證。

Git 初始化設定
> git config --global user.email '...@gmail.com'
> git config --global user.name 'Neil Chan'
這是必要且為一次性的設定。

Git 檔案的四種狀態(工作區檔案、已標記檔案、本機檔案庫、遠端檔案庫)與三種動作(add、commit、push)
  • 狀態一:工作區檔案,就像是 Eclipse 裡看到的檔案
  • 動作一:修改工作區的檔案,然後 add 到狀態二
  • 狀態二:已標記檔案(stage or index),已建立副本,此時若再修改同一工作區檔案,是不會影響這個標記檔案的
  • 動作二:commit 已標記的檔案到狀態三
  • 狀態三:Commited 檔案,這裡就是本機檔案庫
  • 動作三:push 本機檔案庫到遠端檔案庫
  • 狀態四:遠端檔案庫

建立新的本地檔案庫

檔案結構如下:
  • aproject.git
    • aproject
在 aproject.git 目錄下執行 git init,產生 .git 目錄,這就是本機檔案庫。
> mkdir aproject.git
> cd aproject.git
> git init
Initialized empty Git repository in .../aproject.git/.git/
產生的檔案結構如下:
  • aproject.git
    • .git
    • aproject

複製遠端檔案庫為本地檔案庫

執行 git clone [url],可以複製整個遠端檔案庫到本機,建立工作區目錄與 .git 目錄。
> git clone https://github.com/jquery/jquery-ui.git
Cloning into 'jquery-ui'...
remote: Counting objects: 53609, done.
remote: Compressing objects: 100% (14755/14755), done.
remote: Total 53609 (delta 40800), reused 50419 (delta 38028)Receiving objects:

Receiving objects: 100% (53609/53609), 18.62 MiB | 129 KiB/s, done.
Resolving deltas: 100% (40800/40800), done.
得到以下結果:
  • jquery-ui
    • .git
    • build
    • demos
    • ...
可以在 [url] 後加上自訂的工作區目錄名稱。
> git clone https://github.com/jquery/jquery-ui.git jqueryui
...
得到以下結果:
  • jqueryui
    • .git
    • build
    • demos
    • ...

Git 檔案的幾種可能性
  • 未追蹤的檔案:未經過 git add 的檔案
  • 已追蹤的檔案:經過 git add 的檔案
    • 未修改的檔案:commit 之後未修改的檔案,或者 clone 之後未修改的檔案
    • 已修改的檔案:已修改但未標記的檔案
    • 已標記的檔案:修改且標記的檔案,commit 之後回到「未修改的檔案」
  • 忽略的檔案

Git 基本操作(add-commit-push

可以使用 git status 檢查所有檔案的狀態。

在新建的檔案庫執行 git status 。
> git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
git 有一個相當貼心的功能,就是在每個指令裡提示下一個可以執行的指令,例如上面的 create/copy files and use "git add" to track。

在剛 clone 回來的檔案庫執行 git status 。
> git status
# On branch master
nothing to commit, working directory clean 
git status 只會列出需要處理的檔案,例如未追蹤的檔案、已修改的檔案和已標記檔案不會列出未修改的檔案與忽略的檔案這類不需要處理的檔案

手動新增一個檔案 a.txt,再執行一次 git status
> git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       a.txt
nothing added to commit but untracked files present (use "git add" to track)
出現一個未追蹤檔案 a.txt,並提示可以用 git add 加入追蹤。

那就用 git add 加入追蹤吧。
> git add a.txt

> git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   a.txt
#
再使用 git status 檢查狀態,可以發現 a.txt 從未追蹤狀態改為已標記狀態(Changes to be committed),也就是等待 commit 中。

如果不小心將不需要的檔案加入追蹤,git 也提示了移除追蹤(unstage)的指令 git rm --cached,也就是再從已標記狀態改為未追蹤狀態
> git rm --cached a.txt
rm 'a.txt'
> git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       a.txt
nothing added to commit but untracked files present (use "git add" to track)
為了玩下去,再將 a.txt 用 git add 加入已追蹤狀態。

這時就可以進入狀態三,使用 git commit 將已標記檔案轉入本機檔案庫。
> git commit -m 'first_commit'
[master (root-commit) ff46082] 'first_commit'
 0 files changed
 create mode 100644 a.txt

> git status
# On branch master
nothing to commit, working directory clean
嗯,搞定,a.txt 進入本機檔案庫作永久保存了。

接下來就是 push 到遠端檔案庫了。

遠端檔案庫在哪?有兩個選擇,第一、自己建一個,第二、簡單一點,使用網路上免費的檔案庫,例如 Bitbucket,這邊就以 Bitbucket 為例作說明。

要做的事有:
  • 註冊
  • 新建遠端檔案庫
  • push 本地檔案庫到遠端檔案庫

簡單抓圖說明,新建遠端檔案庫。

輸入檔案庫名稱,並確認勾選「This is a private repository」。

完成後,點選「I hava code I want to import」。

執行第二和第三指令。
> git remote add origin https://cw1057@bitbucket.org/cw1057/aproject.git

> git push -u origin --all
Password for 'https://cw1057@bitbucket.org':
Counting objects: 3, done.
Writing objects: 100% (3/3), 206 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: bb/acl: cw1057 is allowed. accepted payload.
To https://cw1057@bitbucket.org/cw1057/aproject.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
就這樣,push 到遠端檔案庫就完成了。

可以執行前面提過的 git clone 來驗證。

網址是?可以單點 Bitbucket 網頁右上角的 Clone 按鈕就可以知道。
> git clone https://cw1057@bitbucket.org/cw1057/aproject.git
Cloning into 'aproject'...
Password for 'https://cw1057@bitbucket.org':
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.



最後,Git 是誰發明的?

Linus Torvalds,就是發明 Linux 那個人,Git 最早就是用來控管 Linux 的。

有多少人在開發 Linux?

Linux 是多大的系統?

所以放心的用 Git 吧!


回到 Git 學習筆記
---
---
---

沒有留言:

張貼留言