雖然以前實(shí)習(xí)的時候用過一段時間git,但對git的很多概念還是一知半解。這不,今天又遇到了問題。
今天同步內(nèi)核代碼的時候,執(zhí)行g(shù)it pull,就出現(xiàn)了問題,提示有沖突不能提交。
我當(dāng)時的反應(yīng)時:what the fuck?我沒有任何本地提交,為什么會有沖突?逗我呢?
于是用搜索引擎找答案。
git pull相當(dāng)于git fetch 加上 git merge FETCH_HEAD.
如果只是更新代碼,應(yīng)該用rebase而不是merge。
那么rebase和merge有什么區(qū)別?可以理解為,merge是把遠(yuǎn)程分支的改動合并到自己的分支上,而rebase是把自己合并到遠(yuǎn)程分支上!
所以,如果只是更新,應(yīng)該:
git pull --rebase
相當(dāng)于:
git fetch
git rebase
這時,如果你的本地沒有任何改動,就相當(dāng)于完全更新了本地的分支。如果你有本地改動,則會重新以遠(yuǎn)程分支為標(biāo)準(zhǔn)重新生成log。
以后要提交patch,也得rebase,這樣才能生成最新的patch。
再引申一下,在內(nèi)核的開發(fā)模式中,所有的更新都是以patch的形式發(fā)郵件給各個分支的維護(hù)人的。對于開發(fā)patch的人來說,應(yīng)該避免所有會commit的操作,因?yàn)槟愕腸ommit沒有任何意義,因?yàn)楦膭硬粫詐ush的形式發(fā)送到主分支上,并且主分支也不接受pulling request!
所以也不要revert,因?yàn)閞evert會生成新的提交。應(yīng)該用reset。
另外今天還了解到,git add有多種用途。其核心是把改動放到暫存區(qū)。
今天還發(fā)現(xiàn)個很不錯的git中文教程,記錄一下:
https://github.com/geeeeeeeeek/git-recipes/wiki