Git & GitHub
SW Chris
1
Outline
Why Git?
Install Git & setting
Git local process
GitHub
Git vs SVN
Appendix
2
Why Git?
集中式版本控制系統(VCS)如 : CVS、Subversion及Perforce
3
優點:
每個人皆能得知其它人對此專案做了
些什麼修改有一定程度的瞭解。
管理員可調整存取權限,限制各使用
者能做的事。
維護集中式版本控制系統也比維護散
落在各使用者端的資料庫來的容易。
缺點:
無法連上伺服器時,開發需要參考歷
史紀錄或是即時commit則必須等到可
以連線的狀態。 如果伺服器用來儲存
資料庫的硬碟損毀,除了本地端電腦
的版本,專案開發的歷史的所有資訊
都會遺失。
Why Git?
分散式版本控制系統(DVCS)如 : Git、Mercurial、Bazaar、Darcs
4
特色:
 客戶端不只是取出最後一版的檔
案,而是完整複製整個儲存庫。
 即使是整個系統賴以運作的電腦
損毀,皆可將任何一個客戶端先
前複製的資料還原到伺服器。
 每一次的取出動作實際上就是完
整備份整個儲存庫。
Repository
SVN: 集中式的管理系統使開發成員
只需對應一個server端的repository。
Checkout 出來的結果會將server上
的檔案copy至user端,所有的
commit, restore甚至查詢歷史紀錄
都需要連上server。
Git : 分散式系統不是用”checkout “,
而是利用clone的方式將檔案copy至
user端。並在本地保有一個local的
repository。這些檔案都保有完整的
歷史資訊,且所有的commit ,
restore 等等的操作都可以在本地端
完成。 5
Install Git
Ubuntu:
$sudo apt-get install git
Fedora:
$sudo yum install git
確認目前Git版本:
$git --version
6
.gitconfig
利用vim .gitconfig 修改相關git帳號及外觀
[user]
name = Chris Chen
email = chris.yn.chen@example.com
[color]
diff = auto
status = auto
branch = auto
interactive = true
7
.bashrc
利用vim ~/.bashrc修改相關環境變數:
function git_branch {
ref=$(git symbolic-ref HEAD 2> /dev/null) || return;
echo "("${ref#refs/heads/}") ";
}
function git_since_last_commit {
now=`date +%s`;
last_commit=$(git log --pretty=format:%at -1 2> /dev/null) || return;
seconds_since_last_commit=$((now-last_commit));
minutes_since_last_commit=$((seconds_since_last_commit/60));
hours_since_last_commit=$((minutes_since_last_commit/60));
minutes_since_last_commit=$((minutes_since_last_commit%60));
echo "${hours_since_last_commit}h${minutes_since_last_commit}m ";
}
PS1="u[[033[1;32m]w[033[0m]]
[033[0m][033[1;36m]$(git_branch)[033[0;33m]$(git_since_last_commit)[033[0m]$ “
*以上加入後請重啟console
8
git init & git clone
有兩種方式匯入Git repository
1. 新增及初始化一個 Git Repository
$ git init
2. 從其它伺服器複製一份已存在的Git儲存庫。
$ git clone [url]
9
.git
.git目錄包含一個Git儲存庫架構必要的所
有檔案。
10
-- 供GitWeb 程式使用
-- 包含了專案特有的配置選項
-- 供GitWeb 程式使用
--指向當前分支
--用戶端或服務端鉤子腳本。
--保存了一份不希望在 .gitignore 檔中管理的忽略模式 (ignored patterns) 的全域可執行檔。
--目錄存放所有資料內容 (包含log)
--目錄存放指向資料 (分支) 的提交物件的指標
git local workflow
11
(git checkout)
(git add)
(git commit)
File Status Lifecycle
12
新增檔案的
狀態屬於
untracked
git add & git status
13
 追蹤新增檔案
$ git add <file>
$ git add --all
 檢視檔案狀態
$ git status
git commit
14
 提交檔案至repository
$ git commit <file>
$ git commit --all
$git commit -a
$ git commit -a -s (s代表sign in your email)
git log
15
 檢視repository 歷史紀錄
$ git log
 檢視repository 歷史紀錄 且包含code diff
$ git log -p
SHA-1查核值
User
日期
Commit 描述
git log
16
 抓log關鍵字
$ git log | -i grep XXX
 抓檔案關鍵字是誰改的
先到該檔案路徑下
$git log -p XXX.java
$/ abc (查詢abc)
若要找下一個按n , 回到第一個p
git diff
版本比較
$ git diff <SHA-1> <SHA-1>
$ git diff --staged
17
git revert
還原之前版本 (commit會繼續往前, 目的是留下紀錄)
$ git revert <SHA-1>
18
A B C D
git branch & git checkout
Local端設置branch
$ git branch <branch name>
切換branch
$ git checkout <branch name>
19
git merge
將某個branch merge至現在branch的位置
$ git merge <branch name>
若B branch 是由A的HEAD分支出來的,之後B的parent
commit 也是A的HEAD,則就是fast-forward merge
20
git merge
Fast-forward merge:
當然 也可以強制不使用fast-forward merge
$ git merge --no-ff <branch name>
21
git merge
遇到conflict的處理狀況:
此時就要和修改相同地方的人
討論一下改正後commit即可
22
git merge
利用圖示確認歷史紀錄
$ git log --graph --oneline
23
git reset & git amend
還原狀態
$ git commit --amend =>commit 還原
$ git reset HEAD <file> => 從staging area 還原至unmodified 狀態
$ git reset --soft HEAD^
$ git reset --hard HEAD^
24
Modify Gerri changes:
$ git add src/com/asus/sensorapi/service/AsusProcess.java
$ git commit --amend
$ git push amax HEAD:refs/changes/53/171153 (後面兩團數為gerri
上的號碼)
git reset
恢復某個檔案至untracked file狀態
$ git reset xxx.java
恢復所有untracked file狀態
$ git reset -- .
25
git rebase
Git rebase 和 git merge有
些不同如右圖:
$ git rebase <new base commit>
26
<<Before>>
<<After>>
git tag
若要像SVN tag版本
$ git tag <name> <SHA-1>
27
git stash
當正在進行專案中某一部分的工作,而想轉到其他分支上進行一些工作。問
題是,不想只為了待會要回到這個工作點,就把做到一半的工作進行提交。
解決這個問題的辦法就是 git stash 命令。
丟進暫存區
$ git stash
取出最新的一筆 stash 暫存資料. 但是 stash 資料不移除
$ git stash pop
列出所有暫存區的資料
$ git stash list
列出所有暫存區的資料
$ git stash apply stash@{2}
取出最新的一筆, 並移除.
$ git stash drop stash@{2}
刪除某個暫存資料
$ git stash clear
把 stash 都清掉 28
git blame
查找特定修改人及log
$ git blame <file>
$ git log
29
Git workflow
30
Staging
Area
31
Repo command
Repo forall
• 回到某一版
先確認build id : build/core/build_id.mk
$ git log |grep LRX21M (LRX21M 是build ID)
$ Git tag => 確認要跳去哪個tag
$ repo_asus forall -c ‘git reset --hard android-5.0.2_r1‘ (後面接tag 即可)
$ repo_asus forall -c 'git reset --hard 044030362_201410070948'
32
GitHub
33
GitHub
https://github.com/
34
Create a repository
35
GitHub
Git 和 GitHub相互溝通有兩種方式:
1. HTTPS (使用密碼,email 和GitHub伺服器驗證)
2. SSH key (使用金鑰 和GitHub伺服器驗證)
– 金要分成公鑰(Public Key) 用來加密 , 私鑰 (Private Key) 用來解密
– SSH會在 ~/.ssh下儲存私鑰, 登入時使用
開始時須打造這兩把鑰匙: (啥? ~/.ssh 找不到??)
自己的鑰匙自己做!
$mkdir ~/.ssh
36
GitHub
37
GitHub
38
GitHub
39
測試GitHub公鑰是否連接正常:
$ ssh –T github.com
GitHub
接著把我們的code push至server上
首先在GitHub的repository中複製SSH
40
GitHub
12345
先加入remote 位置:
$ git remote add <remote name> <your GitHub SSH address>
將檔案push至server:
$ git push <remote name> master
41
GitHub
刪除remote: git remote rm
<target remote>
push 完GitHub上就有相關資訊嘍~
42
GitHub
12345
Your Files
Log and Branch
Current branch
SSH URL
接著試試看push其它的branch至server:
$ git push < remote name > <other branch>
刪除 remote branch的方式:
$ git push <remote name> : <branchName> 43
GitHub
將server 的HEAD update到local repo端:
$ git pull <name> master
*git fetch : 同步遠端伺服器上的資料到本地。
*git pull = git fetch + git merge
44
GitHub
當遇到 conflict 的做法和之前一樣:
修改完, git add + git commit
*git pull = git fetch + git merge
45
GitHub
當遇到 remote 中檔案被刪除時,pull下來的檔案
會直接在本機端工作目錄中刪除。
46
GitHub
在push到remote時有可能遇到以下情況:
此時代表server上有其他更新(non-fast-forward updates),避
免遺失掉歷史紀錄,建議先pull merge後在push吧!
47
GitHub
Git workflow Review
48
Staging
Area
Git gui tool
49
看了這麼多command line是不是眼都花了!?
當然下列有些GUI tool 大家可以自己挑喜歡的用嘍~
Gitg
$ sudo yum install gitg (Fedora)
$ sudo apt-get install gitg (Ubuntu)
Gitk
$ sudo yum install gitk (Fedora)
$ sudo apt-get install gitk (Ubuntu)
Git-cola
$ sudo yum install git-cola (Fedora)
$ sudo apt-get install git-cola (Ubuntu)
Giggle
$ sudo yum install giggle (Fedora)
$ sudo apt-get install giggle (Ubuntu)
Git
50
SVN
Git vs SVN
51
Appendix
52
自動補齊
在bash shell底下可自動補完打到一半的git 指令
Ubuntu:
$sudo apt-get install git-core bash-completion
Fedora:
$sudo yum install git bash-completion
53
自動忽略
Git 可忽略某些檔案,使其無法被add & commit
通常有以下兩種方式:
1. 在專案底下新增.gitignore
2. $GIT_DIR/info/exclude.
54
Fedora 新增帳號
55
Root password :xxx
Fedora 連接網路
56
Fedora setting:
若要連線至網路請選擇橋接介
面卡,並可用ifconfig確認連線
IP address是否正確
Reference
Udacity https://www.udacity.com/
Git SCM http://git-scm.com/book/zh-tw/v1
連猴子都懂的Git入門指南 http://backlogtool.com/git-guide/tw/reference/git-svn.html
Yakiloo http://yakiloo.com/getting-started-git-flow/
Tomtang’s Blog http://it.tomtang.idv.tw/2013/08/svn-git.html
Yorkxin’s Blog http://blog.yorkxin.org/posts/2011/07/29/git-rebase/
Git-tower http://www.git-tower.com/
57

Git &amp; git hub v1.2

Editor's Notes

  • #4 version control system
  • #5 Distributed version control system
  • #9 時間為多久沒跟remote push
  • #11 Info : .gitignore 主要存放忽略哪些檔名 Object: 主要存放log
  • #15 SHA-1
  • #16 SHA-1
  • #17 SHA-1
  • #55 空白列或者以#開頭的列會被忽略。 可使用標準的Glob pattern。 可以/結尾,代表是目錄。 可使用!符號將特徵反過來使用。