Fixing Goofs
水銀最大的好處之一,就是可以利用私有的克隆進行實驗或開發新的特征……如果它們沒有達到預期,你可以一秒之內刪掉它們。
水銀讓你可以自由地實驗。試想一下在普通的編輯過程中,你可能陷入麻煩中甚至產生災難性的后果:
快要愛死emacs編輯器了。好在不是什么都沒了。最常用的恢復回來方法是使用 hg revert
那樣將把文件返回成最后提交的樣式。水銀不喜歡刪除任何東西,而是重新命名:
如果你一步走得太遠了,也就是如果你已經提交了,該怎么辦呢?
這里有一個叫 hg rollback 命令可以拯救你,但是只能用在你沒有推送這一變化到其他任何人的情況。它只撤銷一次提交。
想象一下,你想做一個大的試驗。你的老板雇傭了一位新的設計師,Jim,最近你從他那兒得到的東西都很荒唐。他給了綠色熒光的文字,文字之間并不對齊(出于“藝術”考慮),用起來讓人覺得非常不爽。你想要花一個周末的時間重新做整件事,但是又害怕自己的想法不一定100%的比這古怪的圖像設計師好。Jim基本上從早上起床到晚上上床都一直叼著煙。你并不想因為這個而針對他,況且其他人都覺得只要他的設計足夠好,抽不抽煙是人家的自由。不過講真,這也應該有個極限不是?況且他的設計也不怎么的,加上他還總是很無禮。
使用水銀,你可克隆整個庫來做自己的實驗:
這并不像它看上去的那么沒效率,因為recipes文件夾和recipes-experiment文件夾共享了同樣的歷史。水銀還會使用一個稱為“hard links”的文件系統小技巧,使得拷貝可以變得非常快,而不會占用過多的額外磁盤空間。
現在我們可以在這實驗的分支上做一系列改變:
這是我的大鱷梨醬實驗:
在這個實驗庫中,我們可以自由提交
你可以自由的進行修改和工作,想什么時候提交就什么時候提交。這給了你源碼控制的所有權利,哪怕你的實驗瘋狂之至,也不會影響到別人。
如果你認為實驗走錯了方向,你只需要刪除整個實驗目錄,問題解決了,它消失不見了。
然而如果實驗成功了,你所要做的就是推送你的新改動。
它們去了哪里?
默認條目顯示你將推送的默認路徑庫,如果你不指定其他存儲庫的話,通常情況,這是你克隆的庫,在這個例子中,它是一個本地目錄,但是你也可以選擇一個URL地址。
不要忘了,我們把改動的版本推送到這個庫……
……并不意味著我們已經在那個版本上工作了。
看到了嗎?“奶酪”在變更集5中,但是我的主倉庫工作在變更集4之上。這是因為,有人推送新的變動到倉庫中,并不意味著它們立刻會出現在我工作的目錄中。所有我還在變更集4上工作。
如果我想看變更集5中的東西,必須使用 hg update 命令:
看看發生了什么?變更進入了工作目錄,但是在我工作過的版本的頂部。推送和拉取只會把變更從一個倉庫轉移到另一個倉庫——操作本身并不影響我當前工作目錄的文件。
現在,這是倉庫的狀態:
水銀在倉庫之間移動變更是很靈活的,你可以直接從實驗庫推送到中央庫;
這種方式使得實驗倉庫中的變更5直接被推送到了中央倉庫中。現在,如果我回到我的庫中,就沒有什么可推送的了!
這是因為水銀知道central repo 已經從別的地方得到這個特定的變更集。那樣非常有用,因為不然它將嘗試再次應用變更,這樣將會產生大混亂。
之后他們給設計師Jim一項任務,他說他馬上就會開始工作,但是他兩個月都沒出現。人們已經幾乎忘了他和他的任務。當他第一次出現在辦公室開始工作的時候,他看起來有些曬黑。老實說,沒有人知道他是誰,或者將會發生什么。這有些意思。他的長相并沒有什么特點。漸漸地同事們慢慢回想起來了。不過由于他是個新人,所以也沒人愿意去問他這兩個月究竟發生了什么。就像大家也不會問他臉上的抓痕與青塊是怎么回事一樣。不管怎樣,我們不喜歡那家伙。
有的時候,你會發現幾個月前,你曾經犯了一個錯。
薯條? WTF?!(譯者注:What the Fuck?!)
水銀可以退回到過去的一個舊的變更集。從變更集中,指出與當前工作目錄不同的相對應的地方,讓我們試著回到版本2。
看看剛剛發生了什么?
現在,很長時間過去了,土豆條可能已經從菜單中移除了,各種怪異的事情可能會發生,以致于想要合并這個變更變得幾乎不可能。在那種情況下,你將要解決合并沖突。我們將在下一教程進行討論。
自測
以下是你讀完這篇教程應該會做的:
- 在提交之前或之后,恢復意外的更改。
- 本地克隆倉庫來進行實驗。
- 在倉庫之間推送。
- 修復倉庫久遠之前的歷史版本的錯誤。