陸勇盛 (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
“趕快想辦法畢業!”
Slides Link
陸勇盛 (David Lu)
yungshenglu1994@gmail.com
問題來了!
如何取消 commit?
如何修改 commit?
消除一堆無意義的 commit?
故事是這樣的...
使用 Docker container 運行專案程式,
在本機端修改完畢後要用 scp 上傳頗麻煩,
於是利用 GitHub 作為媒介來管理專案,
不知不覺製造出一堆無意義的 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 紀錄
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^^
暴力型後悔
85e7e30~2
master~3
Tips - 小心使用 --hard
A
master
HEAD
B
C
D
e12d8ef
85e7e30
657fce7
abb4f43
Git reset
$ git reflog
$ git reset <COMMIT> --hard
Tips - 小心使用 --hard / --soft / --mixed
Tips - Git reflog 可以尋找遺失的 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
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 中有提示
小心使用!
Git rebase
# git rebase <COMMIT>
$ git rebase master
A
issue
HEAD
B
C
D
e12d8ef
85e7e30
657fce7
abb4f43
b174a5a
E
053fb21
E
issue
HEAD
master
Tips - 衝突發生需搭配 --continue / --abort
Tips - 使用 ORIG_HEAD 還原
Git cherry-pick
# git cherry-pick <COMMIT> <COMMIT> ...
$ git cherry-pick cef6e40
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 <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
$ 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 提交的正確與否
接下來,開發上有好用的東西
master - 穩定可上線版本,不透過這個分支進行 commit
hostfix - 緊急修復使用,修復完合併到 master 與 develop
release - 上線前的最後測試,測試完合併回 master 與 develop
develop - 所有開發的基礎分支,有此新增 feature 分支
feature - 新增功能的分支,完成後合併回 develop
$ 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
有任何開發一律先開分支
完成分支
$ git flow feature start <MY_FEATURE>
$ git flow feature finish <MY_FEATURE>
feature/awesome
develop
start
finish
發佈新功能分支
取得新功能分支
$ git flow feature publish <MY_FEATURE>
$ git flow feature pull <MY_FEATURE>
$ git flow feature track <MY_FEATURE>
Tips - 使用 track 可以追蹤 feature
Git flow release
發佈新版本
完成推出新版本
$ git flow release start <MY_RELEASE> [BASE]
$ git flow release publish <MY_RELEASE>
$ git flow release finish <MY_RELEASE>
release
develop
start
finish
master
Git flow hotfix
開始修復
完成修復
$ git flow hotfix start <VERSION> [BASE]
$ git flow hotfix finish <VERSION>
hotfix
master
start
finish
develop
接下來,還有嗎?
有,當然有!
延伸閱讀:Git Cheatsheet
Official Document
中文說明教學
Online Practice
Society
Octotree
Code tree for GitHub
GitHub with MathJax
Renders GitHub equations with MathJax
Isometric Contributions
Renders an isometric pixel view of GitHub contribution graphs
Email
yungshenglu1994@gmail.com
GitHub
@yungshenglu
Q & A