More Related Content Similar to Git由超淺入超深 (11) More from 羊 小咩 (lamb-mei) More from 羊 小咩 (lamb-mei) (12) Git由超淺入超深2. Blog : lamb-mei.com
⽺羊⼩小咩 Lamb Mei
E-mail : lamb@lamb-mei.com
FB : https://www.facebook.com/lamb.mei
GitHub:https://github.com/lamb-mei/
15. / 20515
使⽤用 GIT 要解決的事情
圖⽚片來源 http://backlogtool.com/git-guide/tw/img/post/intro/capture_intro1_1_2.png
16. / 20516
使⽤用 GIT 要解決的事情
其實還有很多...
圖⽚片來源 http://backlogtool.com/git-guide/tw/img/post/intro/capture_intro1_1_2.png
20. / 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
⼿手動安裝
24. / 205
Git GUI 軟體
24
windows only
https://code.google.com/p/tortoisegit/
25. / 205
Git GUI 軟體
25
windows / OS X
http://www.sourcetreeapp.com/
33. / 20533
git init --bare
Server ⽤用儲存庫資料夾 命名規則
<資料夾名稱>.git
https://github.com/github/gitignore.git
儲存庫 ( Repository )
42. / 20542
Git 常⽤用指令
git reset
重設⼯工作⺫⽬目錄/索引狀態
git reset --hard
只有重設索引
還原索引跟⼯工作⺫⽬目錄
注意 reset 是針對全部⼯工作區
(這只是為了好記,有別種reset ⽤用法)
43. / 20543
Git 常⽤用指令
git checkout master -- 1.txt
取出指定的 <物件>
git checkout master 1.txt
e.g 還原其中⼀一個被改壞的檔案
git checkout
50. / 20550
Git 物件類型
blob 物件
某個檔案的 "內容",且只有內容⽽而已,當你執⾏行
git add 指令的同時,這些新增檔案的內容就會
⽴立刻被寫⼊入成為 blob 物件,檔名則是物件內容
的雜湊運算結果,沒有任何其他其他資訊,像是
檔案時間、原本的檔名或檔案的其他資訊,都會
儲存在其他類型的物件裡 (也就是 tree 物件)
51. / 20551
Git 物件類型
tree 物件
儲存特定⺫⽬目錄下的所有資訊,包含該⺫⽬目錄下的檔
名、對應的 blob 物件名稱、檔案連結(symbolic
link) 或其他 tree 物件等等。由於 tree 物件可以
包含其他 tree 物件,所以tree 物件其實就跟「資
料夾」沒兩樣。簡單來說,tree 物件這就是在特
定版本下某個資料夾的快照(Snapshot)
52. / 20552
Git 物件類型
commit 物件
⽤用來記錄有那些 tree 物件包含在版本中,⼀一個
commit 物件代表著 Git 的⼀一次提交,記錄著特
定提交版本有哪些 tree 物件、以及版本提交的
時間、紀錄訊息等等,通常還會記錄上⼀一層的
commit 物件名稱 (只有第⼀一次 commit 的版本沒
有上層 commit 物件名稱
53. / 20553
Git 物件關聯
圖⽚片來源 :http://journal.code4lib.org/media/issue21/anderson/images/large/fig-09-git-revisions.png
54. / 20554
Git 物件命名規則
每⼀一個「物件」,都是以「檔案內容」進⾏行 SHA1 雜湊運算
出⼀一個 hash 值,並⽤用這個 hash 值當作物件的名稱 (檔名)。
Git 會先拿前兩個字元(97)當作⺫⽬目錄
然後把剩下的 hash 值當成檔名 (3749075c53236cfc411f62918efc3ce3a31380)
這些物件的實體⺫⽬目錄與檔案也都會放在 .gitobjects ⺫⽬目錄下
55. / 20555
查詢 Hash 編碼
git hash-object
$git hash-object 1.txt
d00491fd7e5bb6fa28c517a0bb32b8b506539d4d
70. / 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
71. / 20571
Git 物件的參照名稱
參照名稱 (ref) 簡單來說就是 Git 物件的⼀一個「指標」
是相對於「絕對名稱」的另⼀一個「好記名稱」
⽤用⼀一個預先定義或⾃自⾏行定義的名稱來代表某⼀一個 Git 物件。
HEAD (代表最新版本)
分⽀支
標籤名稱
這些都是「參照名稱」
74. / 20574
* HEAD
永遠會指向「⼯工作⺫⽬目錄」中所設定的「分⽀支」當中的「最新版」。
* ORIG_HEAD
就是 HEAD 這個 commit 物件的「前⼀一版」,經常⽤用來復原上⼀一次的版本變更。
* FETCH_HEAD
使⽤用遠端儲存庫時,可能會使⽤用 git fetch 指令取回所有遠端儲存庫的物件。這個
FETCH_HEAD 符號參考則會記錄遠端儲存庫中每個分⽀支的 HEAD (最新版) 的「絕對名
稱」。
* MERGE_HEAD
當你執⾏行合併⼯工作時 (關於合併的議題會在⽇日後的⽂文章中會提到),「合併來源」的 commit
物件絕對名稱會被記錄在 MERGE_HEAD 這個符號參照中。
符號參照名稱 (symref)
符號參照名稱 (symref) 其實也是參照名稱 (ref) 的⼀一種,只是內容不同
⽽而已。我們從下圖應可看出其內容的差異,「符號參照」會指向另⼀一
個「參照名稱」
並且內容以 ref: 開頭
78. / 20578
Git 標籤 (tag)
• 輕量標籤 (lightweight tag)
• 標⽰示標籤 (annotated tag)
這種「標籤」才是 Git 儲存庫中「永久的物件」
83. / 20583
git reset HEAD@{1} --hard
追蹤變更軌跡 (查詢後復原)
git reflog
「取消」最近⼀一次的版本紀錄
HEAD@{0},永遠代表⺫⽬目前分⽀支的「最新版」
93. / 20593
Git 合併 (merge)
圖⽚片來源 :http://git-scm.com/figures/18333fig0311-tn.png
94. / 20594
Git 合併 (merge)
圖⽚片來源 :http://git-scm.com/figures/18333fig0311-tn.png
95. / 20595
Git 合併 (merge)
圖⽚片來源 :http://git-scm.com/figures/18333fig0313-tn.png
96. / 20596
Git 合併 (merge)
圖⽚片來源 :http://git-scm.com/figures/18333fig0314-tn.png
97. / 20597
Git 合併 (merge)
圖⽚片來源 :http://git-scm.com/figures/18333fig0315-tn.png
98. / 20598
Git 合併 (merge)
圖⽚片來源 :http://git-scm.com/figures/18333fig0316-tn.png
99. / 20599
Git 合併 (merge)
圖⽚片來源 :http://git-scm.com/figures/18333fig0316-tn.png
100. / 205100
Git 合併觀念 (merge)
1. 合併之前,先看清楚⾃自⼰己在哪個分⽀支
2. 合併之前,請確保⼯工作⺫⽬目錄是乾淨的
3. 合併時請⽤用 git merge [另⼀一個分⽀支] 來將另⼀一個分
⽀支的變更合併回來
4. 合併成功後,確認沒有問題!
109. / 205109
Git 合併 rebase
圖⽚片來源 :http://git-scm.com/figures/18333fig0331-tn.png
114. git rebase --onto master server client
“取出 client 分⽀支,找出 client 分⽀支和 server 分⽀支的共同祖先之後的變化,
然後把它們在 master 上重演⼀一遍”。
(譯注:雖然 client 裡的 C8, C9 在 C3 之後,但這僅表明時間上的先後,
⽽而⾮非在 C3 修改的基礎上進⼀一步改動,因為 server 和 client 這兩個分⽀支對
應的代碼應該是兩套檔,雖然這麼說不是很嚴格,但應理解為在 C3 時間
點之後,對另外的檔所做的 C8,C9 修改,放到主幹重演。)
115. git rebase --onto master server client
這需要⽤用 command 才弄得出來,所以做個了解就好
我也很少⽤用 onto 這個命令
116. / 205116
Git 合併 rebase
圖⽚片來源 :http://git-scm.com/figures/18333fig0333-tn.png
117. / 205117
Git 合併 rebase
圖⽚片來源 :http://git-scm.com/figures/18333fig0334-tn.png
129. / 205129
Git 重置 commit
git reset --soft "HEAD^"
git reset --mixed "HEAD^"
git reset "HEAD^"
130. / 205130
Git 重置 commit
git reset --soft "HEAD^"
git reset --mixed "HEAD^"
git reset "HEAD^"
檔案會是 stage狀態
131. / 205131
Git 重置 commit
git reset --soft "HEAD^"
git reset --mixed "HEAD^"
git reset "HEAD^"
檔案會是 unstage狀態
134. / 205134
Git 修改 commit
git cherry-pick
圖⽚片來源 : https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcTSkS0N71OS1U4LRv9xx79ek2-rHXowkqWKvDt65_h-oWsP4chNzg
135. / 205135
Git 修改 commit
git cherry-pick
圖⽚片來源 : https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcTSkS0N71OS1U4LRv9xx79ek2-rHXowkqWKvDt65_h-oWsP4chNzg
137. / 205137
Git 修改 commit
git rebase -i
乾坤⼤大挪移
圖⽚片來源 :http://www.wzrlmy.com/A//upload/product//NewWebPic/BigPic/201005281209289062.jpg
142. / 205142
Git 修改 commit (rebase)
1. 調換 commit 的順序
2. 修改 commit 的訊息
3. 插⼊入⼀一個 commit
143. / 205143
Git 修改 commit (rebase)
1. 調換 commit 的順序
2. 修改 commit 的訊息
3. 插⼊入⼀一個 commit
4. 編輯⼀一個 commit
144. / 205144
Git 修改 commit (rebase)
1. 調換 commit 的順序
2. 修改 commit 的訊息
3. 插⼊入⼀一個 commit
4. 編輯⼀一個 commit
5. 拆解⼀一個 commit
145. / 205145
Git 修改 commit (rebase)
1. 調換 commit 的順序
2. 修改 commit 的訊息
3. 插⼊入⼀一個 commit
4. 編輯⼀一個 commit
5. 拆解⼀一個 commit
6. 壓縮⼀一個 commit,且保留訊息紀錄
146. / 205146
Git 修改 commit (rebase)
1. 調換 commit 的順序
2. 修改 commit 的訊息
3. 插⼊入⼀一個 commit
4. 編輯⼀一個 commit
5. 拆解⼀一個 commit
6. 壓縮⼀一個 commit,且保留訊息紀錄
7. 壓縮⼀一個 commit,但丟棄版本紀錄
147. / 205147
Git 修改 commit (rebase)
1. 調換 commit 的順序
2. 修改 commit 的訊息
3. 插⼊入⼀一個 commit
4. 編輯⼀一個 commit
5. 拆解⼀一個 commit
6. 壓縮⼀一個 commit,且保留訊息紀錄
7. 壓縮⼀一個 commit,但丟棄版本紀錄
8. 刪除⼀一個 commit
194. / 205194
Git flow
git flow feature start feature_xxxxx
(以此類推 git flow release 和 git flow hotfix)
git flow feature finish feature_xxxxx
204. 參考⽂文獻
• The Will Will Web 保哥 Git 教學
• iHower Git 版本控制系統
• 猴⼦子都能懂的 Git 指南
• Git官⽅方教學
• Casear Chu Git 教學
• Scott Chacon Git Session on OSDC