為了玩 Android,學會了 git 的初步使用。不過僅止於基本的 git checkout、git log、git diff、git status、git commit 等。 這幾天為了協助同事將 Android 移植到廠商的板子上,必須將廠商提供的 kernel 與 Android kernel 做結合。為此請教一些 git 高手。經過一番練習,總算對 git rebase 的使用有了初步的掌握。也漸漸了解了 git 的強大威力,為什麼高手都愛用… 特別將這段經驗記載在這邊,給有興趣的人參考。 有兩個 git repositories 要做合併。一個是廠商提供的 kernel: git://git.kernel.org/pub/scm/linux/kernel/git/kki_ap/samsung-ap-2.6.git 另一個是 Android 的 kernel: git://android.git.kernel.org/kernel/common.git 首先,先建立一個工作目錄
然後加入兩個遠端的 repositories:
將遠端 repositories 的資料取回:
看看有哪些 branches?
在合併之前,先了解一下已存在的 branches。我們可以先看看這些 branches 的共同祖先(common ancestor):
因此 branch samsung/master 和 android/2.6.27 都是從 v2.6.27 來的,而 samsung/master 和 android/2.6.29 則從 v2.6.28 而來。事實上,不難驗證 samsung/master 是從 v2.6.28.6 改來的。 可以用 gitk 這個圖形化工具來看看從 v2.6.27 到 android/2.6.27 的變化:
同樣的,samsung/master 的變化是:
我們要決定如何進行合併。可以將 samsung 的修改合併到 Android kernel,也可以將 Android 的修改合併到 samsung kernel。我決定選擇後者,因為從 gitk 可以看出 Android 的變化相當簡單而清楚,就是單線發展而已。相對的,samsung kernel 就併來併去,線條亂七八糟,看得眼花瞭亂。因此將 Android 的修改併到 samsung kernel,應該比較簡單而容易成功。 可以用 git rebase 來進行合併。首先,建立一個新的本地 branch 來保存合併結果:
然後用 git rebase 指令,將 v2.6.27 到 android/2.6.27 的修改,一個一個的 apply 到 samsung-android 這個 branch 中:
由這些訊息可看出,前 15 個修改被成功的 apply 上去,但第 16 個產生 conflicts。先用 git status 看看問題出在哪裡:
可以看出有兩個檔案有 conflicts,必須手動修改。例如,在 drivers/misc/Makefile 裡 conflicts 大約在 35 至 39 行:
不難看出,這兩行都要加到 Makefile 中。因此我改成:
接著
用同樣的方法修改 drivers/misc/Kconfig,然後
如此會繼續合併的過程。當然可能產生其它的 conflicts,都用類似的方法修正,直到 rebase 完成。 如果覺得某個產生 conflicts 的修改是不必要的,可以跳過:
如果覺得 conflicts 太複雜了,不知要麼修改,想要放棄,可以
如此會放棄所有的合併結果,而將 source tree 回到合併前的狀態。 |
|