SlideShare uma empresa Scribd logo
1 de 59
1
Git 教學
2
Git 由來
我只好花兩個星期寫 Git
Linus Torvalds
其它 SCM 太難用了
3
我們要聊什麼?
Git 基本原理
Git 基本指令操作
4
Git 物件
Blob
檔案
Tree
目錄
Commit
提交
Tag
標籤
Object ( 物件 )
5
SHA1
檔案內容
( 不含檔名 )
Commit
( 提交 )
目錄
( 目錄內檔案及其名稱 )
標籤
SHA1
D345AD
Object
SHA1 檔名
原始資料
( 檔案、目
錄、 com
mit 或標籤
原始資料 )
經過 SHA1 計算後,會把 SHA1 編碼當檔名,原始資料當檔案內容儲存
6
SHA1
int main()
{
..
}
tree 5kdaed
create project
blob hello.c 12ad2kl
tree include 4da24a
檔案內容
目錄
Commit
12ad2kl
SHA1
5kdaed
SHA1
599sk5
SHA1
int main()
{
..
}
blob hello.c 12ad2kl
tree include 4da24a
tree 5kdaed
create project
7
檔案目錄結構與 Git 物件的對映
./
src
README
lib/
hello.c
tree: 1add23
tree: 12dkab
blob: 3akdcm
tree: 98ddta
blob:99adwt
8
Git 有向無環圖 (Directed Acyclic Graph)
blob
3akdcm
tree
1add23
blob
99adwt
tree
12dkab
tree
98ddta
src lib
README
hello.c
commit
3akdcm
commit
“project create”
9
參照 (reference)
commit
tree
blob
branchtag
HEAD參照可以指向任何一個 commit
branch 指向該 branch 的最新
commit
HEAD 指向目前使用中的 branch
10
Git 有向無環圖 (Directed Acyclic Graph)
commit
3akdcm
commit
3akdcm
commit
3akdcm
tree
1add23
blob
asdf35
tree
1add23
tree
1add23
tree
1add23
blob
89adwt
tree
1add23
blob
55daet
blob
99adwt
a.txt b.txt a.txt ( 修改 )
c.txt ( 新增 )
修改 a.txt
a.txt ( 修改 )
新增 a.txt
11
Git commit/branch 有向無環圖
A B
master
Commit 的點
12
建立 branch 1
A B
masterbranch 1
13
在 branch 上修改檔案
A C
master branch 1
D
Branch 1 commit C
14
合併 (Merge): 第一種 fast forward
A B
master branch 1
C
master 所指的 commit 在 branch 1 的路徑上,所以直接把
master 往前移至 branch 1 的位置
15
在 branch 上修改檔案
A B C
master
branch 1
D
E F
master
branch 1
A B C DA
A B C EA F
16
合併 (Merge): 第二種 三方合併 (Three Way Merge)
A B C D
E F
D
master
branch 1
以共同祖先 C 做為合併的參考點,合併 branch 1 到 master
注意,被合併的是 master ,所以 branch 1 不移動
17
合併 (Merge): 第三種 rebase
A B C
master
branch 1
D
E' F'
master
branch 1
A B C DA
A B C E'A F'
原本 branch 1 是從 C 開始分支出去, rebase 可以重建分支時
的 commit ,並自動重新 commit 及套用已修改的部分
D
這 樣 可 以 讓
branch 1 透過
rebase 套 用
master 已 修 改
後的 D
18
遠端 Repository 的操作
扁
馬連
宋
Git 是分散式架構,任可人都可以把他的 Repository 與其它
遠端 Repository 同步
就算 Server 掛掉了,也能從其它人的 Repository Recover
回來
19
Git 參考流程 (Server 端 )
masterhotfixesreleasedevelopFeature-A Feature-B
Tag 0.1
Tag 0.2
Tag 1.0
Tag2.0
緊急修復
合併緊急
修復
開始進行
發布準備
只做小 bug
修正
正式發布
合併在 release
修正的 bug 們
開始
Feature-A
開始
Feature-B
合併
Feature-B
小 bug
修正
合併
Feature-A
20
Git 參考流程 (Client 端 )
master
Server
Client
master
clone
branch
Client 複製一份 Code 開始寫程式,並讓
client master 與 server master 同步
修改的部分則在 branch 進行
21
Git 參考流程 (Client 端 )
master
Server
Client
master
branch
Server 端有新修改
Client 也在 branch 進行開發
但 master 沒更新
22
Git 參考流程 (Client 端 )
master
Server
Client
master
branch
Pull (fetch + merge)
Client 與 Server 的 master 同步,
並把新的修正合併到 Branch
23
Git 參考流程 (Client 端 )
master
Server
Client
master
branch
Push
Client 把修改完後的 code Push 回 Server
24
Git 參考流程 (Client 端 ) Clone
A B
master
clone
A B
master
Server
Client
25
Git 參考流程 (Client 端 ) 建立 Branch
A B
master
A B
master
Server
Client
branch
26
Git 參考流程 (Client 端 )
A B
master
A B
master
Server
Client
branch
CD
SC
Server 有其它人 commit SC
Client 也在 branch 上改 code
Client 讓 master 與
Server 同步,並在
branch 進行修改
27
Git 參考流程 (Client 端 )
A B
master
A B
master
Server
Client
branch
CD
SC
Client 把 Server 上的
master 合併 到它的
master 保持同步
SC
Pull
(Fetch + Merge)
28
Git 參考流程 (Client 端 )
A B
master
A B
master
Server
Client
branch
CC
SC
因為 master 上修改的
東西 branch 也要用到,
所以 client 決定把
master 合併到 branch
SC
CD
這是三方合併法
master 依然在 SC 不變
29
Git 參考流程 (Client 端 )
A B
master
A B
master
Server
Client
branch
CC
SC
branch 修改完成後,合
併回 master
SC
CD CE
CF
30
Git 參考流程 (Client 端 )
A B
master
A B
master
Server
Client
branch
CC
SC
SC
CD CE
SD
Server 上又有人 commit 了
CF
31
Git 參考流程 (Client 端 )
A B
master
Server
Client
branch
CC
SC
CD CE
CF
A B
master
SC
SD
CD CE
CF
SE
Client 把其 master
合併到 Server 的
master
Push
32
頭都昏了,給鬼看呀
Master 的圖看起來很亂對不對?
用 rebase 不要用 merge 就不會那麼亂了
33
Git 的檔案類型
Tracked Files ( 受 git 追蹤的檔案 )
Untracked Files
不受追蹤的檔案
Unmodified files
尚未修改的檔案
Modified files
修改過的檔案
Ignored Files
忽略的檔案
全部的檔案
34
三種區域
Working
Directory
Staging
Area
Git directory
(repository)
git add
git commit
git checkout
( 把檔案恢復成 commit 時的內容 )
35
檔案狀態轉換
Hello.c
Print.c
Hello.htest_hello.c.DS_Store
modified filesUnmodified filesuntracked filesIgnored files
untrackedignore unmodified modified staged
git commit
git addmodify
git add
36
設定
編輯 ~/.gitconfig
git config --global user.name "User Name"
git config --global user.email "mail@xxx.xx"
還可以放照片
扁
馬
連
宋
37
建立 Git Repository
$mkdir projA # 建立 projA 目錄
$cd projA/
$git init # 初始化 git repository
Initialized empty Git repository in /home/linms/tmp/projA/.git/
$git branch # init 後會建立第一個 branch 叫 master
* master
$ls -la
total 16
drwxrwxr-x 3 linms linms 4096 12 月 15 12:03 .
drwxrwxr-x 7 linms linms 4096 12 月 15 11:57 ..
drwxrwxr-x 8 linms linms 4096 12 月 15 14:22 .git # repository 資料都放在 .git
git init 初始化 repository
git branch 查詢 branch 狀態
指令
38
加入檔案
$touch README # 建立 README 檔
$git status # 透過 git status 查詢檔案狀態
On branch master
Initial commit
Untracked files: # 列出不受追蹤的檔案
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
$git add README # 加入 README 檔
$git status # 透過 git status 查詢檔案狀態
On branch master
Initial commit
Changes to be committed: # 還沒有 commit 的檔案
(use "git rm --cached <file>..." to unstage)
new file: README
39
commit 修改結果
$git commit -m "create project" # 執行 commit
[master (root-commit) 5bf61c2] create project
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README
$git log # 查詢 commit log
commit 5bf61c204d703c5e79b2d093a38ad3706ef26778 # commit 的 SHA1 checksum
Author: Google <google@gmail.com>
Date: Mon Dec 15 14:06:39 2014 +0800
create project
$git status # 查詢目前狀態,沒事!
On branch master
nothing to commit, working directory clean
git commit commit 修改
git log 列印出 commit log
指令
40
$echo "some instruction" > README # 修改 README 檔案
$git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README # README 檔案 變成 modified
no changes added to commit (use "git add" and/or "git commit -a")
$git diff # 與 commit 前做比較
diff --git a/README b/README
index e69de29..0759421 100644
--- a/README
+++ b/README
@@ -0,0 +1 @@
+some instruction
$git add . # 加入目前目錄下,所有修改過的檔案
$git commit -m "update" # commit
41
$touch hello.c
$touch print.c
$git add hello.c # 只把 hello.c 加入 staging area
$git commit -m "add hello" # commit 時,只會 commit hello.c
$git add print.c
$git commit -m "add print"
分批 commit
可以在工作區新增修改檔案,但只把想 commit 的檔加到
staging area 後,再 commit
stage 後再修改的話,只會 commit 到進 staging area 的檔案
42
檔案恢復
unmodified modified staged
git commit
git addmodify
git checkout
git reset
git reset 可以移除已加入 staging area 的檔案,但修改後的
內容不變
git checkout 可以恢復檔案未修改成的狀態
43
刪除與搬移檔案
$touch hello.c
$touch print.c
$git add . # 把 hello.c print.c 加入 staging area
$git rm print.c # 移除 print.c, 不追蹤
$git mv hello.c hello.cpp # 把 hello.c 重新命名成 hello.cpp
git rm 移除檔案,取消追蹤
git mv 重新命名檔案
指令
44
還原 commit 記錄 (revert)
$git revert a737846 # 還原至 commit a737846
$git revert HEAD^ # 把 hello.c print.c 加入 staging area
git revert 還原至特定的 commit 記錄
指令
45
標籤
git tag <label> 新增標籤
git tag <label> <SHA1> 在特定 commit 新增標籤
git tag <label> -m "message" 新增標籤,並附上訊息
git tag -d <label> 刪除標籤
git tag 顯示所有標籤
指令
$git tag
$git tag "v1.0"
$git tag "v0.1" 5bf61c204d
$git tag
v0.1
v1.0
$git tag -d "v1.0"
Deleted tag 'v1.0' (was a737846)
$git tag
v0.1
$git tag "v0.0" 5bf61c204d -m "first tag"
$git tag
v0.0
v0.1
46
忽略的檔案設定 (ignored)
.gitignore 檔案記錄要忽略的檔案,可放在
專案目錄 ( 專案設定 ) ,或是
任何之子目錄 ( 該目錄設定 )
個人 ~/.gitignore
# Object files
*.o
*.ko
*.obj
*.elf
# Precompiled Headers
*.gch
*.pch
tmp/*
**/log
47
建立 Branch
git branch 列出目前 branch 資訊
git branch -a 列出目前 branch
git branch <branch> 建立新 branch <branch>
git branch -d <branch> 刪除 <branch>
git checkout <branch> 切換至 <branch>
git checkout -b <branch> 建立並切換至 <branch>
指令
48
Branch 操作
$ git branch branch-1 # 建立 branch-1
$ git branch # 列出 branch 資訊 , 目前在 master
branch-1
* master
$ git checkout branch-1 # 切換至 branch-1
Switched to branch 'branch-1'
$ git checkout -b branch-2 # 建立並切換至 branch-2
Switched to a new branch 'branch-2'
$ git branch
branch-1
* branch-2
master
$ git branch -d branch-1 # 刪除 branch-1
Deleted branch branch-1 (was a737846).
$ git branch
* branch-2
master
49
Branch 合併
把自己修改的 code 合併回主幹
把別人修改好的部分合併到自己的 branch
為什麼要合併?
git merge 自動合併真是太好用了!
50
Branch 的合併 (Fast Forward)
$git checkout -b feature-A # 建立新 feature-A branch
$touch featureA.txt
$git add .
$git commit -m "add feature A" # commit
$git checkout master # 切換至 master
$git merge feature-A # 把 feature-A 合併至 master
Updating c8877c8..21a8dd4
Fast-forward
featureA.txt | 0
1 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 featureA.txt
指令
git merge <branch1> … <branchN>
把 <branch1> … <branchN> 合併至目前的 branch
Fast Forward
A B C
master feature-A
A B C
master feature-A
合併
51
Branch 的合併 ( 三方合併 )
$git checkout -b feature-B
$touch feature-B.txt
$git add .
$git commit -m "feature B"
$git checkout master
$touch bugfix
$git add .
$git commit -m "bug fix"
$git merge feature-B
Merge made by the 'recursive' strategy.
feature-B.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 feature-B.txt
A B C
master
feature-B
合併
D
A B C
master
feature-B
D
D
bugfi
x
feature-B.txt
bugfix
feature-B.txt
52
Branch 的合併 (rebase)
$git checkout -b feature-C
Switched to a new branch 'feature-C'
$touch feature-c.txt
$git add .
$git commit -m "feature c"
$git checkout master
$touch bugfix
$git add .
$git commit -m "bug fix"
$git checkout feature-C
$git rebase master
First, rewinding head to replay your work on top of it...
Applying: feature c
A B C
master
feature-B
合併
Dfeature-C.txt
bugfix
A B C
master
feature-B
D'
feature-B.txt
透過 rebase 的方式合併,
可以讓各 branch 的有向循
環圖更乾淨
bugfix
53
遠端操作
54
Copy 遠端的 Repository 到本地
SSH
git clone git@controller.estinet.com/sdn-app-v2.git
HTTP/HTTPS
git clone http://controller.estinet.com/sdn-app.git
Git protocol
git clone git://controller.estinet.com/sdn-app.git
FILE
git clone file://home/git/sdn-app.git
55
Copy 遠端的 Repository 到本地
$git clone http://controller.estinet.com/estinet-controller/sdn-app.git
Cloning into 'sdn-app-v2'...
remote: Counting objects: 3713, done.
remote: Compressing objects: 100% (2121/2121), done.
remote: Total 3713 (delta 1004), reused 1617 (delta 266)
Receiving objects: 100% (3713/3713), 2.48 MiB | 0 bytes/s, done.
Resolving deltas: 100% (1004/1004), done.
Checking connectivity... done.
$cd sdn-app
$git branch -a
* dev # 目前 branch 在 dev
master
remotes/origin/HEAD -> origin/master # remotes/origin 為遠端的
remotes/origin/master # repository
指令指令
clone 從遠端下載 repository
56
Remote 設定
指令指令
remote 管理遠端
$git remote # 列出遠端所有的 repository
origin # 目前有個遠端叫 origin
$git remote -v
origin git@google.com:fanfantu/demo.git (fetch)
origin git@google.com:fanfantu/demo.git (push)
57
從遠端更新
指令指令
fetch 下載遠端的更新,可以觀察後再決定要不要合併
pull 下載遠端的更新後,自動合併
$git fetch # 下載更新
From controller.estinet.com:linms/demo
ea6cd45..2423264 master -> origin/master # 放在 origin/master
$git branch -a
* dev
master
remotes/origin/master
$git checkout origin/master # 可以切到 origin/master 看更新
$git pull origin master master # 改用 pull 直接把 origin 的更新
# 合併到 master
58
把本地的 commit 上傳回遠端
指令指令
push 把本地的 commit 上傳回遠端
$git commit -m "done" # 先 commit 完成修改
$git push origin master # 再把目前的 branch push 到
# origin/master
Counting objects: 5, done.
Writing objects: 100% (3/3), 233 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@controller.estinet.com:linms/demo.git
2423264..49047fc master -> master
59

Mais conteúdo relacionado

Mais procurados

Introduction to Java Programming Language
Introduction to Java Programming LanguageIntroduction to Java Programming Language
Introduction to Java Programming Language
jaimefrozr
 
JSF2.2で簡単webアプリケーション開発
JSF2.2で簡単webアプリケーション開発JSF2.2で簡単webアプリケーション開発
JSF2.2で簡単webアプリケーション開発
Masuji Katoda
 
Android起動周りのノウハウ
Android起動周りのノウハウAndroid起動周りのノウハウ
Android起動周りのノウハウ
chancelab
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
do_aki
 

Mais procurados (20)

今からでも遅くないSmalltalk入門
今からでも遅くないSmalltalk入門今からでも遅くないSmalltalk入門
今からでも遅くないSmalltalk入門
 
如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌
 
OSGi Presentation
OSGi PresentationOSGi Presentation
OSGi Presentation
 
Androidの新ビルドシステム
Androidの新ビルドシステムAndroidの新ビルドシステム
Androidの新ビルドシステム
 
Introduction to Java Programming Language
Introduction to Java Programming LanguageIntroduction to Java Programming Language
Introduction to Java Programming Language
 
Git workflows
Git workflowsGit workflows
Git workflows
 
例外處理實務
例外處理實務例外處理實務
例外處理實務
 
JSF2.2で簡単webアプリケーション開発
JSF2.2で簡単webアプリケーション開発JSF2.2で簡単webアプリケーション開発
JSF2.2で簡単webアプリケーション開発
 
Basics of reflection in java
Basics of reflection in javaBasics of reflection in java
Basics of reflection in java
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
FRIDA 101 Android
FRIDA 101 AndroidFRIDA 101 Android
FRIDA 101 Android
 
SOLID Principles and Design Patterns
SOLID Principles and Design PatternsSOLID Principles and Design Patterns
SOLID Principles and Design Patterns
 
Introduction to Spring Framework
Introduction to Spring FrameworkIntroduction to Spring Framework
Introduction to Spring Framework
 
AndroidとSELinux
AndroidとSELinuxAndroidとSELinux
AndroidとSELinux
 
Android起動周りのノウハウ
Android起動周りのノウハウAndroid起動周りのノウハウ
Android起動周りのノウハウ
 
Android graphic system (SurfaceFlinger) : Design Pattern's perspective
Android graphic system (SurfaceFlinger) : Design Pattern's perspectiveAndroid graphic system (SurfaceFlinger) : Design Pattern's perspective
Android graphic system (SurfaceFlinger) : Design Pattern's perspective
 
Seven Ineffective Coding Habits of Many Programmers
Seven Ineffective Coding Habits of Many ProgrammersSeven Ineffective Coding Habits of Many Programmers
Seven Ineffective Coding Habits of Many Programmers
 
Spring & hibernate
Spring & hibernateSpring & hibernate
Spring & hibernate
 
Solid principles
Solid principlesSolid principles
Solid principles
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
 

Semelhante a Git 教學

Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀
Wen-Tien Chang
 
Git使用入门
Git使用入门Git使用入门
Git使用入门
dpf2e
 
Git tutorial for windows user (給 Windows user 的 Git 教學)
Git tutorial for windows user (給 Windows user 的 Git 教學)Git tutorial for windows user (給 Windows user 的 Git 教學)
Git tutorial for windows user (給 Windows user 的 Git 教學)
Cloud Tu
 

Semelhante a Git 教學 (20)

Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹
 
Introduction to git
Introduction to gitIntroduction to git
Introduction to git
 
Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)
 
Git &amp; git hub v1.2
Git &amp; git hub v1.2Git &amp; git hub v1.2
Git &amp; git hub v1.2
 
Git in a nutshell
Git in a nutshellGit in a nutshell
Git in a nutshell
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀
 
Git basis - usage
Git basis - usageGit basis - usage
Git basis - usage
 
Git 入门实战
Git 入门实战Git 入门实战
Git 入门实战
 
Git Tutorial
Git TutorialGit Tutorial
Git Tutorial
 
Git+使用教程
Git+使用教程Git+使用教程
Git+使用教程
 
Git Essence Tutorial
Git Essence TutorialGit Essence Tutorial
Git Essence Tutorial
 
Git使用入门
Git使用入门Git使用入门
Git使用入门
 
Git 使用介绍
Git 使用介绍Git 使用介绍
Git 使用介绍
 
Git tutorial for windows user (給 Windows user 的 Git 教學)
Git tutorial for windows user (給 Windows user 的 Git 教學)Git tutorial for windows user (給 Windows user 的 Git 教學)
Git tutorial for windows user (給 Windows user 的 Git 教學)
 
Git introduction
Git introductionGit introduction
Git introduction
 
Git Tutorial 教學
Git Tutorial 教學Git Tutorial 教學
Git Tutorial 教學
 
Git教學
Git教學Git教學
Git教學
 
Git and git hub
Git and git hubGit and git hub
Git and git hub
 
Git原理与实战 201607
Git原理与实战 201607Git原理与实战 201607
Git原理与实战 201607
 
Git share
Git shareGit share
Git share
 

Git 教學

  • 2. 2 Git 由來 我只好花兩個星期寫 Git Linus Torvalds 其它 SCM 太難用了
  • 5. 5 SHA1 檔案內容 ( 不含檔名 ) Commit ( 提交 ) 目錄 ( 目錄內檔案及其名稱 ) 標籤 SHA1 D345AD Object SHA1 檔名 原始資料 ( 檔案、目 錄、 com mit 或標籤 原始資料 ) 經過 SHA1 計算後,會把 SHA1 編碼當檔名,原始資料當檔案內容儲存
  • 6. 6 SHA1 int main() { .. } tree 5kdaed create project blob hello.c 12ad2kl tree include 4da24a 檔案內容 目錄 Commit 12ad2kl SHA1 5kdaed SHA1 599sk5 SHA1 int main() { .. } blob hello.c 12ad2kl tree include 4da24a tree 5kdaed create project
  • 7. 7 檔案目錄結構與 Git 物件的對映 ./ src README lib/ hello.c tree: 1add23 tree: 12dkab blob: 3akdcm tree: 98ddta blob:99adwt
  • 8. 8 Git 有向無環圖 (Directed Acyclic Graph) blob 3akdcm tree 1add23 blob 99adwt tree 12dkab tree 98ddta src lib README hello.c commit 3akdcm commit “project create”
  • 9. 9 參照 (reference) commit tree blob branchtag HEAD參照可以指向任何一個 commit branch 指向該 branch 的最新 commit HEAD 指向目前使用中的 branch
  • 10. 10 Git 有向無環圖 (Directed Acyclic Graph) commit 3akdcm commit 3akdcm commit 3akdcm tree 1add23 blob asdf35 tree 1add23 tree 1add23 tree 1add23 blob 89adwt tree 1add23 blob 55daet blob 99adwt a.txt b.txt a.txt ( 修改 ) c.txt ( 新增 ) 修改 a.txt a.txt ( 修改 ) 新增 a.txt
  • 11. 11 Git commit/branch 有向無環圖 A B master Commit 的點
  • 12. 12 建立 branch 1 A B masterbranch 1
  • 13. 13 在 branch 上修改檔案 A C master branch 1 D Branch 1 commit C
  • 14. 14 合併 (Merge): 第一種 fast forward A B master branch 1 C master 所指的 commit 在 branch 1 的路徑上,所以直接把 master 往前移至 branch 1 的位置
  • 15. 15 在 branch 上修改檔案 A B C master branch 1 D E F master branch 1 A B C DA A B C EA F
  • 16. 16 合併 (Merge): 第二種 三方合併 (Three Way Merge) A B C D E F D master branch 1 以共同祖先 C 做為合併的參考點,合併 branch 1 到 master 注意,被合併的是 master ,所以 branch 1 不移動
  • 17. 17 合併 (Merge): 第三種 rebase A B C master branch 1 D E' F' master branch 1 A B C DA A B C E'A F' 原本 branch 1 是從 C 開始分支出去, rebase 可以重建分支時 的 commit ,並自動重新 commit 及套用已修改的部分 D 這 樣 可 以 讓 branch 1 透過 rebase 套 用 master 已 修 改 後的 D
  • 18. 18 遠端 Repository 的操作 扁 馬連 宋 Git 是分散式架構,任可人都可以把他的 Repository 與其它 遠端 Repository 同步 就算 Server 掛掉了,也能從其它人的 Repository Recover 回來
  • 19. 19 Git 參考流程 (Server 端 ) masterhotfixesreleasedevelopFeature-A Feature-B Tag 0.1 Tag 0.2 Tag 1.0 Tag2.0 緊急修復 合併緊急 修復 開始進行 發布準備 只做小 bug 修正 正式發布 合併在 release 修正的 bug 們 開始 Feature-A 開始 Feature-B 合併 Feature-B 小 bug 修正 合併 Feature-A
  • 20. 20 Git 參考流程 (Client 端 ) master Server Client master clone branch Client 複製一份 Code 開始寫程式,並讓 client master 與 server master 同步 修改的部分則在 branch 進行
  • 21. 21 Git 參考流程 (Client 端 ) master Server Client master branch Server 端有新修改 Client 也在 branch 進行開發 但 master 沒更新
  • 22. 22 Git 參考流程 (Client 端 ) master Server Client master branch Pull (fetch + merge) Client 與 Server 的 master 同步, 並把新的修正合併到 Branch
  • 23. 23 Git 參考流程 (Client 端 ) master Server Client master branch Push Client 把修改完後的 code Push 回 Server
  • 24. 24 Git 參考流程 (Client 端 ) Clone A B master clone A B master Server Client
  • 25. 25 Git 參考流程 (Client 端 ) 建立 Branch A B master A B master Server Client branch
  • 26. 26 Git 參考流程 (Client 端 ) A B master A B master Server Client branch CD SC Server 有其它人 commit SC Client 也在 branch 上改 code Client 讓 master 與 Server 同步,並在 branch 進行修改
  • 27. 27 Git 參考流程 (Client 端 ) A B master A B master Server Client branch CD SC Client 把 Server 上的 master 合併 到它的 master 保持同步 SC Pull (Fetch + Merge)
  • 28. 28 Git 參考流程 (Client 端 ) A B master A B master Server Client branch CC SC 因為 master 上修改的 東西 branch 也要用到, 所以 client 決定把 master 合併到 branch SC CD 這是三方合併法 master 依然在 SC 不變
  • 29. 29 Git 參考流程 (Client 端 ) A B master A B master Server Client branch CC SC branch 修改完成後,合 併回 master SC CD CE CF
  • 30. 30 Git 參考流程 (Client 端 ) A B master A B master Server Client branch CC SC SC CD CE SD Server 上又有人 commit 了 CF
  • 31. 31 Git 參考流程 (Client 端 ) A B master Server Client branch CC SC CD CE CF A B master SC SD CD CE CF SE Client 把其 master 合併到 Server 的 master Push
  • 33. 33 Git 的檔案類型 Tracked Files ( 受 git 追蹤的檔案 ) Untracked Files 不受追蹤的檔案 Unmodified files 尚未修改的檔案 Modified files 修改過的檔案 Ignored Files 忽略的檔案 全部的檔案
  • 34. 34 三種區域 Working Directory Staging Area Git directory (repository) git add git commit git checkout ( 把檔案恢復成 commit 時的內容 )
  • 35. 35 檔案狀態轉換 Hello.c Print.c Hello.htest_hello.c.DS_Store modified filesUnmodified filesuntracked filesIgnored files untrackedignore unmodified modified staged git commit git addmodify git add
  • 36. 36 設定 編輯 ~/.gitconfig git config --global user.name "User Name" git config --global user.email "mail@xxx.xx" 還可以放照片 扁 馬 連 宋
  • 37. 37 建立 Git Repository $mkdir projA # 建立 projA 目錄 $cd projA/ $git init # 初始化 git repository Initialized empty Git repository in /home/linms/tmp/projA/.git/ $git branch # init 後會建立第一個 branch 叫 master * master $ls -la total 16 drwxrwxr-x 3 linms linms 4096 12 月 15 12:03 . drwxrwxr-x 7 linms linms 4096 12 月 15 11:57 .. drwxrwxr-x 8 linms linms 4096 12 月 15 14:22 .git # repository 資料都放在 .git git init 初始化 repository git branch 查詢 branch 狀態 指令
  • 38. 38 加入檔案 $touch README # 建立 README 檔 $git status # 透過 git status 查詢檔案狀態 On branch master Initial commit Untracked files: # 列出不受追蹤的檔案 (use "git add <file>..." to include in what will be committed) README nothing added to commit but untracked files present (use "git add" to track) $git add README # 加入 README 檔 $git status # 透過 git status 查詢檔案狀態 On branch master Initial commit Changes to be committed: # 還沒有 commit 的檔案 (use "git rm --cached <file>..." to unstage) new file: README
  • 39. 39 commit 修改結果 $git commit -m "create project" # 執行 commit [master (root-commit) 5bf61c2] create project 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README $git log # 查詢 commit log commit 5bf61c204d703c5e79b2d093a38ad3706ef26778 # commit 的 SHA1 checksum Author: Google <google@gmail.com> Date: Mon Dec 15 14:06:39 2014 +0800 create project $git status # 查詢目前狀態,沒事! On branch master nothing to commit, working directory clean git commit commit 修改 git log 列印出 commit log 指令
  • 40. 40 $echo "some instruction" > README # 修改 README 檔案 $git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: README # README 檔案 變成 modified no changes added to commit (use "git add" and/or "git commit -a") $git diff # 與 commit 前做比較 diff --git a/README b/README index e69de29..0759421 100644 --- a/README +++ b/README @@ -0,0 +1 @@ +some instruction $git add . # 加入目前目錄下,所有修改過的檔案 $git commit -m "update" # commit
  • 41. 41 $touch hello.c $touch print.c $git add hello.c # 只把 hello.c 加入 staging area $git commit -m "add hello" # commit 時,只會 commit hello.c $git add print.c $git commit -m "add print" 分批 commit 可以在工作區新增修改檔案,但只把想 commit 的檔加到 staging area 後,再 commit stage 後再修改的話,只會 commit 到進 staging area 的檔案
  • 42. 42 檔案恢復 unmodified modified staged git commit git addmodify git checkout git reset git reset 可以移除已加入 staging area 的檔案,但修改後的 內容不變 git checkout 可以恢復檔案未修改成的狀態
  • 43. 43 刪除與搬移檔案 $touch hello.c $touch print.c $git add . # 把 hello.c print.c 加入 staging area $git rm print.c # 移除 print.c, 不追蹤 $git mv hello.c hello.cpp # 把 hello.c 重新命名成 hello.cpp git rm 移除檔案,取消追蹤 git mv 重新命名檔案 指令
  • 44. 44 還原 commit 記錄 (revert) $git revert a737846 # 還原至 commit a737846 $git revert HEAD^ # 把 hello.c print.c 加入 staging area git revert 還原至特定的 commit 記錄 指令
  • 45. 45 標籤 git tag <label> 新增標籤 git tag <label> <SHA1> 在特定 commit 新增標籤 git tag <label> -m "message" 新增標籤,並附上訊息 git tag -d <label> 刪除標籤 git tag 顯示所有標籤 指令 $git tag $git tag "v1.0" $git tag "v0.1" 5bf61c204d $git tag v0.1 v1.0 $git tag -d "v1.0" Deleted tag 'v1.0' (was a737846) $git tag v0.1 $git tag "v0.0" 5bf61c204d -m "first tag" $git tag v0.0 v0.1
  • 46. 46 忽略的檔案設定 (ignored) .gitignore 檔案記錄要忽略的檔案,可放在 專案目錄 ( 專案設定 ) ,或是 任何之子目錄 ( 該目錄設定 ) 個人 ~/.gitignore # Object files *.o *.ko *.obj *.elf # Precompiled Headers *.gch *.pch tmp/* **/log
  • 47. 47 建立 Branch git branch 列出目前 branch 資訊 git branch -a 列出目前 branch git branch <branch> 建立新 branch <branch> git branch -d <branch> 刪除 <branch> git checkout <branch> 切換至 <branch> git checkout -b <branch> 建立並切換至 <branch> 指令
  • 48. 48 Branch 操作 $ git branch branch-1 # 建立 branch-1 $ git branch # 列出 branch 資訊 , 目前在 master branch-1 * master $ git checkout branch-1 # 切換至 branch-1 Switched to branch 'branch-1' $ git checkout -b branch-2 # 建立並切換至 branch-2 Switched to a new branch 'branch-2' $ git branch branch-1 * branch-2 master $ git branch -d branch-1 # 刪除 branch-1 Deleted branch branch-1 (was a737846). $ git branch * branch-2 master
  • 49. 49 Branch 合併 把自己修改的 code 合併回主幹 把別人修改好的部分合併到自己的 branch 為什麼要合併? git merge 自動合併真是太好用了!
  • 50. 50 Branch 的合併 (Fast Forward) $git checkout -b feature-A # 建立新 feature-A branch $touch featureA.txt $git add . $git commit -m "add feature A" # commit $git checkout master # 切換至 master $git merge feature-A # 把 feature-A 合併至 master Updating c8877c8..21a8dd4 Fast-forward featureA.txt | 0 1 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 featureA.txt 指令 git merge <branch1> … <branchN> 把 <branch1> … <branchN> 合併至目前的 branch Fast Forward A B C master feature-A A B C master feature-A 合併
  • 51. 51 Branch 的合併 ( 三方合併 ) $git checkout -b feature-B $touch feature-B.txt $git add . $git commit -m "feature B" $git checkout master $touch bugfix $git add . $git commit -m "bug fix" $git merge feature-B Merge made by the 'recursive' strategy. feature-B.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 feature-B.txt A B C master feature-B 合併 D A B C master feature-B D D bugfi x feature-B.txt bugfix feature-B.txt
  • 52. 52 Branch 的合併 (rebase) $git checkout -b feature-C Switched to a new branch 'feature-C' $touch feature-c.txt $git add . $git commit -m "feature c" $git checkout master $touch bugfix $git add . $git commit -m "bug fix" $git checkout feature-C $git rebase master First, rewinding head to replay your work on top of it... Applying: feature c A B C master feature-B 合併 Dfeature-C.txt bugfix A B C master feature-B D' feature-B.txt 透過 rebase 的方式合併, 可以讓各 branch 的有向循 環圖更乾淨 bugfix
  • 54. 54 Copy 遠端的 Repository 到本地 SSH git clone git@controller.estinet.com/sdn-app-v2.git HTTP/HTTPS git clone http://controller.estinet.com/sdn-app.git Git protocol git clone git://controller.estinet.com/sdn-app.git FILE git clone file://home/git/sdn-app.git
  • 55. 55 Copy 遠端的 Repository 到本地 $git clone http://controller.estinet.com/estinet-controller/sdn-app.git Cloning into 'sdn-app-v2'... remote: Counting objects: 3713, done. remote: Compressing objects: 100% (2121/2121), done. remote: Total 3713 (delta 1004), reused 1617 (delta 266) Receiving objects: 100% (3713/3713), 2.48 MiB | 0 bytes/s, done. Resolving deltas: 100% (1004/1004), done. Checking connectivity... done. $cd sdn-app $git branch -a * dev # 目前 branch 在 dev master remotes/origin/HEAD -> origin/master # remotes/origin 為遠端的 remotes/origin/master # repository 指令指令 clone 從遠端下載 repository
  • 56. 56 Remote 設定 指令指令 remote 管理遠端 $git remote # 列出遠端所有的 repository origin # 目前有個遠端叫 origin $git remote -v origin git@google.com:fanfantu/demo.git (fetch) origin git@google.com:fanfantu/demo.git (push)
  • 57. 57 從遠端更新 指令指令 fetch 下載遠端的更新,可以觀察後再決定要不要合併 pull 下載遠端的更新後,自動合併 $git fetch # 下載更新 From controller.estinet.com:linms/demo ea6cd45..2423264 master -> origin/master # 放在 origin/master $git branch -a * dev master remotes/origin/master $git checkout origin/master # 可以切到 origin/master 看更新 $git pull origin master master # 改用 pull 直接把 origin 的更新 # 合併到 master
  • 58. 58 把本地的 commit 上傳回遠端 指令指令 push 把本地的 commit 上傳回遠端 $git commit -m "done" # 先 commit 完成修改 $git push origin master # 再把目前的 branch push 到 # origin/master Counting objects: 5, done. Writing objects: 100% (3/3), 233 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To git@controller.estinet.com:linms/demo.git 2423264..49047fc master -> master
  • 59. 59