陸勇盛 (David Lu)

yungshenglu1994@gmail.com

@CS.NCKU

OCT 13, 2018

歷史修改 ft.            flow

  • 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

歷史修改 ft.            flow

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^^

Case 2.

暴力型後悔
85e7e30~2

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 - 緊急修復使用,修復完合併到 masterdevelop

release - 上線前的最後測試,測試完合併回 masterdevelop

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

Useful Plugins for GitHub

INFO / 陸勇盛 (David Lu)

Thanks for listening!

Q & A

歷史修改 ft. Git Flow

By David Lu

歷史修改 ft. Git Flow

This slide is using for sharing some advance usages on Git

  • 1,915