2014年2月7日 星期五

長時間沒有merge的branch要如何在master已有多個commit後安全的將delta匯入(以git版本控制為例)==>你要的是rebase

我所面臨的情境是這樣的,最開始是clone了一個project下來自己改自己用,沒想過要push回remote repo,然後時間飛快過了一年,驚覺master的子版本已經跳了3次,已經不知道要怎麼merge起了。

參考 wiki對merge的解釋 ,可以了解,由於使用了"共祖"的觀念(嗯…怎麼有點演化生物學的感覺),經由 diff3  / three-way merge 的使用,各段程式碼中,三者皆同的部分是不用更動的,兩兩相同時,只有本地分直不同者也是不用更動,只有遠端不同時則使用遠端版本,只有共祖不同時則發出衝突訊息。只要本地及遠端的變更沒有重疊到,基本上都能合併出正確的程式碼。由於:

git pull = git fetch + git merge (所以想要看 diff report 的話就不能直接 pull,要先fetch,再diff,再pull)

所以原則上會使用一次到位的 git pull 指令。但是請參考 "使用 git rebase 避免無謂的 merge" 這篇文章,顯然當我們手上開發的 feature 和 master 沒有什麼重疊的時候,一堆因為與遠端 merge 進而產生出來的節點會讓線圖太複雜,此時 rebase 是一個更清爽的解決方案,它減少了每次因為 merge 而產生出來的那個 dummy 節點。 wiki 上也對這個過程作了一些解釋,基本上就是說,每個 commit 間的 patch 都會同步進行調整演算,讓 rebase 能得到正確的結果。所以下達以下指令:

git pull --rebase

要指定非預設repo/branch時則應下達以下指令:

git pull --rebase repo branch

ps.更詳細的操作可參考 pro git ,簡要列表可參考 版本控制系統 Git 精要 ,branch 圖解還可以參考這篇, rebase 還可以參考這篇 和更詳細的Git-rebase 小筆記
ps2.更複雜的情況,有不止一個 repo 時,diff的方式可參考這篇 ,典型的衝突解決方式參考這篇 和 這篇

20171010更新:

這篇 gitbook 寫得很簡潔,大約500字而已,趕時間可以快速瀏覽一下


2014年2月4日 星期二

ubuntu上開源文件檢視器evince的make手記(3)

首先,由原始碼之取得到建置的程序,官網改放在這個網頁:(2014-2-4所見)

https://wiki.gnome.org/Apps/Evince/GettingEvince

其次,之前遇到過的建置時發生的問題,似乎都已有修正,但也引出新的問題。

官網上提供的 jhbuildrc-evince 及 evince.modules , 它們是整個gnome的jhbuild縮減版,其中libsecret由於未指定版本,故可能直接抓了最新版,結果所要求的glib2版本為38,但evince.modules提供的為36,明顯不足。抓下 evince.modules ,修改此檔以指定glib版本為2-38,重新編譯即可。假設使用者為XXX,jhbuild目錄放在家目錄下,則下達的命令為:

jhbuild -f ~/jhbuildrc-evince -m ~/jhbuild/evince.modules

而當在checkout/evince子目錄下修改了部分程式碼後,要進行make時,所下達命令則如下:

jhbuild -f ~/jhbuild/jhbuildrc-evince -m ~/jhbuild/evince.modules make

執行所建置出來的evince時所下達命令為:

jhbuild -f ~/jhbuildrc-evince run evince

因此在我新安裝的ubuntu 13.10上是很順的完成編譯及執行了。