git由超淺入超深

205
跟著咩起爽

Upload: -lamb-mei

Post on 17-Jul-2015

577 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Git由超淺入超深

跟著⽺羊⼩小咩⼀一起爽

Page 2: Git由超淺入超深

Blog : lamb-mei.com

⽺羊⼩小咩 Lamb MeiE-mail : [email protected]

FB : https://www.facebook.com/lamb.mei

GitHub:https://github.com/lamb-mei/

Page 3: Git由超淺入超深

爽 咩

世人的誤解

Page 4: Git由超淺入超深

我是

圖⽚片來源 http://www.dep.taipei.gov.tw/site/tcg/public/MMO/dep_MMO/0129.jpg

Page 5: Git由超淺入超深

今天的主題

圖⽚片來源 http://newsget-cache.stor.sinaapp.com/19e004423dfc63cc62576f113e68af04.jpg

Page 6: Git由超淺入超深
Page 7: Git由超淺入超深

圖⽚片來源:http://img04.tooopen.com/images/20121024/tooopen_201210241527566827.jpg http://s1.t.itc.cn/mblog/pic/20125_18_9/f_28548972594774707.gif

Page 8: Git由超淺入超深

為什麼要使⽤用 GIT

Page 9: Git由超淺入超深

為什麼要使⽤用 Git分散式

速度快

⼤大神都在⽤用

⼤大家都在⽤用

不⽤用很落伍

公司強迫我要⽤用

開分⽀支(branch)很容易

⼤大部份操作本地端可完成

不需中央伺服器版本庫毀損的⾵風險較低

超潮der

Page 10: Git由超淺入超深

對沒⽤用過的⼈人來說

圖⽚片來源 http://s279.photobucket.com/user/sherlock1031/media/Dectective%20Dissicusion%20Group/Galileo106.jpg.html

Page 11: Git由超淺入超深

對沒⽤用過的⼈人來說

圖⽚片來源 http://s279.photobucket.com/user/sherlock1031/media/Dectective%20Dissicusion%20Group/Galileo106.jpg.html

對只會 commit / push / pull 的⼈人也是

Page 12: Git由超淺入超深

/ 20512

使⽤用 GIT 要解決的事情

Page 13: Git由超淺入超深

/ 20513

使⽤用 GIT 要解決的事情

Page 14: Git由超淺入超深

/ 20514

使⽤用 GIT 要解決的事情

檔案可能還好處理但若分別是資料夾呢?

Page 15: Git由超淺入超深

/ 20515

使⽤用 GIT 要解決的事情

圖⽚片來源 http://backlogtool.com/git-guide/tw/img/post/intro/capture_intro1_1_2.png

Page 16: Git由超淺入超深

/ 20516

使⽤用 GIT 要解決的事情

其實還有很多...圖⽚片來源 http://backlogtool.com/git-guide/tw/img/post/intro/capture_intro1_1_2.png

Page 17: Git由超淺入超深

/ 20517

圖⽚片來源 https://lh4.googleusercontent.com/-vvzM1j0tqGA/UPffE081MHI/AAAAAAAAQ5c/C6oSHikiCdY/s990/P1130764.jpg

最後只要知道 GIT 是

Page 18: Git由超淺入超深

/ 20518

GIT Software

Page 19: Git由超淺入超深

/ 205

Windows 必裝軟體19

http://msysgit.github.io/

msysgit

http://git-scm.com/downloads/win

git-scm

Page 20: Git由超淺入超深

/ 205

Mac 必裝軟體20

$ yum install curl-devel expat-devel gettext-devel \ openssl-devel zlib-devel

$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \ libz-dev libssl-dev

git-scm

⼿手動安裝

Page 21: Git由超淺入超深

/ 20521

若你是Coding 魔⼈人 千萬不能裝 GUI 軟體

圖⽚片來源 http://screen-wallpapers.com/wallpapers/4743/bigpreview_Coding.jpg

Page 22: Git由超淺入超深

/ 20522

圖⽚片來源 http://screen-wallpapers.com/wallpapers/4743/bigpreview_Coding.jpg

⼀一定要⽤用 terminal 不然不夠帥

Page 23: Git由超淺入超深

/ 20523

圖⽚片來源 http://ext.pimg.tw/yayachen0326/4ab33c5f3fe73.jpg

若你是...

Page 24: Git由超淺入超深

/ 205

Git GUI 軟體24

windows onlyhttps://code.google.com/p/tortoisegit/

Page 25: Git由超淺入超深

/ 205

Git GUI 軟體25

windows / OS Xhttp://www.sourcetreeapp.com/

Page 26: Git由超淺入超深

/ 20526

GIT 這個玩意

Page 27: Git由超淺入超深

/ 20527

基本觀念⾮非常重要!

協同作業 必須⼤大家都要有相同的觀念

Page 28: Git由超淺入超深

/ 20528

腦部神經聯結⽰示意圖

協同作業,必須⼤大家都要有相同的觀念

圖⽚片來源 http://www.naipo.com/Portals/1/web_tw/images/pic089-01-a01.jpg

Page 29: Git由超淺入超深

儲存庫 ( Repository )

Page 30: Git由超淺入超深

/ 20530

圖⽚片來源:http://backlogtool.com/git-guide/tw/img/post/intro/capture_intro1_2_1.png

儲存庫哪來的• 本地的儲存庫 (local repository)

Page 31: Git由超淺入超深

/ 20531

圖⽚片來源:http://backlogtool.com/git-guide/tw/img/post/intro/capture_intro1_2_2.png

儲存庫哪來的• 遠端的儲存庫 (remote repository)

GitHub 或其他平台建⽴立的 repo

Page 32: Git由超淺入超深

儲存庫 ( Repository )

git init

git init --bare

git clone <REPOSITORY_URI>

Page 33: Git由超淺入超深

/ 20533

git init --bare Server ⽤用儲存庫資料夾 命名規則

<資料夾名稱>.git

https://github.com/github/gitignore.git

儲存庫 ( Repository )

Page 34: Git由超淺入超深

Git 常⽤用指令

Page 35: Git由超淺入超深

/ 20535

Git 常⽤用指令

git add新增檔案

git add .git add <file path>

git add *.jsgit add docs/*

Page 36: Git由超淺入超深

/ 20536

Git 常⽤用指令

git status查詢狀態

git status -sgit status -b

Page 37: Git由超淺入超深

/ 20537

Git 常⽤用指令

git commit

提交變更 / 建⽴立版本

git commit -m ‘訊息⽂文字‘

Page 38: Git由超淺入超深

/ 20538

Git 常⽤用指令

git log

查詢版本

git log -2

Page 39: Git由超淺入超深

/ 20539

Git 常⽤用指令對很多⼈人來說從這開始 就不是常⽤用指令了

Page 40: Git由超淺入超深

/ 20540

Git 常⽤用指令

git rm

刪除檔案

git rm 1.txt

1. 刪除版本庫索引的 ‘1.txt' 這個檔案 2. 刪除⼯工作⺫⽬目錄下的 '1.txt' 這個實體檔案

Page 41: Git由超淺入超深

/ 20541

Git 常⽤用指令

git mv

更換檔案

git mv 1.txt A.txt

Page 42: Git由超淺入超深

/ 20542

Git 常⽤用指令

git reset

重設⼯工作⺫⽬目錄/索引狀態

git reset --hard

只有重設索引

還原索引跟⼯工作⺫⽬目錄

注意 reset 是針對全部⼯工作區(這只是為了好記,有別種reset ⽤用法)

Page 43: Git由超淺入超深

/ 20543

Git 常⽤用指令

git checkout master -- 1.txt

取出指定的 <物件>

git checkout master 1.txt

e.g 還原其中⼀一個被改壞的檔案

git checkout

Page 44: Git由超淺入超深

儲存庫 ? ⼯工作⺫⽬目錄?索引?

⼯工作⺫⽬目錄

Page 45: Git由超淺入超深

/ 20545

儲存庫(repo)

儲存庫 ? ⼯工作⺫⽬目錄?索引?

Page 46: Git由超淺入超深

/ 20546

索引

儲存庫 ? ⼯工作⺫⽬目錄?索引?

Page 47: Git由超淺入超深

/ 20547

圖⽚片來源:http://backlogtool.com/git-guide/tw/img/post/intro/capture_intro1_4_1.png

儲存庫 ? ⼯工作⺫⽬目錄?索引?

Page 48: Git由超淺入超深

Git 原理/結構

圖⽚片來源 :http://himg2.huanqiu.com/saronscms/uploadfile/2014/0403/20140403050245784.jpg

跟⼤大藍洞⼀一樣深 XD

Git 原理/結構

Page 49: Git由超淺入超深

/ 20549

Git 物件類型

blob 物件 tree 物件

commit 物件 tag 物件

所有的物件都會以 zlib 演算法進⾏行壓縮

Page 50: Git由超淺入超深

/ 20550

Git 物件類型blob 物件

某個檔案的 "內容",且只有內容⽽而已,當你執⾏行 git add 指令的同時,這些新增檔案的內容就會⽴立刻被寫⼊入成為 blob 物件,檔名則是物件內容的雜湊運算結果,沒有任何其他其他資訊,像是檔案時間、原本的檔名或檔案的其他資訊,都會儲存在其他類型的物件裡 (也就是 tree 物件)

Page 51: Git由超淺入超深

/ 20551

Git 物件類型tree 物件

儲存特定⺫⽬目錄下的所有資訊,包含該⺫⽬目錄下的檔名、對應的 blob 物件名稱、檔案連結(symbolic link) 或其他 tree 物件等等。由於 tree 物件可以包含其他 tree 物件,所以tree 物件其實就跟「資料夾」沒兩樣。簡單來說,tree 物件這就是在特

定版本下某個資料夾的快照(Snapshot)

Page 52: Git由超淺入超深

/ 20552

Git 物件類型commit 物件

⽤用來記錄有那些 tree 物件包含在版本中,⼀一個 commit 物件代表著 Git 的⼀一次提交,記錄著特定提交版本有哪些 tree 物件、以及版本提交的時間、紀錄訊息等等,通常還會記錄上⼀一層的

commit 物件名稱 (只有第⼀一次 commit 的版本沒有上層 commit 物件名稱

Page 53: Git由超淺入超深

/ 20553

Git 物件關聯

圖⽚片來源 :http://journal.code4lib.org/media/issue21/anderson/images/large/fig-09-git-revisions.png

Page 54: Git由超淺入超深

/ 20554

Git 物件命名規則每⼀一個「物件」,都是以「檔案內容」進⾏行 SHA1 雜湊運算出⼀一個 hash 值,並⽤用這個 hash 值當作物件的名稱 (檔名)。

Git 會先拿前兩個字元(97)當作⺫⽬目錄 然後把剩下的 hash 值當成檔名 (3749075c53236cfc411f62918efc3ce3a31380) 這些物件的實體⺫⽬目錄與檔案也都會放在 .git\objects ⺫⽬目錄下

Page 55: Git由超淺入超深

/ 20555

查詢 Hash 編碼git hash-object

$git hash-object 1.txt d00491fd7e5bb6fa28c517a0bb32b8b506539d4d

Page 56: Git由超淺入超深

/ 20556

查詢 Git 物件git cat-file -p

Page 57: Git由超淺入超深

/ 20557

查詢 Git 物件git cat-file -p

Page 58: Git由超淺入超深

/ 20558

查詢 Git 物件git cat-file -p

Page 59: Git由超淺入超深

/ 20559

Git 物件關聯

圖⽚片來源 :http://git-scm.com/figures/18333fig0301-tn.png

Page 60: Git由超淺入超深

/ 20560

Git 物件關聯

圖⽚片來源 : http://git-scm.com/figures/18333fig0302-tn.png

Page 61: Git由超淺入超深

/ 20561

Git 物件關聯

圖⽚片來源 :http://git-scm.com/figures/18333fig0303-tn.png

Page 62: Git由超淺入超深

/ 20562

Git 物件關聯

圖⽚片來源 :http://git-scm.com/figures/18333fig0304-tn.png

Page 63: Git由超淺入超深

/ 20563

Git 物件關聯

圖⽚片來源 :http://git-scm.com/figures/18333fig0305-tn.png

HEAD 是⼀一直保持著最新版本的指標

Page 64: Git由超淺入超深

/ 20564

Git 物件關聯

圖⽚片來源 :http://git-scm.com/figures/18333fig0306-tn.png

切換到 Testing 分⽀支的狀態

Page 65: Git由超淺入超深

/ 20565

Git 物件關聯

圖⽚片來源 :http://git-scm.com/figures/18333fig0307-tn.png

Page 66: Git由超淺入超深

/ 20566

Git 物件關聯

圖⽚片來源 :http://git-scm.com/figures/18333fig0309-tn.png

Page 67: Git由超淺入超深

圖⽚片來源 http://ecx.images-amazon.com/images/I/51oxTnCqCbL._SY300_.jpg http://backlogtool.com/git-guide/tw/img/post/stepup/capture_stepup1_1_1.png

分⽀支 (branch)

Page 68: Git由超淺入超深

/ 20568

分⽀支 (branch)

git branch <branch name>建⽴立分⽀支

Page 69: Git由超淺入超深

/ 20569

分⽀支 (branch)

git checkout <branch name>切換分⽀支

Page 70: Git由超淺入超深

/ 20570

Git 差異⽐比對

git diff git diff         => ⼯工作⺫⽬目錄 vs 索引 git diff HEAD      => ⼯工作⺫⽬目錄 vs HEAD git diff --cached HEAD => 索引 vs HEAD

git diff HEAD^ HEAD  => HEAD^ vs HEAD

Page 71: Git由超淺入超深

/ 20571

Git 物件的參照名稱

參照名稱 (ref) 簡單來說就是 Git 物件的⼀一個「指標」

是相對於「絕對名稱」的另⼀一個「好記名稱」 ⽤用⼀一個預先定義或⾃自⾏行定義的名稱來代表某⼀一個 Git 物件。

HEAD (代表最新版本) 分⽀支標籤名稱 這些都是「參照名稱」

Page 72: Git由超淺入超深

/ 20572

在⼤大多數的情況下,「參照名稱」通常都會指向⼀一個 commit 物件,但並⾮非必要,你也可以指向其他 Git 物件類型,像是 blob 物件、tree 物件、tag 物件等等

Git 物件的參照名稱

Page 73: Git由超淺入超深

/ 20573

.git/refs/ ⺫⽬目錄

• 本地分⽀支: .git/refs/heads/

• 遠端分⽀支: .git/refs/remotes/

• 標  籤: .git/refs/tags/

Page 74: Git由超淺入超深

/ 20574

* HEAD永遠會指向「⼯工作⺫⽬目錄」中所設定的「分⽀支」當中的「最新版」。

* ORIG_HEAD就是 HEAD 這個 commit 物件的「前⼀一版」,經常⽤用來復原上⼀一次的版本變更。

* FETCH_HEAD使⽤用遠端儲存庫時,可能會使⽤用 git fetch 指令取回所有遠端儲存庫的物件。這個 FETCH_HEAD 符號參考則會記錄遠端儲存庫中每個分⽀支的 HEAD (最新版) 的「絕對名稱」。

* MERGE_HEAD當你執⾏行合併⼯工作時 (關於合併的議題會在⽇日後的⽂文章中會提到),「合併來源」的 commit 物件絕對名稱會被記錄在 MERGE_HEAD 這個符號參照中。

符號參照名稱 (symref)符號參照名稱 (symref) 其實也是參照名稱 (ref) 的⼀一種,只是內容不同⽽而已。我們從下圖應可看出其內容的差異,「符號參照」會指向另⼀一個「參照名稱」

並且內容以 ref: 開頭

Page 75: Git由超淺入超深

/ 20575

Git 參照名稱⼜又有區分「⼀一般參照」與「符號參照」,兩者的⽤用途⼀一模⼀一樣,只在於內容不太⼀一樣。 「符號參照」會指向另⼀一個「⼀一般參照」 「⼀一般參照」則是指向⼀一個 Git 物件的「絕對名稱」。

「參照名稱(ref)」 簡單來說就是 Git 物件的⼀一個「指標」,⽤用來指向特定 Git 物件,所以你可以把「參照名稱」想像成 Git 物件絕對名稱的別名 (Alias),⽤用來幫助記憶。在 Git 裡,有許多機制可以幫你控管專案,例如「分⽀支」、「標籤」等等,這些機制⾻骨

⼦子裡其實就是靠「參照」完成的。

參照⼩小節

Page 76: Git由超淺入超深

圖⽚片來源 : http://i.imgur.com/LRC1M.jpg http://blog-imgs-43-origin.fc2.com/m/o/l/mollymolly1/100331-5ds.jpg

http://static.ettoday.net/images/576/d576654.jpg http://link.photo.pchome.com.tw/s13/js86/4/132991104143/

http://pic.pimg.tw/sandykill/4aab6e5adf5d7.gif

Page 77: Git由超淺入超深

圖⽚片來源 :http://www.fangdigital.com/wp-content/uploads/2013/04/tags.jpg

Git 標籤 (tag)

• 輕量標籤 (lightweight tag)

• 標⽰示標籤 (annotated tag)

Page 78: Git由超淺入超深

/ 20578

Git 標籤 (tag)

• 輕量標籤 (lightweight tag)

• 標⽰示標籤 (annotated tag)

這種「標籤」才是 Git 儲存庫中「永久的物件」

Page 79: Git由超淺入超深

/ 20579

Git 暫存(stash)

• git stash

會將所有已列⼊入追蹤(tracked)的檔案建⽴立暫存版

• git stash -u會包括所有已追蹤或未追蹤的檔案,全部都建⽴立成暫存版

Page 80: Git由超淺入超深

圖⽚片來源:http://bbs.mychat.to/attach/Fid_175/175_837026.jpg

追蹤變更軌跡

git reflog

Page 81: Git由超淺入超深

/ 20581

追蹤變更軌跡 (儲存位置).git/logs/

Page 82: Git由超淺入超深

/ 20582

追蹤變更軌跡 (查詢後復原)

git reflog

HEAD@{0},永遠代表⺫⽬目前分⽀支的「最新版」

Page 83: Git由超淺入超深

/ 20583

git reset HEAD@{1} --hard

追蹤變更軌跡 (查詢後復原)

git reflog

「取消」最近⼀一次的版本紀錄

HEAD@{0},永遠代表⺫⽬目前分⽀支的「最新版」

Page 84: Git由超淺入超深

/ 20584

追蹤變更軌跡(記錄時機)

* commit * checkout * pull * push * merge * reset * clone * branch * rebase * stash

Page 85: Git由超淺入超深

Git 忽略清單.gitignore

Page 86: Git由超淺入超深

/ 20586

Git 忽略清單 .gitignore

Page 87: Git由超淺入超深

Git 合併觀念git merge

Page 88: Git由超淺入超深

/ 20588

Git 合併觀念 (merge)

Page 89: Git由超淺入超深

/ 20589

Git 合併觀念 (merge)

fast-forward(快轉)合併

Page 90: Git由超淺入超深

/ 20590

Git 合併觀念 (merge)

Page 91: Git由超淺入超深

/ 20591

Git 合併觀念 (merge)

合併會多⼀一個 commit

Page 92: Git由超淺入超深

/ 20592

圖⽚片來源 :http://git-scm.com/figures/18333fig0310-tn.png

Git 合併 (merge)

Page 93: Git由超淺入超深

/ 20593

Git 合併 (merge)

圖⽚片來源 :http://git-scm.com/figures/18333fig0311-tn.png

Page 94: Git由超淺入超深

/ 20594

Git 合併 (merge)

圖⽚片來源 :http://git-scm.com/figures/18333fig0311-tn.png

Page 95: Git由超淺入超深

/ 20595

Git 合併 (merge)

圖⽚片來源 :http://git-scm.com/figures/18333fig0313-tn.png

Page 96: Git由超淺入超深

/ 20596

Git 合併 (merge)

圖⽚片來源 :http://git-scm.com/figures/18333fig0314-tn.png

Page 97: Git由超淺入超深

/ 20597

Git 合併 (merge)

圖⽚片來源 :http://git-scm.com/figures/18333fig0315-tn.png

Page 98: Git由超淺入超深

/ 20598

Git 合併 (merge)

圖⽚片來源 :http://git-scm.com/figures/18333fig0316-tn.png

Page 99: Git由超淺入超深

/ 20599

Git 合併 (merge)

圖⽚片來源 :http://git-scm.com/figures/18333fig0316-tn.png

Page 100: Git由超淺入超深

/ 205100

Git 合併觀念 (merge)

1. 合併之前,先看清楚⾃自⼰己在哪個分⽀支 2. 合併之前,請確保⼯工作⺫⽬目錄是乾淨的 3. 合併時請⽤用 git merge [另⼀一個分⽀支] 來將另⼀一個分⽀支的變更合併回來 4. 合併成功後,確認沒有問題!

Page 101: Git由超淺入超深

/ 205101

Git 合併衝突 (merge)

Page 102: Git由超淺入超深

/ 205102

Git 合併衝突 (merge)

⽤用壞了怎麼辦

Page 103: Git由超淺入超深

/ 205103

Git 合併衝突 (merge)

⽤用壞了怎麼辦

git reset HEAD@{1} --hard

還原就好了

Page 104: Git由超淺入超深

/ 205104

Git 合併衝突 (merge)

⽤用壞了怎麼辦

git reset --hard ORIG_HEAD

這樣也可以!

Page 105: Git由超淺入超深

Git 合併git rebase

Page 106: Git由超淺入超深

/ 205106

Git 合併git rebase

Page 107: Git由超淺入超深

/ 205107

Git 合併

git rebase

Page 108: Git由超淺入超深

/ 205108

Git 合併從 bugfix “rebase” 到 master

Page 109: Git由超淺入超深

/ 205109

Git 合併 rebase

圖⽚片來源 :http://git-scm.com/figures/18333fig0331-tn.png

Page 110: Git由超淺入超深

所以在 client 分⽀支下命令git rebase master (會變成下圖

Page 111: Git由超淺入超深

若在 mastergit rebase client (會變成下圖

Page 112: Git由超淺入超深

這張圖是

Page 113: Git由超淺入超深

git rebase --onto master server client

Page 114: Git由超淺入超深

git rebase --onto master server client

“取出 client 分⽀支,找出 client 分⽀支和 server 分⽀支的共同祖先之後的變化,然後把它們在 master 上重演⼀一遍”。

(譯注:雖然 client 裡的 C8, C9 在 C3 之後,但這僅表明時間上的先後,⽽而⾮非在 C3 修改的基礎上進⼀一步改動,因為 server 和 client 這兩個分⽀支對應的代碼應該是兩套檔,雖然這麼說不是很嚴格,但應理解為在 C3 時間

點之後,對另外的檔所做的 C8,C9 修改,放到主幹重演。)

Page 115: Git由超淺入超深

git rebase --onto master server client

這需要⽤用 command 才弄得出來,所以做個了解就好

我也很少⽤用 onto 這個命令

Page 116: Git由超淺入超深

/ 205116

Git 合併 rebase

圖⽚片來源 :http://git-scm.com/figures/18333fig0333-tn.png

Page 117: Git由超淺入超深

/ 205117

Git 合併 rebase

圖⽚片來源 :http://git-scm.com/figures/18333fig0334-tn.png

Page 118: Git由超淺入超深

/ 205118

現在你想法⼀一定是

Page 119: Git由超淺入超深

/ 205119

圖⽚片來源 :http://mypaper.pchome.com.tw/show/article/kkk670670/A1276118288

Page 120: Git由超淺入超深

Git 修改 commit

Page 121: Git由超淺入超深

/ 205121

⼈人⾮非聖賢,孰能無過

Page 122: Git由超淺入超深

/ 205122

Git 修改 commit

git commit --amend

Page 123: Git由超淺入超深

/ 205123

Git 修改 commit (amend)

漏掉應該要⼀一起commit 檔案

Page 124: Git由超淺入超深

/ 205124

糟糕我寫錯mesage

Git 修改 commit (amend)

Page 125: Git由超淺入超深

/ 205125

Git 重置 commit

git reset

Page 126: Git由超淺入超深

/ 205126

Git 重置 commit

git reset --hard "HEAD^"刪除最後的版本

Page 127: Git由超淺入超深

/ 205127

Git 重置 commit

git reset --hard ORIG_HEAD復原上次的動作

Page 128: Git由超淺入超深

/ 205128

Git 重置 commit

git reset --soft "HEAD^"刪除最後的版本,但留下修改內容

Page 129: Git由超淺入超深

/ 205129

Git 重置 commit

git reset --soft "HEAD^"

git reset --mixed "HEAD^"git reset "HEAD^"

Page 130: Git由超淺入超深

/ 205130

Git 重置 commit

git reset --soft "HEAD^"

git reset --mixed "HEAD^"git reset "HEAD^"

檔案會是 stage狀態

Page 131: Git由超淺入超深

/ 205131

Git 重置 commit

git reset --soft "HEAD^"

git reset --mixed "HEAD^"git reset "HEAD^"

檔案會是 unstage狀態

Page 132: Git由超淺入超深

/ 205132

Git 還原 commit

git revert [commit_id]

Page 133: Git由超淺入超深

/ 205133

Git 還原 commit

git revert [commit_id]

注意:索引必須乾淨狀態

Page 134: Git由超淺入超深

/ 205134

Git 修改 commit

git cherry-pick

圖⽚片來源 : https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcTSkS0N71OS1U4LRv9xx79ek2-rHXowkqWKvDt65_h-oWsP4chNzg

Page 135: Git由超淺入超深

/ 205135

Git 修改 commitgit cherry-pick

圖⽚片來源 : https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcTSkS0N71OS1U4LRv9xx79ek2-rHXowkqWKvDt65_h-oWsP4chNzg

Page 136: Git由超淺入超深

/ 205136

Git 修改 commitgit cherry-pick

Page 137: Git由超淺入超深

/ 205137

Git 修改 commit

git rebase -i乾坤⼤大挪移

圖⽚片來源 :http://www.wzrlmy.com/A//upload/product//NewWebPic/BigPic/201005281209289062.jpg

Page 138: Git由超淺入超深

/ 205138

Git 修改 commit

git rebase -i乾坤⼤大挪移

注意:索引必須乾淨狀態

Page 139: Git由超淺入超深

/ 205139

Git 修改 commit (rebase)

你可以...

Page 140: Git由超淺入超深

/ 205140

Git 修改 commit (rebase)

1. 調換 commit 的順序

Page 141: Git由超淺入超深

/ 205141

Git 修改 commit (rebase)

1. 調換 commit 的順序 2. 修改 commit 的訊息

Page 142: Git由超淺入超深

/ 205142

Git 修改 commit (rebase)

1. 調換 commit 的順序 2. 修改 commit 的訊息 3. 插⼊入⼀一個 commit

Page 143: Git由超淺入超深

/ 205143

Git 修改 commit (rebase)

1. 調換 commit 的順序 2. 修改 commit 的訊息 3. 插⼊入⼀一個 commit 4. 編輯⼀一個 commit

Page 144: Git由超淺入超深

/ 205144

Git 修改 commit (rebase)

1. 調換 commit 的順序 2. 修改 commit 的訊息 3. 插⼊入⼀一個 commit 4. 編輯⼀一個 commit 5. 拆解⼀一個 commit

Page 145: Git由超淺入超深

/ 205145

Git 修改 commit (rebase)

1. 調換 commit 的順序 2. 修改 commit 的訊息 3. 插⼊入⼀一個 commit 4. 編輯⼀一個 commit 5. 拆解⼀一個 commit 6. 壓縮⼀一個 commit,且保留訊息紀錄

Page 146: Git由超淺入超深

/ 205146

Git 修改 commit (rebase)

1. 調換 commit 的順序 2. 修改 commit 的訊息 3. 插⼊入⼀一個 commit 4. 編輯⼀一個 commit 5. 拆解⼀一個 commit 6. 壓縮⼀一個 commit,且保留訊息紀錄 7. 壓縮⼀一個 commit,但丟棄版本紀錄

Page 147: Git由超淺入超深

/ 205147

Git 修改 commit (rebase)

1. 調換 commit 的順序 2. 修改 commit 的訊息 3. 插⼊入⼀一個 commit 4. 編輯⼀一個 commit 5. 拆解⼀一個 commit 6. 壓縮⼀一個 commit,且保留訊息紀錄 7. 壓縮⼀一個 commit,但丟棄版本紀錄 8. 刪除⼀一個 commit

Page 148: Git由超淺入超深

Git 遠端版本庫

Page 149: Git由超淺入超深

/ 205149

Git 遠端版本庫

傳輸⽅方式

http:// https://git://ssh://

Page 150: Git由超淺入超深

/ 205150

Git 遠端版本庫

git push

Page 151: Git由超淺入超深

/ 205151

Git 遠端版本庫

git pull

git fetch

Page 152: Git由超淺入超深

/ 205152

Git 遠端版本庫

git pull

git fetch

fetch

merge+

Page 153: Git由超淺入超深

/ 205153

來⾃自github的Scott Chacon OSDC Git Session

來源 http://contribgit.herokuapp.com/#1

Page 154: Git由超淺入超深

/ 205154

Page 155: Git由超淺入超深

/ 205155

Page 156: Git由超淺入超深

/ 205156

Page 157: Git由超淺入超深

/ 205157

Page 158: Git由超淺入超深

/ 205158

Page 159: Git由超淺入超深

/ 205159

Page 160: Git由超淺入超深

/ 205160

Page 161: Git由超淺入超深

/ 205161

Page 162: Git由超淺入超深

/ 205162

Page 163: Git由超淺入超深

/ 205163

Page 164: Git由超淺入超深

/ 205164

Page 165: Git由超淺入超深

/ 205165

Page 166: Git由超淺入超深

/ 205166

Page 167: Git由超淺入超深

/ 205167

Page 168: Git由超淺入超深

/ 205168

Page 169: Git由超淺入超深

/ 205169

Page 170: Git由超淺入超深

/ 205170

Page 171: Git由超淺入超深

/ 205171

Page 172: Git由超淺入超深

/ 205172

Page 173: Git由超淺入超深

/ 205173

Page 174: Git由超淺入超深

/ 205174

Page 175: Git由超淺入超深

/ 205175

Page 176: Git由超淺入超深

/ 205176

Page 177: Git由超淺入超深

/ 205177

Page 178: Git由超淺入超深

/ 205178

Page 179: Git由超淺入超深

/ 205179

Page 180: Git由超淺入超深

/ 205180

Page 181: Git由超淺入超深

/ 205181

Page 182: Git由超淺入超深

/ 205182

Page 183: Git由超淺入超深

/ 205183

Page 184: Git由超淺入超深

/ 205184

Page 185: Git由超淺入超深

/ 205185

Page 186: Git由超淺入超深

Git 遠端觀念

Page 187: Git由超淺入超深

/ 205187

push 了就回不去了

圖⽚片來源:http://cdn0.t17.techbang.com.tw/system/attached_images/2012/12/76729/show/feba4c111f349866c5e087de04526d98.jpg?1355366400

Git 遠端觀念

Page 188: Git由超淺入超深

/ 205188

push 後的commit 不能...

Git 遠端觀念

Page 189: Git由超淺入超深

/ 205189

push 後的commit 不能...

Git 遠端觀念

resetrebaseament

Page 190: Git由超淺入超深

/ 205190

push 後的commit 只能...

Git 遠端觀念

revert

Page 191: Git由超淺入超深

/ 205191

Git 掛勾 (Hook)

Page 192: Git由超淺入超深

Git flow

Page 193: Git由超淺入超深

/ 205193

Git flow

Page 194: Git由超淺入超深

/ 205194

Git flow

git flow feature start feature_xxxxx (以此類推 git flow release 和 git flow hotfix)

git flow feature finish feature_xxxxx

Page 195: Git由超淺入超深

其他的....

Page 196: Git由超淺入超深

/ 205196

Blame

subtree

submodules

bisect

Page 197: Git由超淺入超深

/ 205197

下次有空再說....

圖⽚片來源 :http://pic.pimg.tw/austinleefuture/1407855278-2999893000.jpg

Page 198: Git由超淺入超深

最後

Page 199: Git由超淺入超深

最後最後

Page 200: Git由超淺入超深

最後最後最後

Page 201: Git由超淺入超深

很重要,所以說三次

Page 202: Git由超淺入超深

學然後知不⾜足,教然後知困,教學相⻑⾧長

圖⽚片來源 :http://www.worldofmastermind.com/wp-content/uploads/2013/10/Confucious-2a.jpg

Page 203: Git由超淺入超深

/ 205203

學然後知不⾜足,教然後知困。 知不⾜足,然後能⾃自反也知困,然後⾃自強也 故⽈曰,教學相⻑⾧長也

• “⾃自反”,意思是反過來要求⾃自⼰己。 • “困”,不通,理解不清。 • “⾃自強”,意思是⾃自⼰己努⼒力。“強”,竭⼒力,盡⼒力。 • “教學相⻑⾧長”,意思是教和學互相促進,教別⼈人,也能增⻑⾧長⾃自⼰己的學問

學習才能知道⾃自⼰己知識的缺乏教了別⼈人之後才能知道⾃自⼰己對知識還理解不清。認識到了⾃自⼰己知識的不⾜足,然後才能反過來要求⾃自⼰己;知道了⾃自⼰己對有些知識還理解不通,然後才能⾃自⼰己努⼒力。

Page 204: Git由超淺入超深

參考⽂文獻• The Will Will Web 保哥 Git 教學

• iHower Git 版本控制系統

• 猴⼦子都能懂的 Git 指南

• Git官⽅方教學

• Casear Chu Git 教學

• Scott Chacon Git Session on OSDC

Page 205: Git由超淺入超深

Q & A

羊小咩 2015 / 01 / 29

Thank  you  !