2012年5月20日 星期日

rebase

rebase 和 merge 一樣,都是要整合另一個 branch 的內容,
rebase 有一點 "管理 commit " 的意味。


如果把git 的每一次 commit 都當作一個 patch。

merge 會依照每個 patch 的時間,依序把merge 的兩個 branch 的 patch 一一上到source。
所以merge 完,兩個 branch 的 commit 有可能會穿插.


rebase 的話,就一律先上另一個branch 的 commit ,然後再上自己的 commit。

這在系統廠的工程師比較合用。

因為系統廠都是拿 vendor 的 bsp 來改。
所以當 vendor 有新版bsp 時,如果作 merge,
自己的修改和 vendor 的修改就會混在一起,
merge 時的 conflict 也會比較多(?),因為有可能是 vendor 的commit 的 conflict,所以會比較不好 resolve。

如果是用 rebase 的話,至少第一步,vendor 的 new bsp 的 commit一定都上得去。
在自己的commit 才會發生 conflict,
這樣因為 conflict 是在自己的 修改,會比較好 resolve。

2012年3月19日 星期一

use ssh login with username

語法就是: $ git clone ssh://charles@servername/~/mysourcecode .. 可以用 ~ 就不用寫一堆 /home/charles/...

另外也可以指定 port,一樣,寫 sername:port

ref:
http://stackoverflow.com/questions/2433049/git-clone-using-ssh-cant-find-repository

2011年10月13日 星期四

Show current branch only

只要顯示目前的 branch $git rev-parse --abbrev-ref HEAD 這要 git 1.6.3 以上版本才有效

雖然$git branch 會 show 出所有 branch 和目前 branch,
但是跟 repo 一起用的時候就有麻煩:
--- 要知道目前每一個 project 的 branch 是...

用以下 command 就可以清楚列出: $repo forall -p -c 'git rev-parse --abbrev-ref HEAD'

ref:
http://stackoverflow.com/questions/1417957/show-just-the-current-branch-in-git

2011年6月8日 星期三

diff , ignore white space

如果有人改了 white space 的數量,或是以 white space 來代替 tab, diff 的結果就會一團亂。

這時候可以下
git diff -w
來忽略 white space.

如果是在 difftool 模式 (invoke vimdiff),就要在 vi 裡下 command:
:set diffopt+=iwhite



ref: http://stackoverflow.com/questions/1265410/is-there-a-way-to-configure-vimdiff-to-ignore-all-whitespaces

ref: http://myvicommandhelp.blogspot.com/2011/06/diff-ignore-white-space.html

2011年5月15日 星期日

format-patch & am

在作 rebase, merge 的時後,fail 得太嚴重。所以希望手動來作。
手動作 rebase.. 好確保每個 commit 一一個上去。

可以用git format-patch 'rev-name'產生一堆從 'rev-name' 開始的patch , 一個 commit,一個 patch。

有這些patch檔,就可以用git am 'patch-filename'一個一個上回去。
這樣產生的 patch file 和 am 後的 rev ,會把 commit log 也保留住。

如果一次要全上,可以用: git am *.patch
會自動依照 001, 0002. 003 的順序 patch .

format-patch 可以加 option '-3' 表示 只要該rev 後的三個 patch



ref:
http://gitready.com/intermediate/2009/03/04/pick-out-individual-commits.html

2011年5月5日 星期四

revert/undo rebase

rebase 後發現 fail,要 rollback 怎辦?

列出 reflog,用 git log 找出 rebase 之前的那個 head 是哪一個,然後用 reset --hard 切過去。

git reflog
afa93f0 HEAD@{0}: rebase: tidy up the driver/misc/Makefile, keeps the 9.4 kernel content, just append the new source added by us
7a3b48e HEAD@{1}: checkout: moving from rtk2 to 7a3b48ec1ba6eee2298ee654c0cee1e06f464fed^0
f4fbe68 HEAD@{2}: checkout: moving from rtk to rtk2
6d5d23c HEAD@{3}: checkout: moving from rtk to rtk
6d5d23c HEAD@{4}: checkout: moving from rtk2 to rtk
f4fbe68 HEAD@{5}: checkout: moving from debug_suspend_wakeup to rtk2
4c13583 HEAD@{6}: commit: add more comment : wake_lock_internal & alarm.c
d8cf098 HEAD@{7}: rebase: add a lot message to trace the lock sequence
fe3b73a HEAD@{8}: rebase: use external sd as boot
f4fbe68 HEAD@{9}: checkout: moving from debug_suspend_wakeup to f4fbe680ef41ed3d38ecc1f49a8b2c32a294c178^0
733e20f HEAD@{10}: checkout: moving from rtk2 to debug_suspend_wakeup
f4fbe68 HEAD@{11}: commit: tidy up the driver/misc/Makefile, keeps the 9.4 kernel content, just append the new source added by us
6d5d23c HEAD@{12}: checkout: moving from rtk to rtk2
6d5d23c HEAD@{13}: checkout: moving from imx_r9.4 to rtk
901321c HEAD@{14}: checkout: moving from rtk to imx_r9.4
6d5d23c HEAD@{15}: checkout: moving from 37bace68774d42fc2bea3b2aa2fb8aafb3a6f5a0 to rtk
37bace6 HEAD@{16}: checkout: moving from rtk to 37bace68774d42fc2bea3b2aa2fb8aafb3a6f5a0
6d5d23c HEAD@{17}: checkout: moving from debug_suspend_wakeup to rtk

reflog 會列出每次 operation, HEAD 變動的 log,後面列的是HEAD 的 latest log。

所以可以猜出 HEAD@{11} 大概是 rebase 之前的 head.
... rebase 包含很多動作,rollback, patch them, patch mine... 所以HEAD 變動很多次。

為了確認,可以用 git log 看一下
git log --pretty=oneline HEAD@{11}
f4fbe680ef41ed3d38ecc1f49a8b2c32a294c178 tidy up the driver/misc/Makefile, keeps the 9.4 kernel content, just append the new source added by us
6d5d23c54c2198831014b13d2f85f6f353f9e878 merge from 9.1: dimmer & brake gpio initial setting
911b3e5a7aced34f107715ebe4a1c09f8228c683 switch the sdcard init sequence, to make emmc as mmc0 always
a56e643558b691e5db349f0e630acc8e4e768cd4 Merge branch 'rtk' of git://robot/linux-2.6.35.y into rtk
8269efc25f3339750c7c9d05be88bc3232930f05 fix bug: system data abort due to audio-p driver
698afa31b154d7ea6ac6a3ba8664678e14fbbc97 fix bug: system data abort due to audio-p driver

這樣確認是了。

reset --hard 過去:
git reset --hard HEAD@{11}





ref :