版本控制 - Mercurial
A quick introduction
Vincent CY Liao
2010-06-06, revised at 2014-01-19

1
Outline
■ 序論
●

什麼是 Mercurial ?

●

Mercurial vs. Subversion

■ 使用 Mercurial
●
●

安裝與首次設定
日常使用
■
■
■

建立檔案庫
編修檔案
與其他成員合作

...
序論
■ 什麼是 Mercurial ?
■ Mercurial vs. Subversion

3
什麼是 Mercurial ?
■ 分散式版本控制系統 (Distributed Version Control System, DVCS)
● 大部份作業的進行不需網路
● 使開發能夠較為獨立不受影響
■ 發展現況
●

活躍的發展中
■

...
Mercurial vs. Subversion
branch
repo

pull/push

clone

repo

commit

clone

checkout

clone

checkout
checkout

update
re...
Mercurial vs. Subversion (cont.)
main
repo

repo

push
commit:
bug
pull

repo
commit:
bug

update

commit:
bug-fix

work
c...
Mercurial vs. Subversion (cont.)
Network-1

Network-1

repo

clone

work
copy

repo
commit

Mobile Storage

repo
commit

p...
使用 Mercurial
■ 安裝與首次設定
● 安裝流程概觀
● 取得軟體
● 建置與安裝
● 首次設定

8
安裝流程概觀
■ 前置要件
●

Python 2.4+

■ 安裝流程
● 取得軟體
● 安裝 Python
■
■

●

若系統中沒有 Python 或是版本太舊才需要進行這步驟
使用 python -V 指令檢視系統的 Python 版...
取得軟體 (Python)
http://www.python.org/download/

10
取得軟體 (Mercurial)
http://mercurial.selenic.com/downloads/

11
建置與安裝
■ 準備安裝目錄
cd ~
mkdir bin

■ 安裝 Python ( 如需要 )
mkdir tmp
cd tmp
tar -jxf ~/Python-2.7.5.tar.bz2
./configure –prefix=/h...
建置與安裝 (cont.)
■ 安裝 Mercurial
cd tmp; tar -jxf ~/mercurial-2.6.3.tar.gz
cd mercurial-2.6.3/
make PREFIX=/home/USER/bin/merc...
首次設定
■ 編輯設定檔 ~/.hgrc
●

也可針對 repository 有不同的設定
■

%REPO%/.hg/hgrc

[ui]
username = Alicia <alicia@alpha.local>
[extensions...
使用 Mercurial
■ 日常使用
● 建立檔案庫
● 檔案新增、更名 / 搬移、刪除
● 檢視與送交變更
● 忽略檔案
● 合併其他成員的變更
■
■

單一開發分支的合併
多個開發分支的合併

15
使用 Mercurial
■ 日常使用 (cont.)
●
●

解決變更衝突
檢視紀錄

16
建立檔案庫
■ 建立檔案庫
●

mkdir proj

●

cd proj/

●

hg init
■

在 proj/ 資料夾內會出現存放版本控制資訊的 .hg/ 資料夾

■ 從主檔案庫建立開發分支
●

hg clone /home...
檔案新增、更名 / 搬移、刪除
■ 檔案新增
●

hg add FILE.name

■ 檔案更名或搬移
●

hg mv OLDFILE.name NEWFILE.name

■ 檔案刪除
●

hg rm FILE.name

■ 檔案補...
檢視與送交變更
■ 檢視變更狀況
●

hg st

■ 送交變更
●

hg ci [FILE]
■
■

整個工作資料夾的所有變更都會被送入
要送交部份變更可指明檔名
commit
.hg/

19
忽略檔案
■ 可透過 .hgignore 檔指定要忽略的檔案
●

指定的檔案不會在 hg st 的輸出中顯示

syntax: glob
*.o
a.out
Doxy
doxy-doc
*~
.DS_Store
*.a
src/product...
合併其他成員的變更
■ 從其他檔案庫取得變更
●

hg incoming PATH_TO_OTHER_REPO

●

hg pull PATH_TO_OTHER_REPO

■ 將變更反應到檔案上
●

hg update

●

hg m...
單一開發分支的合併
2:e1

2:e1

1:f7

1:f7

0:ab

clone

2:e1

0:ab

3:ca

2:e1

編輯
1:f7

1:f7

0:ab

0:ab

22
單一開發分支的合併 (cont.)
3:ca

2:e1

1:f7

0:ab

3:ca

2:e1

2:e1

1:f7

3:ca
pull
update

2:e1

合併
1:f7

0:ab

0:ab

1:f7

0:ab
...
多個開發分支的合併
2:e1

1:f7
2:e1

clone

3:b9

2:e1

0:ab

1:f7

1:f7

編輯

3:ca
0:ab

0:ab

clone

2:e1

2:e1

1:f7

1:f7

0:ab

...
多個開發分支的合併 (cont.)
3:b9

5:df

2:e1

4:ca

合併
0:ab

2:e1

1:f7

0:ab

3:b9

3:b9

1:f7
3:ca

4:ca

3:ca
2:e1
2:e1

pull
1:f...
解決變更衝突
■ 變更衝突的起因
● 要合併的變更與本地端的變更有所重疊
■ 解決變更衝突
●
●
●

Mercurial 會將雙方的變更都留在檔案內
協調後手動修改
修改完成後將檔案標示為已解決衝突

■ 標示檔案為已解決衝突
●

hg ...
檢視紀錄
■ 文字模式
●

hg log [FILE]

■ 視窗模式
●

hg view
■

系統上須安裝有 Tcl/Tk

■ 網頁模式
●

hg serve -a 127.0.0.1 -p 8000
■
■

到瀏覽器上透過 ht...
檢視紀錄 (cont.)

28
檢視紀錄 (cont.)

29
小撇步
■ 推送變更到多臺主機
■ 送交部份變更
■ 合併兩個獨立的檔案庫

30
推送變更到多臺主機
■ 可以一定程度的作為佈署的手段
■ 增加 paths 設定到檔案庫的設定中
●

%REPO%/.hg/hgrc

●

hg push [PATH_NAME]

[paths]
default
dev01 =
dev02...
送交部份變更
■ 送交部份變更
●

hg record [FILE]
■

用在一次的程式碼變更內含兩個以上修改主題之場合
▸
▸
▸
▸

■
■

一次修了好幾個 bug
一次加了好幾個 feature
順便做了 re-factor
順便...
送交部份變更 (cont.)
$ hg record

diff --git a/hello.txt b/hello.txt
2 hunks, 5 lines changed

examine changes to 'hello.txt'? [...
送交部份變更 (cont.)
■ 動作選項
●

Y: 紀錄這個變更

●

N: 略過這個變更

●

E: 手動編輯這個變更

●

S: 目前檢視的檔案中,略過這個以下 ( 含 ) 的變更

●

F: 目前檢視的檔案中,紀錄這個以下 (...
合併兩個獨立的檔案庫
■ 偶而會發生
● 合併兩個原本不相干的專案
● 在新的檔案庫開相對獨立子功能之更新版本
■
■

不建議這麼做
建議直接 clone 原本的來進行進一步開發

■ 進行合併前建議先調整兩個檔案庫內的檔案配置
●

降低合...
合併兩個獨立的檔案庫 (cont.)
■ 直接使用 hg pull 取得變更集時會被拒絕
●

“abort: repository is unrelated”

■ 要加上強制拉取選項
●

hg pull -f [TARGET_REPO]
...
其他細節
■ 個人識別名稱
■ 共用帳號

37
個人識別名稱
■ 目前常見的有兩種
● 以個人名義為主
■

●

My Name <email@address.tld>

附加公司簡稱
■

My Name, CORP. <email@address.tld>

■ 在開放專案中會看到第一...
共用帳號
■ 在開發中有時多個開發者得共用主機帳號
● 特別是測試或驗證主機
■ 一般來說建議避免把個人化設定放到共用帳號裡
●

常見的有環境變數、編輯器設定、版控設定等
■

●

~/.bashrc, ~/.profile, ~/.vim...
共用帳號 (cont.)
■ 建立 ~/.myrc-myaccount 指令稿
●

其他設定檔可建立 ~/.myrc-myaccount-data/ 資料夾
來存放

■ 登入時匯入即可完成執行時期客制化
●

. ~/.myrc-myacc...
Thank you !

41
Upcoming SlideShare
Loading in...5
×

版本控制 - Mercurial

541

Published on

使用 Mercurial 進行版本控制

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
541
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

版本控制 - Mercurial

  1. 1. 版本控制 - Mercurial A quick introduction Vincent CY Liao 2010-06-06, revised at 2014-01-19 1
  2. 2. Outline ■ 序論 ● 什麼是 Mercurial ? ● Mercurial vs. Subversion ■ 使用 Mercurial ● ● 安裝與首次設定 日常使用 ■ ■ ■ 建立檔案庫 編修檔案 與其他成員合作 2
  3. 3. 序論 ■ 什麼是 Mercurial ? ■ Mercurial vs. Subversion 3
  4. 4. 什麼是 Mercurial ? ■ 分散式版本控制系統 (Distributed Version Control System, DVCS) ● 大部份作業的進行不需網路 ● 使開發能夠較為獨立不受影響 ■ 發展現況 ● 活躍的發展中 ■ ● 在業界已廣泛使用 ■ ● 最新的版本 : 2.8.2 (Jan. 1, 2014) Google, Sun Oracle, Mozilla … http://mercurial.selenic.com/ 支援多種作業系統 ■ AIX, Darwin, FreeBSD, Linux, Solaris, Windows ... 4
  5. 5. Mercurial vs. Subversion branch repo pull/push clone repo commit clone checkout clone checkout checkout update repo repo work copy work copy commit work copy repo Mercurial Subversion 5
  6. 6. Mercurial vs. Subversion (cont.) main repo repo push commit: bug pull repo commit: bug update commit: bug-fix work copy repo work copy 取得尚有問 題的版本 一次取得修 正好的版本 Mercurial Subversion ( 在 commit 時無需連線主檔案庫 ) 6
  7. 7. Mercurial vs. Subversion (cont.) Network-1 Network-1 repo clone work copy repo commit Mobile Storage repo commit pull+merge repo Network-2 work copy Network-2 Mercurial Subversion ( 可在分離的網路使用 ) 7
  8. 8. 使用 Mercurial ■ 安裝與首次設定 ● 安裝流程概觀 ● 取得軟體 ● 建置與安裝 ● 首次設定 8
  9. 9. 安裝流程概觀 ■ 前置要件 ● Python 2.4+ ■ 安裝流程 ● 取得軟體 ● 安裝 Python ■ ■ ● 若系統中沒有 Python 或是版本太舊才需要進行這步驟 使用 python -V 指令檢視系統的 Python 版本 安裝 Mercurial 9
  10. 10. 取得軟體 (Python) http://www.python.org/download/ 10
  11. 11. 取得軟體 (Mercurial) http://mercurial.selenic.com/downloads/ 11
  12. 12. 建置與安裝 ■ 準備安裝目錄 cd ~ mkdir bin ■ 安裝 Python ( 如需要 ) mkdir tmp cd tmp tar -jxf ~/Python-2.7.5.tar.bz2 ./configure –prefix=/home/USER/bin/python-2.7 make make install cd ~/bin ln -s python-2.7/bin/python . ./python --version export PATH=~/bin:$PATH 12
  13. 13. 建置與安裝 (cont.) ■ 安裝 Mercurial cd tmp; tar -jxf ~/mercurial-2.6.3.tar.gz cd mercurial-2.6.3/ make PREFIX=/home/USER/bin/mercurial install cp contrib/hgk ~/bin/mercurial/bin cd ~/bin ln -s mercurial/bin/hg . ; ln -s mercurial/bin/hgk . 13
  14. 14. 首次設定 ■ 編輯設定檔 ~/.hgrc ● 也可針對 repository 有不同的設定 ■ %REPO%/.hg/hgrc [ui] username = Alicia <alicia@alpha.local> [extensions] hgk = record = 14
  15. 15. 使用 Mercurial ■ 日常使用 ● 建立檔案庫 ● 檔案新增、更名 / 搬移、刪除 ● 檢視與送交變更 ● 忽略檔案 ● 合併其他成員的變更 ■ ■ 單一開發分支的合併 多個開發分支的合併 15
  16. 16. 使用 Mercurial ■ 日常使用 (cont.) ● ● 解決變更衝突 檢視紀錄 16
  17. 17. 建立檔案庫 ■ 建立檔案庫 ● mkdir proj ● cd proj/ ● hg init ■ 在 proj/ 資料夾內會出現存放版本控制資訊的 .hg/ 資料夾 ■ 從主檔案庫建立開發分支 ● hg clone /home/dev/proj proj-my-workcopy ■ 建立檔案庫只需在專案開始時進行一次 17
  18. 18. 檔案新增、更名 / 搬移、刪除 ■ 檔案新增 ● hg add FILE.name ■ 檔案更名或搬移 ● hg mv OLDFILE.name NEWFILE.name ■ 檔案刪除 ● hg rm FILE.name ■ 檔案補刪除 ● hg rm -A FILE.name 18
  19. 19. 檢視與送交變更 ■ 檢視變更狀況 ● hg st ■ 送交變更 ● hg ci [FILE] ■ ■ 整個工作資料夾的所有變更都會被送入 要送交部份變更可指明檔名 commit .hg/ 19
  20. 20. 忽略檔案 ■ 可透過 .hgignore 檔指定要忽略的檔案 ● 指定的檔案不會在 hg st 的輸出中顯示 syntax: glob *.o a.out Doxy doxy-doc *~ .DS_Store *.a src/product src/executable 20
  21. 21. 合併其他成員的變更 ■ 從其他檔案庫取得變更 ● hg incoming PATH_TO_OTHER_REPO ● hg pull PATH_TO_OTHER_REPO ■ 將變更反應到檔案上 ● hg update ● hg merge pull .hg/ update / merge .hg/ other-repo 21
  22. 22. 單一開發分支的合併 2:e1 2:e1 1:f7 1:f7 0:ab clone 2:e1 0:ab 3:ca 2:e1 編輯 1:f7 1:f7 0:ab 0:ab 22
  23. 23. 單一開發分支的合併 (cont.) 3:ca 2:e1 1:f7 0:ab 3:ca 2:e1 2:e1 1:f7 3:ca pull update 2:e1 合併 1:f7 0:ab 0:ab 1:f7 0:ab 23
  24. 24. 多個開發分支的合併 2:e1 1:f7 2:e1 clone 3:b9 2:e1 0:ab 1:f7 1:f7 編輯 3:ca 0:ab 0:ab clone 2:e1 2:e1 1:f7 1:f7 0:ab 0:ab 24
  25. 25. 多個開發分支的合併 (cont.) 3:b9 5:df 2:e1 4:ca 合併 0:ab 2:e1 1:f7 0:ab 3:b9 3:b9 1:f7 3:ca 4:ca 3:ca 2:e1 2:e1 pull 1:f7 1:f7 0:ab merge commit 2:e1 1:f7 0:ab 0:ab 25
  26. 26. 解決變更衝突 ■ 變更衝突的起因 ● 要合併的變更與本地端的變更有所重疊 ■ 解決變更衝突 ● ● ● Mercurial 會將雙方的變更都留在檔案內 協調後手動修改 修改完成後將檔案標示為已解決衝突 ■ 標示檔案為已解決衝突 ● hg resolve -m FILE.name 26
  27. 27. 檢視紀錄 ■ 文字模式 ● hg log [FILE] ■ 視窗模式 ● hg view ■ 系統上須安裝有 Tcl/Tk ■ 網頁模式 ● hg serve -a 127.0.0.1 -p 8000 ■ ■ 到瀏覽器上透過 http://127.0.0.1:8000/ 作為 URL 連線 未給參數的話預設是啟動在所有介面上的 8000 埠 ▸ ■ 有安全顧慮的話最好指定 -a 參數指定介面 按下 CTRL+C 終止 27
  28. 28. 檢視紀錄 (cont.) 28
  29. 29. 檢視紀錄 (cont.) 29
  30. 30. 小撇步 ■ 推送變更到多臺主機 ■ 送交部份變更 ■ 合併兩個獨立的檔案庫 30
  31. 31. 推送變更到多臺主機 ■ 可以一定程度的作為佈署的手段 ■ 增加 paths 設定到檔案庫的設定中 ● %REPO%/.hg/hgrc ● hg push [PATH_NAME] [paths] default dev01 = dev02 = pubserv = ssh://ira@192.168.3.29/project-1 ssh://devuser@192.168.10.8/repo/project-1 ssh://devuser@192.168.10.9/repo/project-1 = http://pubacc@repo.serv.net/project/my-project-1 31
  32. 32. 送交部份變更 ■ 送交部份變更 ● hg record [FILE] ■ 用在一次的程式碼變更內含兩個以上修改主題之場合 ▸ ▸ ▸ ▸ ■ ■ 一次修了好幾個 bug 一次加了好幾個 feature 順便做了 re-factor 順便更新了文件 相當於 hg commit 會提示選擇要加入的變更 ■ 需要在設定檔中啓動這個功能 [extensions] record = 32
  33. 33. 送交部份變更 (cont.) $ hg record diff --git a/hello.txt b/hello.txt 2 hunks, 5 lines changed examine changes to 'hello.txt'? [Ynesfdaq?] y @@ -4,11 +4,11 @@ So she was considering in her own mind (as well as she could, for the hot day -made her feel very sleepy and stupid), whether the pleasure of making a -daisy-chain would be worth the trouble of getting up and picking the daisies, +made her feel very sleepy and stupid), whether the pleasure of making a daisy+chain would be worth the trouble of getting up and picking the daisies, when suddenly a White Rabbit with pink eyes ran close by her. record change 1/3 to 'hello.txt'? [Ynesfdaq?] y @@ -9,12 +9,12 @@ she ought to have wondered at this, but at the time it all seemed quite -natural); but when the Rabbit actually TOOK A WATCH OUT OF ITS +natural); but when the Rabbit actually TOOK A WATCH OUT OF ITS WAISTCOAT... record change 2/3 to 'hello.txt'? [Ynesfdaq?] s diff --git a/world.txt b/world.txt 1 hunks, 1 lines changed examine changes to 'world.txt'? [Ynesfdaq?] y @@ -1,2 +1,2 @@ -An apple a day keeps the doctors away. +An Apple A Day Keeps the Doctors Away. record change 3/3 to 'world.txt'? [Ynesfdaq?] y 33
  34. 34. 送交部份變更 (cont.) ■ 動作選項 ● Y: 紀錄這個變更 ● N: 略過這個變更 ● E: 手動編輯這個變更 ● S: 目前檢視的檔案中,略過這個以下 ( 含 ) 的變更 ● F: 目前檢視的檔案中,紀錄這個以下 ( 含 ) 的變更 ● D: 完成,後面的變更與檔案都略過 ● A: 紀錄後面所有檔案的所有變更 ● Q: 離開,不紀錄任何變更 ● ?: 顯示說明訊息 34
  35. 35. 合併兩個獨立的檔案庫 ■ 偶而會發生 ● 合併兩個原本不相干的專案 ● 在新的檔案庫開相對獨立子功能之更新版本 ■ ■ 不建議這麼做 建議直接 clone 原本的來進行進一步開發 ■ 進行合併前建議先調整兩個檔案庫內的檔案配置 ● 降低合併 (merge) 時發生衝突 (conflict) 的機會 + = + = 35
  36. 36. 合併兩個獨立的檔案庫 (cont.) ■ 直接使用 hg pull 取得變更集時會被拒絕 ● “abort: repository is unrelated” ■ 要加上強制拉取選項 ● hg pull -f [TARGET_REPO] ● 後續動作跟一般的 pull-merge 流程相同 36
  37. 37. 其他細節 ■ 個人識別名稱 ■ 共用帳號 37
  38. 38. 個人識別名稱 ■ 目前常見的有兩種 ● 以個人名義為主 ■ ● My Name <email@address.tld> 附加公司簡稱 ■ My Name, CORP. <email@address.tld> ■ 在開放專案中會看到第一種 ● ● 假設合作的人都會看 E-Mail 位址來辨識所屬組織 個人色彩鮮明 ■ 公司專案就比較不一定 ■ 總之,選一個寫法然後就避免變動 38
  39. 39. 共用帳號 ■ 在開發中有時多個開發者得共用主機帳號 ● 特別是測試或驗證主機 ■ 一般來說建議避免把個人化設定放到共用帳號裡 ● 常見的有環境變數、編輯器設定、版控設定等 ■ ● ~/.bashrc, ~/.profile, ~/.vimrc, ~/.hgrc … etc. 避免讓變數非預設值而影響其他人甚至影響程式運作 ■ 有些設定要怎麼設基本上是信仰的問題 ■ 透過建立個人的環境變數檔來兼顧 ● ● 利用 alias 改變預設指令的傳遞參數 大部份程式都有參數可以改變預設讀取的設定檔 39
  40. 40. 共用帳號 (cont.) ■ 建立 ~/.myrc-myaccount 指令稿 ● 其他設定檔可建立 ~/.myrc-myaccount-data/ 資料夾 來存放 ■ 登入時匯入即可完成執行時期客制化 ● . ~/.myrc-myaccount ● source ~/.myrc-myaccount alias hg=”hg –config 'ui.username=Vincent CY Liao, MyCO <v...@company.com>'” alias vi='vim -u ~/.myrc-vincentl-data/vimrc' export EDITOR=/usr/bin/vim export PATH=/opt/mercurial-2.4/bin:$PATH 40
  41. 41. Thank you ! 41
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×