顯示廣告
隱藏 ✕
看板 tails
作者 tails (QQ)
標題 [教學] Git使用教學 Part 1 -- 新手上路
時間 2012年03月11日 Sun. PM 08:25:02


-------------------- 板主前言 --------------------

第一次打教學
有錯請用力鞭Orz...
原本Part 1是打好的
不過在修改的時候存錯檔
造成重打的悲劇 (馬上把Part 2備份好XD)
所以資料上可能會跟Part 2有點不一樣

Git這東西我也是剛學
可是資料太多太複雜
所以乾脆來個整合版
文章很多地方都有參考其他教學的講解

底下有附參考連結
如果我打不夠好的話可以去看原始教學Q.Q...

-------------------- 開死 --------------------

-------------------- 前言 --------------------

相信大型專案或是多人開發時,一定會出現下列問題:

一、「X的!上次這個程式碼我是改了什麼東西,怎麼突然怎麼不能執行?....(以下省略5分鐘的search時間)」

二、「某某!這檔案你有改過嗎?X!你也有改?改哪裡?....(以下省略10分鐘的compare時間)」

三、「(改過數個或更多原始碼後)X的!被我搞到不能Compile了,該還原回去...可是我剛到底是改哪些檔案...(以下省略30分鐘的search與compare時間)」


於是就出現了版本控制的需求 (wiki - 版本控制)
版本控制的主要目的在於記錄專案內變動過程
以便未來做追縱或回朔所使用
版本控制的方法也是經過了很多改變:

1.copy

wiki:
開發者自己保留一個程式的許多不同版本
並且為它們做適當的編號
這種簡單的方法已被用在很多大型的軟體專案中
該方法雖然可行,但不夠有效率
除了必須同時維護很多幾乎一樣的源碼備份外
而且極度依賴軟體設計師的自我修養與開發紀律
但這卻常是導致錯誤發生的原因

除此之外,因為是使用完整備份
所以需要多花空間與備份的時間

2.差分編碼

wiki:
只保留檔案相繼版本之間的差異
這個方法可以更有效的儲存數個版本的檔案

但這個方法還是無法解決多人多工所會遇到的問題
比方說最常見的就是兩個以上的開發者編輯相同的檔案

3.中央式系統

中央式系統是屬於集中管理
所有的版本控制都在同一台伺服器上進行
上述所遇到的問題:兩個以上的開發者編輯相同的檔案
在這個系統通常會使用『檔案上鎖』
讓同一時間只能讓一個開發者編輯該檔案
常見的中央式系統為SVN

4.分散式系統

檔案上鎖的功能能對高難度的合併提供一些保護
但還是存在一些問題
一來通常其他開發者可以繞過版本控制系統改變檔案
二來同個檔案需要立即編輯立即看結果就顯得沒效率了 (如網頁設計,程式debug + 美工排版)
所以出現了分散式系統
它的好處在於:
wiki:
開發者直接在各自的本地檔案庫工作
並容許多個開發者同時更動同一檔案
而各個檔案庫有另一個合併各個改變的功能
這個方式讓開發者能不靠網路也能繼續工作
也讓開發者有充分的版本控制能力
而不需經中央權威許可
分散式系統仍然可以有檔案上鎖功能。

目前最多人使用的分散式系統就是Git
同時也是Linux之父--Linus所開發的

-------------------- 如何開始 --------------------

目前我所使用的作業系統為Windows 7和Mint Linux 12(Debian/Ubuntu系列)
所以教學上會以這兩個作業系統作說明
首先到Git首頁下載相對應的版本
http://git-scm.com/

Windows 7

我所使用的是PortableGit
解壓後裡面bin/git.exe即為Git的主程式
平常下指令需要使用git-bash.bat來開啟CLI
GUI可以使用TortoiseGit

Debian/Ubuntu系列

主程式安裝指令:

$ sudo apt-get install git-core

GUI安裝:

$ sudo apt-get gitk

雖然兩個系統都有GUI可以使用 (查過MAC也有)
不過建議還是先從CLI開始學起
這樣未來不管在什麼環境下都能順利使用了

在安裝好開始使用前
先做一些基本的設定

$ sudo update-alternatives --config editor  # 設定預設編輯器
$ git config --global user.name "tails"  # 設定使用者名稱
$ git config --global user.email "tails@example.com"  # 設定使用者email
$ git config --global color.ui true  # 設定顏色比較好閱讀

Git使用上會遇到許多名詞
未來再另外做個整理

-------------------- 開始使用 --------------------

先前有提過
Git可以讓使用者自行建立檔案庫 (Git稱作 repository或Repo)
所以首先第一步我們要先建立一個自己的repository

$ mkdir ~/project  # 建立目錄
$ cd ~/project
$ git init  # 初始化,Git會在這個目錄上建立一個叫 .git 的隱藏目錄,裡面會放 git log 的資料
Initialized empty Git repository in ~/project.git/.git/
$ git status  # 查看目前目錄狀況
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

可以看得出來這個目錄是剛初始化,完全乾淨的狀態
上面會跟你說你在 master這個branch (branch Part 2會說明,目前只要知道可以查就行了)
我們先加入檔案試看看

$ touch test
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#
	
test
nothing added to commit but untracked files present (use "git add" to track)

它說有Untracked files (未被追蹤的檔案)
表示之前這個repository沒有這個檔案,而且尚未被追縱
現在要讓Git追縱的話要使用git add這個指令:

$ git add test
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#
	
new file:   test
#

現在變成了Changes to be committed
通常稱這個狀態為 Stage
剛剛新增/修改過,但還沒Git add的檔案叫作 Unstage

git add基本上只能一個檔案一個檔案加
也可以輸入git add .
它會把所有新增/修改過的檔案全加入stage狀態
但通常不建議這麼做
雖然方便,可是也許會加入其他不必要的檔案
最好的方法還是
自己要清楚的了解檔案狀態
還有另一個做法是使用git add -i
這是互動模式,可以選擇要加入的檔案或是移除剛剛不小心加入的檔案

再來下個一動作就是要做commit(提交)了
commit是一個很重要的動作
一個commit在Git裡就是一個節點
都是未來在回朔或是追縱的參考
gogojimmy:
你可以想像就像是電玩遊戲時的存檔,
每一個 commit 就是一次存檔,
讓我們未來在需要的時候都可以回到這些存檔時的狀態。

commit的指令是git commit

$ git commit

再來會看到剛剛設定的預設編輯器畫面

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   test
#

上面會有留空行是要讓你寫這次commit的訊息
比如說"add test file"
gogojimmy:
強烈建議在 commit 的時候要盡量清楚表達這次 commit 的內容為何,
因為這會讓你未來要回頭看 code 的時候能讓你快速的找到你想要找的內容,
也能對團隊中其他成員了解你在做什麼。

commit後會顯示出你這次commit的更動

[master (root-commit) 698422c] add test file
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test

如果覺得每次都會跳出編輯器很麻煩的話,可以使用 -m 參數來快速提交:

$ git commit -m "add test file"

使用 -am 的話可以把所有unstage的檔案一併add進來
不過先前有提到,並不推薦這種作法
還是建議要清楚了解要加入的檔案是什麼

$ git commit -am "add test file"

-v 可以列出更動的記錄 (這部分就留給看倌們實作了)

$ git commit -v

加號(+)代表增加的部份,減號(-)代表刪除的部份

commit完後,可以使用git log查看過去commit的記錄

$ git log
commit 5f880bb87b78b8bb95c8f294506020671ed51455
Author: tails <tails@example.com>
Date:   Sun Mar 11 02:23:59 2012 +0800

    add test file

使用 --stat 會有更詳細的資訊

$ git log --stat
commit 5f880bb87b78b8bb95c8f294506020671ed51455
Author: tails <tails@example.com>
Date:   Sun Mar 11 02:23:59 2012 +0800

    add test file

 0 files changed, 0 insertions(+), 0 deletions(-)

如果要更詳細的檔案變更內容,可以加上 -p

$ git log -p
commit 5f880bb87b78b8bb95c8f294506020671ed51455
Author: tails <tails@example.com>
Date:   Sun Mar 11 02:23:59 2012 +0800

    add test file

diff --git a/test b/test
new file mode 100644
index 0000000..e69de29


來做個簡單圖來表示流程:

Untracked files
       v
       v git add
       v
     stage
       v
       v git commit
       v
  繼續新增/修改

可能會有人想問說
commit這個重要的動作該什麼時候做?
gogojimmy
什麼時候才是 commit 的最好時機並沒有一個定論,
大部分人會告訴你通常你完成了一個階段性的小工作就做一次的 commit ,
我的感覺是當你想要記錄目前的狀態的時候就是你 commit 的最佳時機,
例如說剛完成某個page,某個任務需求而你想要做個記錄的時候。



有的檔案如果不希望被版本控制追縱 (如log檔或暫存檔等)
那我們可以新增一個新的檔案 .gitignore

$ vim .gitignore

內容如下:

*.log
*~

這樣Git就會忽略這些檔案了


Git的基本操作到此
已經可以做基本的開發記錄了
也可以查詢過去做的一些變更等
但是Git的功能不只是這麼簡單
下一篇再繼續講解Git的神奇妙用之處吧

--
參考資料:
wiki - 版本控制
Git首頁
TortoiseGit
mrmu - Git教學:初學者使用心得分享
Littlebtc - 寫給大家的Git教學
TKG - Git使用手冊
Git教學(1):Git的基本使用

--
※ 作者: tails 時間: 2012-03-11 20:25:02
※ 編輯: tails 時間: 2014-07-25 00:02:03
※ 看板: tails 文章推薦值: 4 目前人氣: 0 累積人氣: 15268 
分享網址: 複製 已複製
( ̄︶ ̄)b Knuckles, d2wu550, Fraina, pig 說讚!
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇