陸勇盛 (David Lu)
yungshenglu1994@gmail.com
@DigitalOcean.Hsinchu
OCT 06, 2018
你所不知道的 進階指令
-
Graduated student @CS.NCTU
-
SDN/NFV with AI.
-
Volunteer @DigitalOcrean.Hsinchu
-
Speaker, ModernWeb'18 &
DigitalOcean Hsinchu
-
-
以嘗試 結合不同的工具 為樂!
-
對 土砲 很有興趣!
-
e.g., Taiwan EX, docoGen, papoGen, etc.
-
-
Recent in P4, and Neural Network
“趕快想辦法畢業!”
About
David Lu
Slides Link
陸勇盛 (David Lu)
yungshenglu1994@gmail.com
你所不知道的 進階指令
Outline
-
改寫歷史紀錄篇
-
開發工具篇
-
好用的資源
改寫歷史紀錄篇
悲劇發生
-
問題來了!
-
如何取消 commit?
-
如何修改 commit?
-
消除一堆無意義的 commit?
-
故事是這樣的...
使用 Docker container 運行專案程式,
在本機端修改完畢後要用 scp 上傳頗麻煩,
於是利用 GitHub 作為媒介來管理專案,
不知不覺製造出一堆無意義的 commit...
改寫 Commit
-
Git commit --amend
A
master
HEAD
B
C
D
e12d8ef
85e7e30
657fce7
abb4f43
Initial commit
Add README
Add main.c
Fxck main.c
Update main.c
$ git commit --amend
Tips - 修改最近一次 commit
Tips - 使用 Git log 查看 commit 紀錄
Case 1.
後悔 Commit
A
master
HEAD
B
C
D
e12d8ef
85e7e30
657fce7
abb4f43
-
Git reset
$ git reset HEAD <FILENAME>
$ git reset <COMMIT>
Tips - <COMMIT> 後面接一個 "^" 表示該 ID 的前一個
85e7e30^
e12d8ef^^
HEAD^^
Case 2.
暴力型後悔
85e7e30~2
master~3
Tips - 小心使用 --hard
後悔 Reset
A
master
HEAD
B
C
D
e12d8ef
85e7e30
657fce7
abb4f43
-
Git reset
$ git reflog
$ git reset <COMMIT> --hard
Case 3.
Tips - 小心使用 --hard / --soft / --mixed
Tips - Git reflog 可以尋找遺失的 commit 紀錄
後悔 Commit
A
master
HEAD
B
C
D
e12d8ef
85e7e30
657fce7
abb4f43
-
Git revert
# git revert <COMMIT>
$ git revert HEAD --no-edit
Tips - 如果不想編輯 commit 訊息,可以使用 --no-edit
Case 4.
E
f2c3e8b
master
HEAD
抵銷
revert
禮貌型後悔
後悔修改
-
Git checkout --
# git checkout -- <FILENAME>
$ git checkout --
modified: main.c renamed: README -> README.md
renamed: README -> README.md
Tips - Git status 中有提示
Case 5.
小心使用!
整頓 Commit
-
Git rebase
# git rebase <COMMIT>
$ git rebase master
Case 6.
A
issue
HEAD
B
C
D
e12d8ef
85e7e30
657fce7
abb4f43
b174a5a
E
053fb21
E
issue
HEAD
master
Tips - 衝突發生需搭配 --continue / --abort
Tips - 使用 ORIG_HEAD 還原
撿取 Commit
-
Git cherry-pick
# git cherry-pick <COMMIT> <COMMIT> ...
$ git cherry-pick cef6e40
Case 8.
A
HEAD
B
C
D
e12d8ef
85e7e30
657fce7
abb4f43
cc797cd
E
053fb21
F
issue
master
cef6e40
F
657fce7
G
master
HEAD
Tips - 撿來不合併要使用 --no-commit
開發工具篇
誰寫的程式?
-
問題來了!
-
這程式到底是誰寫的?
-
太多 commit 如何逐一找 bug?
-
多人合作專案的經驗...
怎麼程式無法運行?
怎麼網頁開不起來?
這行程式碼好像不是我寫的?
找兇手!
- Git blame
$ git blame <FILE>
$ git blame -L <START>,<END> <FILE>
9f6560e4 (David Lu 2018-10-05 16:49:49 +0800 1) <!DOCTYPE html>
9f6560e4 (David Lu 2018-10-05 16:49:49 +0800 2) <html>
9f6560e4 (David Lu 2018-10-05 16:49:49 +0800 3) <head>
9f6560e4 (David Lu 2018-10-05 16:49:49 +0800 4) <meta charset="utf-8">
9f6560e4 (David Lu 2018-10-05 16:49:49 +0800 5) <title>TEST</title>
9f6560e4 (David Lu 2018-10-05 16:49:49 +0800 6) </head>
9f6560e4 (David Lu 2018-10-05 16:49:49 +0800 7) <body>
42cf2861 (Kevin Cyu 2018-10-06 16:53:43 +0800 8) <div class="container">
42cf2861 (Kevin Cyu 2018-10-06 16:53:43 +0800 9) </div>
9f6560e4 (David Lu 2018-10-05 16:49:49 +0800 10) </body>
9f6560e4 (David Lu 2018-10-05 16:49:49 +0800 11) </html>
Tips - 若要縮小範圍,可以使用 -L 來限制行數
Tips - 若要分析程式碼出處,可以使用 -C
Case 1.
找源頭!
- Git bisect
$ git bisect start
$ git bisect bad
$ git bisect good <GOOD_COMMIT>
$ git bisect start
$ git bisect bad
$ git bisect good v1.0
Bisecting: 6 revisions left to test after this
[ecb6e1bc347ccecc5f9350d878ce677feb13d3b2] error handling on repo
Tips - 使用 git bisect reset 重設 HEAD 位置
Tips - 透過 git bisect good/bad 來告訴 Git 提交的正確與否
Case 2.
Finish on debug!
接下來,開發上有好用的東西
master - 穩定可上線版本,不透過這個分支進行 commit
hostfix - 緊急修復使用,修復完合併到 master 與 develop
release - 上線前的最後測試,測試完合併回 master 與 develop
develop - 所有開發的基礎分支,有此新增 feature 分支
feature - 新增功能的分支,完成後合併回 develop
-
Git flow
$ git flow init
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master]
Branch name for "next release" development: [develop]
How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
Tips - 設定完後,預設分支為 develop
分支情境
Tips - 安裝請參考 git-flow cheasheet
Step 1.
開始新功能
-
Git flow feature start/finish
-
有任何開發一律先開分支
-
完成分支
-
$ git flow feature start <MY_FEATURE>
$ git flow feature finish <MY_FEATURE>
feature/awesome
develop
start
finish
Step 2.
發佈新分支
-
Git flow feature publish/pull
-
發佈新功能分支
-
取得新功能分支
-
$ git flow feature publish <MY_FEATURE>
$ git flow feature pull <MY_FEATURE>
$ git flow feature track <MY_FEATURE>
Tips - 使用 track 可以追蹤 feature
Step 3.
發佈新版本
-
Git flow release
-
發佈新版本
-
完成推出新版本
-
$ git flow release start <MY_RELEASE> [BASE]
$ git flow release publish <MY_RELEASE>
$ git flow release finish <MY_RELEASE>
Step 4.
release
develop
start
finish
master
快速修復
-
Git flow hotfix
-
開始修復
-
完成修復
-
$ git flow hotfix start <VERSION> [BASE]
$ git flow hotfix finish <VERSION>
Step 5.
hotfix
master
start
finish
develop
Finish flow!
接下來,還有嗎?
有,當然有!
延伸閱讀:Git Cheatsheet
好用的資源
Tutorials
-
Official Document
-
中文說明教學
-
Online Practice
-
Society
Useful Plugins for GitHub
-
Octotree
Code tree for GitHub
-
GitHub with MathJax
Renders GitHub equations with MathJax
-
Isometric Contributions
Renders an isometric pixel view of GitHub contribution graphs
INFO / 陸勇盛 (David Lu)
-
Email
yungshenglu1994@gmail.com -
GitHub
@yungshenglu
Thanks for listening!
Q & A
你所不知道的 Git 進階指令
By Kevin Cyu
你所不知道的 Git 進階指令
clone of 20181006 DigitalOcean Meetup, which will use in 20181013 DigitalOcean x Github Hacktoberfest Tainan.
- 1,902