2013年5月2日 星期四

Git教學 step by step

0.安裝msysgit


下載最新版的msysgit



安裝完成後執行Git Bash


 


--

Git是一個版本控制器(廢話)
跟SVN不一樣 (廢話)
總之用了就知道

Git可以直接在本機做版本控制
受Git控制,存放檔案的地方稱做Repository
可以把Repository想成抽屜

檔案存放的地方叫做work tree
跟Repository不同的地方在於
放在work tree的檔案不一定受Git管理
簡單來說work tree是你堆放衣服的椅子
Repository是放洗好摺好,乾淨衣物的抽屜
那...Stage指的應該就是摺衣服這個動作了
(這樣講聽的懂有鬼)
不明白的話就先計Repository就可以了
總之先建一個抽屜吧!

1.建立git Repository

選一個資料夾(ex: myGit)輸入
git init



這時候可以看到myGit資料夾內多了.git

.git就是存放版本控制相關資訊的地方
myGit資料夾內所有檔案都會受到Git的監視
是監視!不是管理!
先放一個檔案試試先.

2.關於Git的檔案狀態

在myGit資料夾內建立file1.txt,內容為This is file1


輸入git status


可以看到file1.txt顯示為紅色(姑且當做是紅色吧)
這個時候檔案是受git監視,沒有受git管理的狀態
也就是說這個檔案正堆在你的椅子上
要把檔案收到抽屜裡一定要先摺好(請養成良好習慣)


輸入git add file1.txt
git add file1.txt

現在再輸入git status
git status


這時候file.txt變成了綠色(摺好了,乾淨了)

這個git add後的狀態被稱做stage
未經git add的狀態被稱做unstage


接著輸入git commit -m "some comments"
git commit -m "some comments"



這時候stage狀況下的檔案(file1.txt)正式接受git控管(放進抽屜)
放進抽屜內的檔案才可以享受回覆版本等等的特殊待遇
其他unstage的檔案是不受git管理的

輸入git log
git log



剛剛輸入的some comments是該次commit的註解
上面圖片中commit 4ab1bd....一長串號碼代表本次commit的版本號碼
這組號碼叫做commit

至此完成了一輪git的使用.



3.本機的版本控制


再加一個file2.txt到myGit資料夾,內容為this is file2,
輸入git status(之後不再贅述)

可以看到Git會標出未控制的檔案

把file2.txt add到stage狀態後commit



看一下git log

 

整理一下
現在有兩個版本
第一個版本只有file1.txt
第二個版本有file1.txt跟file2.txt
這時候後我想回到第一個版本的狀態該怎麼做呢?
輸入

git checkout commit號碼 -b branch名稱
 
Git告訴你Switched to a new branch 'branch1'
現在切換到一個新的分枝叫做branch1(剛才輸入的branch名稱)

看一下資料夾,確實回到第一個版本了


 這時的log也只有一筆資料


那要怎麼跳回第二版本呢?
log已經看不到第二版本的commit號碼了呀!
輸入
git checkout master
 
 
善良跟正義都回來了(淚~)

至此實作了本機間的版本切換

4.Branch的使用

其實剛才我們在做版本切換的時候已經用過branch了
在git init的時候會產生一個最初的branch,
這個branch叫做master
他像背後靈一樣跟在我們後面很久了
切換到其他branch的時候會顯示該branch的名稱

輸入
git branch

 可以看到現有的branch
打星號的是現在所在的branch

branch的新增刪除方法如下

 新增
git branch branch2
 刪除
git branch -d branch2



branch只有在兩種狀況下可以做切換

一是兩個branch的版本號碼不一樣,
同時所在的branch沒有unstage的檔案

 二是兩個branch的版本號碼一樣

 一的狀況很明確,git也會告訴你,不準你做切換
像這樣(偷改一下file2)
 

 如果要回復單檔(剛才偷改的file2)
 git checkout file2.txt



二的狀況比較容易疏忽(不想承認是自己撞過吃過虧)
建一個新的branch3,然後修改file2不commit
這時候居然可以切回master!!
我還天真的以為master還像當初一樣純潔
誰知道一切只能追憶(遠望)
戒之戒之

 

5.Merge

建立一個branch4,切換到branch4
修改file2.txt的內容後commit
 最後再切回master
 

這裡用了新指令,一次加入所有檔案
git add .
 還有就是要習慣使用git status去檢查現在的檔案狀態是否如預期

現在我們知道master跟branch4的file2是不一樣的
如果想要把branch4修改的內容加回master
可以輸入
 git merge 想要合併進來的branch
 

如果兩個branch的檔案有衝突的話呢?

先取消剛剛的merge
git reset --hard commit號碼



git reset --hard 是強制回覆到之前的狀況,沒有建立bracnch喔


接著修改file2後再commit

 

因為兩邊同時修改了file2
所以現在merge的話會衝突
 

 衝突的地方會標出來,像這樣
 
手動解決衝突後commit,才能再merge





6.Remote的使用

Git好用的地方就在於可以在本機做版本控制
需要的時候再跟遠端做同步或更新等等處理
自由度很高,也因此在多人開發時
team member對Git的使用習慣也要一致才能避免混亂
(不然亂推亂拉的衝突一堆,怎麼管理呀!)

再建立一個git的repository吧
放在Dropbox的資料夾就可以同步嘍!
但不要把頻繁操作的git資料夾建在這裡
Dropbox會很忙碌



這個RemoteGit如果確定只做遠端同步的話
建議用
git --bare init
 
不然等一下上傳的時候會出現問題
這個問題是因為git init建立的repository有可能在不同的branch上
 repository一下在branchA一下在branchB上
這不是讓要上傳請求同步的人很困擾嗎?
所以git --bare init跟git init最主要的差別在於
git --bare init是看不到檔案也不能切換branch的唷!






遠端的repository已經準備好了
這時候可以上傳了,git的上傳是用推的
推之前可以先幫這個遠端位置建立一個別名
git remote add RemoteGit C:/Users/Sony/Dropbox/RemoteGit
git push RemoteGit master 


 

 這樣檔案就上傳完成了

如果要下載遠端檔案的話輸入
git pull RemoteGit master 

 5.操作習慣


 不同Team有不同的操作習慣
這個習慣是為了避免多人push/pull時產生混亂
目前我的做法是開發都在branch上完成
之後切回master
master先跟遠端同步(pull)
確認master的內容跟遠端一致
接著再把剛才開發的branch merge到master
在本機解決衝突後才push到遠端

本篇介紹了一些Git的基礎操作
希望能對一些朋友有幫助

git還有很多指令可用,可依需求上網查詢



4 則留言:

  1. 真是太棒了
    正要開始學git
    完全搞不等要槓麻時看到這篇文章
    感謝您

    回覆刪除
  2. 寫得很清晰易懂,終於不是明明是中文卻看不懂的東西了QQ

    回覆刪除

Related Posts Plugin for WordPress, Blogger...