狠狠撸

狠狠撸Share a Scribd company logo
版本控制系统
              --以svn為例
                Ying-Shiuan Pan




2010/9/21                     1
Content
》 為什麼需要版本控制系统?

》 架設svn伺服器

》 怎麼用?
 ? 基礎
 ? 基礎-2 (衝突的處理)

 ? 進階 (branch & tag)

 ? 補充



                          2
為什麼需要版本控制系统?
》 專案沒辦法一個人完成
 ? Alice, Bob, Chloe, Daniel…
 ? Alice傳檔給Bob說:
     ?   我完成了,接下來交給你
 ?   Bob傳檔給Chloe說:
     ?   我完成了,接下來交給你
 ? Daniel要幹嘛?
 ? Alice突然發現她有bug,怎麼辦?
     ?   「欸,最新版檔案在哪?我要改一下bug」
                                3
為什麼需要版本控制系统?
》 天有不測風雲
 ?   你怎麼備份你的程式碼?
     ? $ cp -R proj/* proj-20100901-1700/
     ? $ tar -zxf proj-20100901-
       1700.tar.gz proj/
     ? $ ./make_backup.py
         △ 壓縮、寄信、上傳、crontab定期執行……


》 幹嘛不把這些精神用在寫程式上?



                                            4
為什麼需要版本控制系统?
》 人非聖賢,孰能無過;知錯能改
 ? "Nobody really creates? perfect code the
   first time... except me, but there is only one
   of me“ --Linus Torvalds
 ? 「Bob!昨天這功能還好的,怎麼又壞了」
 ? Alice 解開昨天的版本、做diff、一一詢問
   這些是誰改?
》 幹嘛不把這些時間花在寫程式上?


                                                    5
有了版本控制软体


         v7
         v6
                               Released
  v5     v5            v5           1.0
  v4     v4    v4      v4
  v3     v3    v3      v3
  v2     v2    v2      v2
  v1     v1    v1      v1
Alice   Bob   Chloe   Daniel       6
有了版本控制软体
》 Alice改好了
 ?   svn commit -m “[fixed] bug-0487”
》 Bob要上一版
 ?   svn checkout URL -r r2
》 Chloe要看誰改了他的code
 ?   svn annotate
》 Daniel發現昨天是好的,今天是爛的
 ?   svn diff r1 r2
                                        7
有哪些版本控制軟體?
》 No   $$$$
  ? CVS
  ? SVN

  ? GIT

  ?…

》 $$$$
  ? Bitkeeper
  ? Visual SourceSafe

  ?…
                        8
真的有人在用嗎?
》 Linux,  gcc, GNOME, KDE, pidgin,
  firefox,新酷音, …………
》 Open Foundry
  ?   PCMan, …
》 Google   code
  ?   pcmanx, ibus, google chromium…
》 IBM,   TSMC, OSLab…

                                       9
厂痴狈架构图
                     Local
                     Workspace



                                         Local
                                     Workspace
Central
Repository   Local
             Workspace

                         Local
                         Workspace
                                         10
SVN架設
》 1.   svn伺服器
  ?    svn://xxx.xxx.xxx


》 2.   apache + dav_svn module
  ? http://os.csie.ncku.edu.tw/svn/proj
  ? http://tinyurl.com/28am6m

》 3.   local file
  ?    file://var/svn/proj
                                          11
SVN使用步驟
》 由SVN管理員建立一個svn          repository
》 專案管理員先svn import
》 開發成員先checkout

》 開發成員開始開發
 while (is_project_done == false) {
     svn update
     edit
     svn update
     svn commit
 }                                     12
(admin) svnadmin create
》$  sudo apt-get install
  subversion
》 $ mkdir ~/svn

》 $ svnadmin create ~/svn/PROJ



         create


svn管理員              Central
                                 13
                    Repository
(PM) svn import
》$  mkdir /tmp/proj
》 $ cd /tmp/proj

》 $ mkdir trunk tags branches

》 $ svn import ./
  file:///home/PM/proj -m
  “initial import”

        import

專案管理員                 Central      14
                      Repository
(Alice) svn checkout
 》$  svn checkout
   file:///home/PM/proj
   ~/alice/proj
 》 $ cd ~/alice/trunk




專案開發者a     checkout

                       Central
                       Repository   15
(Bob) svn checkout
》$  svn checkout
  file:///home/PM/proj
  ~/bob/proj
》 $ cd ~/bob/proj/trunk




                            16
Alice
》$    vim main.c
int main()
{
  return 0;
}

》$  svn add main.c
》 $ svn commit
  ?   r2


                           17
Alice
》$    vim main.c
int main()
{
  fn_a();
  return 0;
}
void fn_a()
{
  puts(“fn_a v1n”);
}

》$    svn commit
  ?   r3                       18
Bob
》$  svn update
》 $ vim bob.c
void fn_b()
{
  puts(“fn_b v1n”);
}

》$  svn add bob.c
》 $ svn commit
  ?   r4
                             19
Bob
》$   vim main.c
int main()
{
  fn_a();
  fn_b();
  return 0;
}
....

》 尚未commit



                        20
Alice
》$  svn update
》 $ vim main.c
....
void fn_a()
{
  puts(“fn_a v2n”);
}

》$    svn commit
  ?   r5

                               21
Bob
》$   svn commit
 ?   ……error!
》$  svn update
》 $ cat main.c
 ? 神奇的事情發生了!
 ? 阿阿阿阿阿阿阿!!

 ? 他居然合併了耶!!

》$   svn commit
 ?   r6                 22
(Alice) svn diff
》$   svn update
 ?   !?我的main.c被改了,被改了什麼??
》$  svn log
》 $ svn diff main.c -r 5
 ?   不加版號是比對目前版本與base的差異




                              23
小結-1
》 先update再改

》 先update再commit
 ? 確保可以編譯過再commit
 ? commit log一定要寫!

》 基本上,以base版本為比較基準,沒有
 改到同一行的話,可以無痛合併
 ?   改到同一行,咩安抓?


                        24
Alice
》$   vim main.c
int main()
{
  fn_a();
  fn_b2();
  return 0;
}

》$   svn commit


                          25
Bob
  ?   //忘了先update,或是update之後別人有
      commit
》$    vim main.c
int main()
{
  fn_a();
  fn_b5();
  return 0;
}

》$    svn update
  ?   !!!!!!!! Conflict!!!!!!     26
Bob


 ? postpone: 延後處理
                            文字介面
 ? mc: 衝突部份接受自己的版本           才有!
 ? tc: 衝突部份接受他人的版本

》 延後處理會產生三個檔案:
 ? main.c.mine   //自己的修改版
 ? main.c.r10    //base版本
 ? main.c.r11    //衝突版本        27
Bob
》 原本的main.c會變成……



    自己修改的



   別人修改的




                   28
衝突的解法
》 溝通

》 溝通

》 溝通

》 溝通

》 溝通
         廢話
》 溝通

》 溝通

               29
衝突的解法
》 溝通、討論完、編輯main.c
》$   svn resolved main.c
 ?   會移除3個相關檔案.mine, .r10, .r11
》…
》$   svn commit




                                  30
小結-2
》 改到同一行會有衝突

》 溝通、討論
》 一定要svn   resolved




                      31
branch & tag
》 Branch
  ?   暫時進行測試用的、除錯用的、開發新功能
》 Tag
  ?   stable、可以release的版本




                             32
branch & tag
                   branch-1-1
                                 merge
        branch-1
                        merge
trunk
            tag         merge    merge
                                         2.0
                  1.0
                         1.1
                                 1.2

                                               33
branch & tag
》 在svn中,branch跟tag的差別不大
》$   svn copy addr_from addr_to
 ?   svn copy file:///svn/proj/trunk
     file:///svn/proj/branches/bug-8642
》$   svn merge addr_from addr_to




                                          34
小結-3
》 版本(revision)號碼是線性成長,
  branch/tag的版本號碼與trunk共用
》 merge 後branch或tag的資料夾依然存在
 ?   有需要,要自己svn rm
》 merge時,一樣可能發生衝突,請參閱小
 結-2



                              35
補充 - 哪些檔案要放上svn
》 無法自動產生的

》 程式碼

》 Makefile

》 configure

》 文件

》 圖片、圖示!?



                         36
補充 - 哪些檔案不用放上svn
》 可以自動產生的

》 objectfile
》 執行檔

》 如果你會寫autoconf,那Makefile、
  configure file也不用放 :p




                             37
補充 - 其他指令
》   svn status         》 svn mkdir
    ×   看哪些檔案被改過、      》 svn mv (=rename,
        衝突、等狀態           move, ren)
》   svn info           》 svn rm (=del,
    ×   repository資訊     delete)
》   svn revert XXX         ×   這三項做完,別忘了
    ×   拋棄檔案的修改內容              要commit




                                           38
補充 - 指令縮寫
》   checkout           》   annotate
    ×   co                 ×   ann
》   commit
    ×   ci
》   status
    ×   stat, st
》   diff
    ×   di


                                      39
補充 - Svn GUI
》 Windows
  ?   TortoiseSVN
》 Linux
  ?   rapidsvn




                                40
有问题吗?

        41
參考資料
》 Jserv   - 淺談版本控制系统
  ?   http://blog.linux.org.tw/~jserv/archives/0011
      48.html
》 Version    Control with Subversion
  ?   http://www.csie.ntut.edu.tw/sdrc/files/cours
      e/20061027/SVN.pdf

More Related Content

Intro to svn

  • 1. 版本控制系统 --以svn為例 Ying-Shiuan Pan 2010/9/21 1
  • 2. Content 》 為什麼需要版本控制系统? 》 架設svn伺服器 》 怎麼用? ? 基礎 ? 基礎-2 (衝突的處理) ? 進階 (branch & tag) ? 補充 2
  • 3. 為什麼需要版本控制系统? 》 專案沒辦法一個人完成 ? Alice, Bob, Chloe, Daniel… ? Alice傳檔給Bob說: ? 我完成了,接下來交給你 ? Bob傳檔給Chloe說: ? 我完成了,接下來交給你 ? Daniel要幹嘛? ? Alice突然發現她有bug,怎麼辦? ? 「欸,最新版檔案在哪?我要改一下bug」 3
  • 4. 為什麼需要版本控制系统? 》 天有不測風雲 ? 你怎麼備份你的程式碼? ? $ cp -R proj/* proj-20100901-1700/ ? $ tar -zxf proj-20100901- 1700.tar.gz proj/ ? $ ./make_backup.py △ 壓縮、寄信、上傳、crontab定期執行…… 》 幹嘛不把這些精神用在寫程式上? 4
  • 5. 為什麼需要版本控制系统? 》 人非聖賢,孰能無過;知錯能改 ? "Nobody really creates? perfect code the first time... except me, but there is only one of me“ --Linus Torvalds ? 「Bob!昨天這功能還好的,怎麼又壞了」 ? Alice 解開昨天的版本、做diff、一一詢問 這些是誰改? 》 幹嘛不把這些時間花在寫程式上? 5
  • 6. 有了版本控制软体 v7 v6 Released v5 v5 v5 1.0 v4 v4 v4 v4 v3 v3 v3 v3 v2 v2 v2 v2 v1 v1 v1 v1 Alice Bob Chloe Daniel 6
  • 7. 有了版本控制软体 》 Alice改好了 ? svn commit -m “[fixed] bug-0487” 》 Bob要上一版 ? svn checkout URL -r r2 》 Chloe要看誰改了他的code ? svn annotate 》 Daniel發現昨天是好的,今天是爛的 ? svn diff r1 r2 7
  • 8. 有哪些版本控制軟體? 》 No $$$$ ? CVS ? SVN ? GIT ?… 》 $$$$ ? Bitkeeper ? Visual SourceSafe ?… 8
  • 9. 真的有人在用嗎? 》 Linux, gcc, GNOME, KDE, pidgin, firefox,新酷音, ………… 》 Open Foundry ? PCMan, … 》 Google code ? pcmanx, ibus, google chromium… 》 IBM, TSMC, OSLab… 9
  • 10. 厂痴狈架构图 Local Workspace Local Workspace Central Repository Local Workspace Local Workspace 10
  • 11. SVN架設 》 1. svn伺服器 ? svn://xxx.xxx.xxx 》 2. apache + dav_svn module ? http://os.csie.ncku.edu.tw/svn/proj ? http://tinyurl.com/28am6m 》 3. local file ? file://var/svn/proj 11
  • 12. SVN使用步驟 》 由SVN管理員建立一個svn repository 》 專案管理員先svn import 》 開發成員先checkout 》 開發成員開始開發 while (is_project_done == false) { svn update edit svn update svn commit } 12
  • 13. (admin) svnadmin create 》$ sudo apt-get install subversion 》 $ mkdir ~/svn 》 $ svnadmin create ~/svn/PROJ create svn管理員 Central 13 Repository
  • 14. (PM) svn import 》$ mkdir /tmp/proj 》 $ cd /tmp/proj 》 $ mkdir trunk tags branches 》 $ svn import ./ file:///home/PM/proj -m “initial import” import 專案管理員 Central 14 Repository
  • 15. (Alice) svn checkout 》$ svn checkout file:///home/PM/proj ~/alice/proj 》 $ cd ~/alice/trunk 專案開發者a checkout Central Repository 15
  • 16. (Bob) svn checkout 》$ svn checkout file:///home/PM/proj ~/bob/proj 》 $ cd ~/bob/proj/trunk 16
  • 17. Alice 》$ vim main.c int main() { return 0; } 》$ svn add main.c 》 $ svn commit ? r2 17
  • 18. Alice 》$ vim main.c int main() { fn_a(); return 0; } void fn_a() { puts(“fn_a v1n”); } 》$ svn commit ? r3 18
  • 19. Bob 》$ svn update 》 $ vim bob.c void fn_b() { puts(“fn_b v1n”); } 》$ svn add bob.c 》 $ svn commit ? r4 19
  • 20. Bob 》$ vim main.c int main() { fn_a(); fn_b(); return 0; } .... 》 尚未commit 20
  • 21. Alice 》$ svn update 》 $ vim main.c .... void fn_a() { puts(“fn_a v2n”); } 》$ svn commit ? r5 21
  • 22. Bob 》$ svn commit ? ……error! 》$ svn update 》 $ cat main.c ? 神奇的事情發生了! ? 阿阿阿阿阿阿阿!! ? 他居然合併了耶!! 》$ svn commit ? r6 22
  • 23. (Alice) svn diff 》$ svn update ? !?我的main.c被改了,被改了什麼?? 》$ svn log 》 $ svn diff main.c -r 5 ? 不加版號是比對目前版本與base的差異 23
  • 24. 小結-1 》 先update再改 》 先update再commit ? 確保可以編譯過再commit ? commit log一定要寫! 》 基本上,以base版本為比較基準,沒有 改到同一行的話,可以無痛合併 ? 改到同一行,咩安抓? 24
  • 25. Alice 》$ vim main.c int main() { fn_a(); fn_b2(); return 0; } 》$ svn commit 25
  • 26. Bob ? //忘了先update,或是update之後別人有 commit 》$ vim main.c int main() { fn_a(); fn_b5(); return 0; } 》$ svn update ? !!!!!!!! Conflict!!!!!! 26
  • 27. Bob ? postpone: 延後處理 文字介面 ? mc: 衝突部份接受自己的版本 才有! ? tc: 衝突部份接受他人的版本 》 延後處理會產生三個檔案: ? main.c.mine //自己的修改版 ? main.c.r10 //base版本 ? main.c.r11 //衝突版本 27
  • 28. Bob 》 原本的main.c會變成…… 自己修改的 別人修改的 28
  • 29. 衝突的解法 》 溝通 》 溝通 》 溝通 》 溝通 》 溝通 廢話 》 溝通 》 溝通 29
  • 30. 衝突的解法 》 溝通、討論完、編輯main.c 》$ svn resolved main.c ? 會移除3個相關檔案.mine, .r10, .r11 》… 》$ svn commit 30
  • 32. branch & tag 》 Branch ? 暫時進行測試用的、除錯用的、開發新功能 》 Tag ? stable、可以release的版本 32
  • 33. branch & tag branch-1-1 merge branch-1 merge trunk tag merge merge 2.0 1.0 1.1 1.2 33
  • 34. branch & tag 》 在svn中,branch跟tag的差別不大 》$ svn copy addr_from addr_to ? svn copy file:///svn/proj/trunk file:///svn/proj/branches/bug-8642 》$ svn merge addr_from addr_to 34
  • 35. 小結-3 》 版本(revision)號碼是線性成長, branch/tag的版本號碼與trunk共用 》 merge 後branch或tag的資料夾依然存在 ? 有需要,要自己svn rm 》 merge時,一樣可能發生衝突,請參閱小 結-2 35
  • 36. 補充 - 哪些檔案要放上svn 》 無法自動產生的 》 程式碼 》 Makefile 》 configure 》 文件 》 圖片、圖示!? 36
  • 37. 補充 - 哪些檔案不用放上svn 》 可以自動產生的 》 objectfile 》 執行檔 》 如果你會寫autoconf,那Makefile、 configure file也不用放 :p 37
  • 38. 補充 - 其他指令 》 svn status 》 svn mkdir × 看哪些檔案被改過、 》 svn mv (=rename, 衝突、等狀態 move, ren) 》 svn info 》 svn rm (=del, × repository資訊 delete) 》 svn revert XXX × 這三項做完,別忘了 × 拋棄檔案的修改內容 要commit 38
  • 39. 補充 - 指令縮寫 》 checkout 》 annotate × co × ann 》 commit × ci 》 status × stat, st 》 diff × di 39
  • 40. 補充 - Svn GUI 》 Windows ? TortoiseSVN 》 Linux ? rapidsvn 40
  • 42. 參考資料 》 Jserv - 淺談版本控制系统 ? http://blog.linux.org.tw/~jserv/archives/0011 48.html 》 Version Control with Subversion ? http://www.csie.ntut.edu.tw/sdrc/files/cours e/20061027/SVN.pdf