SlideShare a Scribd company logo
1 of 71
Download to read offline
Yet another introduction to
from the bottom up
http://ihower.tw
2013/8/3@COSCUP
我是誰
• 張⽂文鈿 a.k.a. ihower
• http://ihower.tw
• CTO, Faria Systems
• http://faria.co
• Organizer of RubyConf Taiwan
• http://rubyconf.tw
• Git user since 2008
如何不⽤用 git add 和 git commit
指令進⾏行 commit 動作?
⼩小測驗
如何不⽤用 git add 和 git commit
指令進⾏行 commit 動作?
⼩小測驗
(⽤用GUI操作不算,謝謝!)
我的版本控制之路
• 2002 ⺫⽬目錄管理法 (定時 copy 備份⼀一次)
• 2005 SubVersion
• 2007 SVK
• 2008 Git (像 SVN ⼀一樣只會 push/pull)
• 2009 Git (開始習慣 feature branches)
• 2011 Git (開始習慣使⽤用 rebase)
Agenda
• 為什麼需要「版本控制系統」?
• Git 是如何做「版本控制系統」的?
• 結論
1. 為什麼需要
版本控制系統
Version Control System
軟體開發的基本⼯工具
• 版本控制系統不祇可以幫助妳追蹤修訂
⼿手上的⼯工作進度,讓妳在千鈞⼀一髮之際
還能拾回過往⾟辛苦的結晶,甚⾄至能夠讓
妳跟其他⼈人協同⼯工作、合作無間。
http://jedi.org/blog/archives/004784.html
• 那些台灣軟體產業所缺少的 – 版本控制
系統
http://blog.ez2learn.com/2011/10/20/taiwan-software-lacking-of-vcs/
2. Git 是如何做
版本控制系統的?
⽤用 Graph 概念理解
檔案A⺫⽬目錄 檔案B
working area
檔案內容A
檔案內容B
git add .
(將⺫⽬目錄節點和檔案內容節點關聯起來)
⺫⽬目錄
檔案內容A
V1
檔案內容B
V1
git commit
(產⽣生commit節點,指向⺫⽬目錄節點)
⺫⽬目
錄
V1
Commit
V1
檔案內容B
V1
git commit (cont.)
(產⽣生commitV2節點,指向parent commit節點)
⺫⽬目
錄
V1
Commit
V1
檔案內容A
V2
⺫⽬目
錄
V2
Commit
V2
檔案內容A
V1
檔案內容B不變
Git is objects database
Blob
object
Blob
object
Tree
object
Commit
object
儲存內容(demo)
• echo hello > hello.txt
• git add .
• tree .git
• 存在 .git/objects/ce/
013625030ba8dba906f756967f9e9ca394464a
• 這是 hello 內容的 SHA1
• printf "blob 6000hellon" | shasum
• echo "hello" | git hash-object --stdin
• git cat-file -p ce013625030ba8dba906f756967f9e9ca394464a
blob object 的實際檔案名稱
.git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
hello
blob
ce0136
Blob object
• Git 是 Content-addressable filesystem
• Blob 沒有 metadata,沒有檔名資訊
• Blob object 的儲存檔名,是根據內容產⽣生的
SHA1
• 內容⼀一樣的檔案,根據 SHA1 演算法只會存
成同⼀一份檔案,不會浪費空間
儲存⺫⽬目錄(demo)
• git write-tree
(根據 staging area 產⽣生 Tree object)
• git cat-file -p
aaa96ced2d9a1c8e72c56b253a0e2fe78393feb7
Tree object 的實際檔案名稱
.git/objects/aa/a96ced2d9a1c8e72c56b253a0e2fe78393feb7
100644 blob ce0136 hello.txt
Tree
hello
blob
ce0136aaa96c
儲存⺫⽬目錄 (cont.)
• 再新增⼀一個檔案和⼦子⺫⽬目錄
• touch hola.txt & mkdir coscup & touch coscup/bonjour.txt
• git add .
• git write-tree
• git cat-file -p
117a5b49c6de3adc2a1834dc5907189bf84f3d7a
• git cat-file -p
122f77b55b5753c456b22d96a0b63103ced46334
040000 tree 122f77 coscup
100644 blob ce0136 hello.txt
100644 blob e69de2 hola.txt
Tree
hello
blob
ce0136
117a5
blob
e69de2
100644 blob e69de2 bonjour.txt
Tree
122f77
040000 tree 122f77 coscup
100644 blob ce0136 hello.txt
100644 blob e69de2 hola.txt
Tree
hello
blob
ce0136
117a5
blob
e69de2
100644 blob e69de2 bonjour.txt
Tree
122f77
Tree object
• Git ⽤用 Tree object 把 Blob object 組織起來,包
括檔案命名和⺫⽬目錄結構
• Blob object 並沒有包含檔案名稱和⺫⽬目錄結構
• Tree object 裡⾯面還可以有 Tree object ⼦子⺫⽬目錄
• Tree object 的檔名,⼀一樣是根據內容產⽣生
SHA1
遞交 Commit (demo)
• git commit-tree
117a5b49c6de3adc2a1834dc5907189bf84f3d7a -m
“First commit”
• git cat-file -p 058d2d
• cat .git/HEAD
• git update-ref refs/heads/master 058d2d
• git rev-parse HEAD
Commit object
指向 root tree SHA1
040000 tree 122f77 coscup
100644 blob ce0136 hello.txt
100644 blob e69de2 hola.txt
Tree
117a5
tree 117a5b
author ihower 1375381139 +0800
committer ihower1375381139 +0800
First commit
0e2757commit
master
HEAD
再次遞交 Commit (demo)
• 修改 hola.txt 檔案
• git commit -am “Second commit”
• git cat-file -p 24eac58
Commit object
也指向 parent commit SHA1
040000 tree 122f77 coscup
100644 blob ce0136 hello.txt
100644 blob e69de2 hola.txt
Tree
117a5
tree 117a5b
author ihower 1375381139 +0800
committer ihower1375381139 +0800
First commit
058d2dcommit
040000 tree 122f77 coscup
100644 blob ce0136 hello.txt
100644 blob 38a5fc hola.txt
Tree
5f398a
tree 5f398a5
parent 058d2
author ihower 1375381779 +0800
committer ihower 1375381779 +0800
Second commit
24eac58commit
Commit object
• 紀錄 root tree SHA1
• 紀錄 parent commit SHA1
• 紀錄作者、時間和 commit message 資訊
• Commit object 的檔名,⼀一樣是根據內容產⽣生
SHA1
Git commit 動作流程
• ⽤用內容產⽣生 blob object
• 寫⼊入 file mode, blob SHA1, file name 到 staging area
• 根據 staging area 產⽣生 Tree object
• ⽤用 root tree SHA1 和 parent commit SHA1 產⽣生
commit object
• ⽤用 commit SHA1 更新 master 參考
如何不⽤用 git add 和 git commit
指令進⾏行 commit 動作?
echo "hola" | git hash-object -w --stdin
git update-index --add --cacheinfo 
100644 5c1b14949828006ed75a3e8858957f86a2f7e2eb hola.txt
git write-tree
git commit-tree 27b9d5 -m "Second commit" -p 30b060
git update-ref refs/heads/master 97b806c9e5561a08e0df1f1a60857baad3a1f02e
git add
git commit
https://gist.github.com/ihower/6132576
測驗解答
Tag object
(Tag 分兩種:annotated tag 才會產⽣生 object)
• git tag -a release
• git rev-parse release
• git cat-file -p 2450f3
caa307commitobject 24eac5
type commit
tag release
tagger ihower 1375383070 +0800
Release!
2450f3tag
⼩小結論:
Git 有四種 Objects
• Blob
• Tree
• Commit
• Tag
References 參照
• 單純⼀一個檔案紀錄⼀一個 SHA1參照
• Tag reference
• Branch reference
• HEAD reference (指向⺫⽬目前所在的 branch)
Tag reference
• git tag tmp
• cat .git/refs/tags/tmp
• 不像 object 資訊豐富,reference 內容只
有 Commit object SHA1
24eac5commit24eac5
refs/tags/tmp
Branch 和 HEAD
reference
• 每次 commit 就會變動 reference
• HEAD 指向⺫⽬目前在哪⼀一個 branch
• cat .git/HEAD
• cat .git/refs/heads/master
24eac5commit24eac5
refs/heads/master
ref: refs/heads/
master
HEAD
如果在 Branch 上產⽣生新
Commit...
24eac5commit24eac5
refs/heads/master
ref: refs/heads/
develop
HEAD
55cbccommit
Branch reference 就會⾃自動
改指到新的 commit
24eac5commit
55cbcb
refs/heads/master
ref: refs/heads/
master
HEAD
55cbcbcommit
開新 Branch develop
git branch develop
55cbcbcommit55cbcb
refs/heads/master
55cbcb
refs/heads/develop
ref: refs/heads/
master
HEAD
切換 Branch:改HEAD
git checkout develop
55cbcbcommit55cbcb
refs/heads/master
55cbcb
refs/heads/develop
ref: refs/heads/
develop
HEAD
commit
caa307
refs/heads/master
caa307
refs/heads/develop
commit
commit commit
40b603da103e
合併 Branch
git merge develop
commit
caa307
refs/heads/master
caa307
refs/heads/develop
commit
commit commit
tree 5f398a5
parent 40b603
parent da103e
author ihower 1375381779 +0800
committer ihower 1375381779 +0800
Merge branch ‘develop’ into master
commit
40b603da103e
產⽣生的 merge
commit 節點
有兩個 parents
commitcaa307
refs/heads/master
caa307
refs/heads/develop
commit
commit
另⼀一種合併情況 fast-forward
將 develop 合併進 master
commit
caa307
refs/heads/master
caa307
refs/heads/develop
commit
commit
另⼀一種合併情況 fast-forward
沒有產⽣生 merge 節點,只是移動參考
Git 如何 Merge
commits?
• Git 進⾏行了⼀一個 Three-way merge 的動作
• three-way merge 除了要合併的兩個檔
案,還加上兩個檔案的共同祖先。如此
可以⼤大⼤大減少⼈人為處理 conflict 的情況。
• two-way merge 則只⽤用兩個檔案進⾏行合併
(svn預設即 two-way merge)
1
2
1
2
3
4
A B
Two-way merge
1
2
1
2
3
4
A B
Two-way merge
1
2
1
2
3
4
A B
Two-way merge
1
2
1
2
3
4
A B
1
2
?
Two-way merge
1
2
1
2
3
4
A B
1
2
?
Conflict!
需要⼈人⼯工判斷
Two-way merge
1
2
1
2
3
4
A B
1
2
1
2
3
4
A B
Three-way merge:
先找出 AB 共同的祖先
1
2
1
2
3
4
A B
1
2
3
Three-way merge:
先找出 AB 共同的祖先
1
2
1
2
3
4
A B
1
2
3
Three-way merge:
先找出 AB 共同的祖先
1
2
1
2
3
4
A B
1
2
3
Three-way merge:
先找出 AB 共同的祖先
1
2
1
2
3
4
A B
1
2
3
Three-way merge:
先找出 AB 共同的祖先
-3
1
2
1
2
3
4
A B
1
2
3
Three-way merge:
先找出 AB 共同的祖先
-3 +4
1
2
1
2
3
4
A B
1
2
3
Three-way merge:
先找出 AB 共同的祖先
-3 +4
1
2
1
2
3
4
A B
1
2
3
Three-way merge:
先找出 AB 共同的祖先
-3 +4
1
2
1
2
3
4
A B
1
2
4
1
2
3
Three-way merge:
先找出 AB 共同的祖先
-3 +4
1
2
1
2
3
4
A B
1
2
4
⾃自動合併出
正確結果
1
2
3
Three-way merge:
先找出 AB 共同的祖先
-3 +4
Conclusion
additive
• 跟 Unix filesystem 有類似的結構,除了
• Git filesystem 的設計是⼀一直累加的,不會
有東⻄西被刪除
• Blob object 沒有 metadata
Reference is cheap
• 開新 branch 只是 refs ⽽而已,直到 commit
前都沒有負擔。
• 不像有些VCS 開分⽀支會複製⼀一份原始
碼,⾮非常耗費資源。
Integrity
• SHA1 是內容的 checksum
• 如果檔案內容有損毀,就會發現跟SHA1不
同。如果 tree 被偷改檔名,也會被發現。
• HEAD 指向的 SHA1,就是整個 repository
的 checksum
• 這在分散式系統⾮非常重要:資料從⼀一個開
發者傳到另⼀一個開發者時,確保資料沒有
被修改。
Distributed
• Local development
• 集中式的VCS 系統,沒網路就不能開發,無法
commit,無法看 history log。
• 分散式 CSV 系統即使沒網路,照常可以 commit
和看 history log。
• 不⽤用擔⼼心備份,每個⼈人都有⼀一份完整的
• 開源專案:誰有權限 commit? 沒關係,你可以 fork
• ⽀支援多種⼯工作流程 Workflow
"I will, in fact, claim that the difference between a bad
programmer and a good one is whether he considers
his code or his data structures more important. Bad
programmers worry about the code. Good
programmers worry about data structures and their
relationships."
- Linus Torvalds
參考資料
• http://ihower.tw/blog/category/git
• http://pragprog.com/screencasts/v-jwsceasy/source-control-made-easy
• http://www.youtube.com/watch?v=4XpnKHJAok8 Linux 的演講
• http://www.softdevtube.com/2013/02/05/advanced-git/
• http://git-scm.com/book
• Git from the bottom up
http://ftp.newartisans.com/pub/git.from.bottom.up.pdf
• Version Control with Git, O'Reilly
• http://nfarina.com/post/9868516270/git-is-simpler
• http://think-like-a-git.net/sections/graph-theory.html
謝謝,請多指教
http://ihower.tw

More Related Content

What's hot

Introduction to git
Introduction to gitIntroduction to git
Introduction to gitBo-Yi Wu
 
Git flow 與團隊合作
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作Bo-Yi Wu
 
初心者 Git 上手攻略
初心者 Git 上手攻略初心者 Git 上手攻略
初心者 Git 上手攻略Lucien Lee
 
Git & Sourcetree 介紹
Git & Sourcetree 介紹Git & Sourcetree 介紹
Git & Sourcetree 介紹Adison wu
 
連哈秋都懂的Git教學
連哈秋都懂的Git教學連哈秋都懂的Git教學
連哈秋都懂的Git教學hydai
 
工程師必備第一工具 - Git
工程師必備第一工具 - Git工程師必備第一工具 - Git
工程師必備第一工具 - GitAlan Tsai
 
幸福快樂的完美結局
幸福快樂的完美結局幸福快樂的完美結局
幸福快樂的完美結局Anna Su
 
Git and git hub
Git and git hubGit and git hub
Git and git hub唯 李
 
Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰Will Huang
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學littlebtc
 
Git 入門與實作
Git 入門與實作Git 入門與實作
Git 入門與實作奕浦 郭
 
Continuous Delivery with Ansible x GitLab CI
Continuous Delivery with Ansible x GitLab CIContinuous Delivery with Ansible x GitLab CI
Continuous Delivery with Ansible x GitLab CIChu-Siang Lai
 
A successful git branching model 導讀
A successful git branching model 導讀A successful git branching model 導讀
A successful git branching model 導讀Wen Liao
 
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)Chu-Siang Lai
 
Visual Studio Code 快速上手指南
Visual Studio Code 快速上手指南Visual Studio Code 快速上手指南
Visual Studio Code 快速上手指南Shengyou Fan
 
ALPHAhackathon: How to collaborate
ALPHAhackathon: How to collaborateALPHAhackathon: How to collaborate
ALPHAhackathon: How to collaborateWen-Tien Chang
 

What's hot (20)

Introduction to git
Introduction to gitIntroduction to git
Introduction to git
 
Git flow 與團隊合作
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作
 
初心者 Git 上手攻略
初心者 Git 上手攻略初心者 Git 上手攻略
初心者 Git 上手攻略
 
Git 經驗分享
Git 經驗分享Git 經驗分享
Git 經驗分享
 
Git由超淺入超深
Git由超淺入超深Git由超淺入超深
Git由超淺入超深
 
Git & Sourcetree 介紹
Git & Sourcetree 介紹Git & Sourcetree 介紹
Git & Sourcetree 介紹
 
連哈秋都懂的Git教學
連哈秋都懂的Git教學連哈秋都懂的Git教學
連哈秋都懂的Git教學
 
工程師必備第一工具 - Git
工程師必備第一工具 - Git工程師必備第一工具 - Git
工程師必備第一工具 - Git
 
Git 版本控制 (使用教學)
Git 版本控制 (使用教學)Git 版本控制 (使用教學)
Git 版本控制 (使用教學)
 
幸福快樂的完美結局
幸福快樂的完美結局幸福快樂的完美結局
幸福快樂的完美結局
 
Git and git hub
Git and git hubGit and git hub
Git and git hub
 
Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學
 
Git 入門與實作
Git 入門與實作Git 入門與實作
Git 入門與實作
 
Gitlab
GitlabGitlab
Gitlab
 
Continuous Delivery with Ansible x GitLab CI
Continuous Delivery with Ansible x GitLab CIContinuous Delivery with Ansible x GitLab CI
Continuous Delivery with Ansible x GitLab CI
 
A successful git branching model 導讀
A successful git branching model 導讀A successful git branching model 導讀
A successful git branching model 導讀
 
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
 
Visual Studio Code 快速上手指南
Visual Studio Code 快速上手指南Visual Studio Code 快速上手指南
Visual Studio Code 快速上手指南
 
ALPHAhackathon: How to collaborate
ALPHAhackathon: How to collaborateALPHAhackathon: How to collaborate
ALPHAhackathon: How to collaborate
 

Viewers also liked

淺談 Startup 公司的軟體開發流程 v2
淺談 Startup 公司的軟體開發流程 v2淺談 Startup 公司的軟體開發流程 v2
淺談 Startup 公司的軟體開發流程 v2Wen-Tien Chang
 
那些 Functional Programming 教我的事
那些 Functional Programming 教我的事那些 Functional Programming 教我的事
那些 Functional Programming 教我的事Wen-Tien Chang
 
Ruby 程式語言綜覽簡介
Ruby 程式語言綜覽簡介Ruby 程式語言綜覽簡介
Ruby 程式語言綜覽簡介Wen-Tien Chang
 
Exception Handling: Designing Robust Software in Ruby (with presentation note)
Exception Handling: Designing Robust Software in Ruby (with presentation note)Exception Handling: Designing Robust Software in Ruby (with presentation note)
Exception Handling: Designing Robust Software in Ruby (with presentation note)Wen-Tien Chang
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩Wen-Tien Chang
 
A brief introduction to SPDY - 邁向 HTTP/2.0
A brief introduction to SPDY - 邁向 HTTP/2.0A brief introduction to SPDY - 邁向 HTTP/2.0
A brief introduction to SPDY - 邁向 HTTP/2.0Wen-Tien Chang
 
從 Classes 到 Objects: 那些 OOP 教我的事
從 Classes 到 Objects: 那些 OOP 教我的事從 Classes 到 Objects: 那些 OOP 教我的事
從 Classes 到 Objects: 那些 OOP 教我的事Wen-Tien Chang
 
RubyConf Taiwan 2011 Opening & Closing
RubyConf Taiwan 2011 Opening & ClosingRubyConf Taiwan 2011 Opening & Closing
RubyConf Taiwan 2011 Opening & ClosingWen-Tien Chang
 
RubyConf Taiwan 2012 Opening & Closing
RubyConf Taiwan 2012 Opening & ClosingRubyConf Taiwan 2012 Opening & Closing
RubyConf Taiwan 2012 Opening & ClosingWen-Tien Chang
 
Exception Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in RubyException Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in RubyWen-Tien Chang
 
RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試Wen-Tien Chang
 
RSpec on Rails Tutorial
RSpec on Rails TutorialRSpec on Rails Tutorial
RSpec on Rails TutorialWen-Tien Chang
 
BDD style Unit Testing
BDD style Unit TestingBDD style Unit Testing
BDD style Unit TestingWen-Tien Chang
 
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean StartupWen-Tien Chang
 
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習台灣資料科學年會
 

Viewers also liked (18)

淺談 Startup 公司的軟體開發流程 v2
淺談 Startup 公司的軟體開發流程 v2淺談 Startup 公司的軟體開發流程 v2
淺談 Startup 公司的軟體開發流程 v2
 
那些 Functional Programming 教我的事
那些 Functional Programming 教我的事那些 Functional Programming 教我的事
那些 Functional Programming 教我的事
 
Ruby 程式語言綜覽簡介
Ruby 程式語言綜覽簡介Ruby 程式語言綜覽簡介
Ruby 程式語言綜覽簡介
 
Exception Handling: Designing Robust Software in Ruby (with presentation note)
Exception Handling: Designing Robust Software in Ruby (with presentation note)Exception Handling: Designing Robust Software in Ruby (with presentation note)
Exception Handling: Designing Robust Software in Ruby (with presentation note)
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
 
A brief introduction to SPDY - 邁向 HTTP/2.0
A brief introduction to SPDY - 邁向 HTTP/2.0A brief introduction to SPDY - 邁向 HTTP/2.0
A brief introduction to SPDY - 邁向 HTTP/2.0
 
從 Classes 到 Objects: 那些 OOP 教我的事
從 Classes 到 Objects: 那些 OOP 教我的事從 Classes 到 Objects: 那些 OOP 教我的事
從 Classes 到 Objects: 那些 OOP 教我的事
 
Ruby 1.9
Ruby 1.9Ruby 1.9
Ruby 1.9
 
RubyConf Taiwan 2011 Opening & Closing
RubyConf Taiwan 2011 Opening & ClosingRubyConf Taiwan 2011 Opening & Closing
RubyConf Taiwan 2011 Opening & Closing
 
RubyConf Taiwan 2012 Opening & Closing
RubyConf Taiwan 2012 Opening & ClosingRubyConf Taiwan 2012 Opening & Closing
RubyConf Taiwan 2012 Opening & Closing
 
Exception Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in RubyException Handling: Designing Robust Software in Ruby
Exception Handling: Designing Robust Software in Ruby
 
RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試RSpec 讓你愛上寫測試
RSpec 讓你愛上寫測試
 
RSpec on Rails Tutorial
RSpec on Rails TutorialRSpec on Rails Tutorial
RSpec on Rails Tutorial
 
RSpec & TDD Tutorial
RSpec & TDD TutorialRSpec & TDD Tutorial
RSpec & TDD Tutorial
 
BDD style Unit Testing
BDD style Unit TestingBDD style Unit Testing
BDD style Unit Testing
 
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup
 
Git and Github
Git and GithubGit and Github
Git and Github
 
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
 

Similar to Yet another introduction to Git - from the bottom up

Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)flylon
 
Git basis - usage
Git basis - usageGit basis - usage
Git basis - usageEason Cao
 
Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹PingLun Liao
 
Learn git
Learn gitLearn git
Learn git甘 李
 
Git & git flow
Git & git flowGit & git flow
Git & git flowAmo Wu
 
Git introduction
Git introductionGit introduction
Git introductionmythnc
 
Git原理与实战 201607
Git原理与实战 201607Git原理与实战 201607
Git原理与实战 201607Charles Tang
 
Git 使用介绍
Git 使用介绍Git 使用介绍
Git 使用介绍medcl
 
Git flow
Git flowGit flow
Git flowshaokun
 
Git 入门实战
Git 入门实战Git 入门实战
Git 入门实战icy leaf
 
Git+使用教程
Git+使用教程Git+使用教程
Git+使用教程gemron
 
大家應該都要會的工具 Git 從放棄到會用2-分支篇
大家應該都要會的工具 Git   從放棄到會用2-分支篇大家應該都要會的工具 Git   從放棄到會用2-分支篇
大家應該都要會的工具 Git 從放棄到會用2-分支篇Alan Tsai
 
Git & git hub v1.2
Git & git hub v1.2Git & git hub v1.2
Git & git hub v1.2Chris Chen
 
Git内部培训文档
Git内部培训文档Git内部培训文档
Git内部培训文档superwen
 
COSCUP 2015 開源之道-Git工作坊教學簡報
COSCUP 2015 開源之道-Git工作坊教學簡報COSCUP 2015 開源之道-Git工作坊教學簡報
COSCUP 2015 開源之道-Git工作坊教學簡報Bachue Zhou
 
twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC#38 How we migrate tfs to git(using azure dev ops) twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC#38 How we migrate tfs to git(using azure dev ops) twMVC
 

Similar to Yet another introduction to Git - from the bottom up (20)

Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)
 
Git 教學
Git 教學Git 教學
Git 教學
 
Git basis - usage
Git basis - usageGit basis - usage
Git basis - usage
 
Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹
 
Learn git
Learn gitLearn git
Learn git
 
Git & git flow
Git & git flowGit & git flow
Git & git flow
 
Git introduction
Git introductionGit introduction
Git introduction
 
Git原理与实战 201607
Git原理与实战 201607Git原理与实战 201607
Git原理与实战 201607
 
Git 使用介绍
Git 使用介绍Git 使用介绍
Git 使用介绍
 
Git flow
Git flowGit flow
Git flow
 
Git 入门实战
Git 入门实战Git 入门实战
Git 入门实战
 
Git教學
Git教學Git教學
Git教學
 
Git+使用教程
Git+使用教程Git+使用教程
Git+使用教程
 
Execution
ExecutionExecution
Execution
 
大家應該都要會的工具 Git 從放棄到會用2-分支篇
大家應該都要會的工具 Git   從放棄到會用2-分支篇大家應該都要會的工具 Git   從放棄到會用2-分支篇
大家應該都要會的工具 Git 從放棄到會用2-分支篇
 
Git Tutorial
Git TutorialGit Tutorial
Git Tutorial
 
Git & git hub v1.2
Git & git hub v1.2Git & git hub v1.2
Git & git hub v1.2
 
Git内部培训文档
Git内部培训文档Git内部培训文档
Git内部培训文档
 
COSCUP 2015 開源之道-Git工作坊教學簡報
COSCUP 2015 開源之道-Git工作坊教學簡報COSCUP 2015 開源之道-Git工作坊教學簡報
COSCUP 2015 開源之道-Git工作坊教學簡報
 
twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC#38 How we migrate tfs to git(using azure dev ops) twMVC#38 How we migrate tfs to git(using azure dev ops)
twMVC#38 How we migrate tfs to git(using azure dev ops)
 

More from Wen-Tien Chang

⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨Wen-Tien Chang
 
Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Wen-Tien Chang
 
A brief introduction to Machine Learning
A brief introduction to Machine LearningA brief introduction to Machine Learning
A brief introduction to Machine LearningWen-Tien Chang
 
Service-Oriented Design and Implement with Rails3
Service-Oriented Design and Implement with Rails3Service-Oriented Design and Implement with Rails3
Service-Oriented Design and Implement with Rails3Wen-Tien Chang
 
Distributed Ruby and Rails
Distributed Ruby and RailsDistributed Ruby and Rails
Distributed Ruby and RailsWen-Tien Chang
 
Ruby 入門 第一次就上手
Ruby 入門 第一次就上手Ruby 入門 第一次就上手
Ruby 入門 第一次就上手Wen-Tien Chang
 

More from Wen-Tien Chang (11)

⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨
 
Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛
 
A brief introduction to Machine Learning
A brief introduction to Machine LearningA brief introduction to Machine Learning
A brief introduction to Machine Learning
 
Service-Oriented Design and Implement with Rails3
Service-Oriented Design and Implement with Rails3Service-Oriented Design and Implement with Rails3
Service-Oriented Design and Implement with Rails3
 
Rails3 changesets
Rails3 changesetsRails3 changesets
Rails3 changesets
 
遇見 Ruby on Rails
遇見 Ruby on Rails遇見 Ruby on Rails
遇見 Ruby on Rails
 
Designing Ruby APIs
Designing Ruby APIsDesigning Ruby APIs
Designing Ruby APIs
 
Rails Security
Rails SecurityRails Security
Rails Security
 
Rails Performance
Rails PerformanceRails Performance
Rails Performance
 
Distributed Ruby and Rails
Distributed Ruby and RailsDistributed Ruby and Rails
Distributed Ruby and Rails
 
Ruby 入門 第一次就上手
Ruby 入門 第一次就上手Ruby 入門 第一次就上手
Ruby 入門 第一次就上手
 

Yet another introduction to Git - from the bottom up