Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。
管理leos的版本控制系统同android一样,都是git。
git的说明文档很充分,这里不一一列出。只介绍几种经常用到的管理工具及命令。
git clone 方法用于将服务器上分支克隆至本地。
git push 方法与 git pull 方法 用于将本地的代码修改上传至服务器,或将服务器代码下载至本地。
git log 是查看分支修改记录的办法。
常用的附加参数包括
git log -p 查看修改的具体内容
git log --author =" your name" 查看某人的修改内容
git log commit 查看某条修改记录
git status与git diff方法常用来比较代码的异同。
一般的背景是,如果对代码做了修改,用git status可以看到git树的修改情况,比如哪些文件已经修改了,哪些文件没有找到修改源等。
用git diff的方法可以比较两条不同的commit或者是两个不同的branch的异同,也可以生成patch文件。
这两个git方法都可以用来合并不同分支上的代码内容,故在一起总结。
这里举一个十分实用的例子。
本地代码修改完成之后,提交到服务器上等待check与merge的时候,有时候会遇到因为本地代码没有及时更新,与服务器上最新代码有冲突,从而无法成功merge的情况。
通常的处理办法是,服务器上abort这次提交,本地reset本次提交后,重新sync代码。倒霉一点的,如果恰好这段时间有人也提交跟你冲突的代码,你只能重新修改再push了。
但是有了git rebase之后情况就不一样了。
首先,养成好习惯,修改代码不要在master分支上进行。
git checkout -b newbranch
在newbranch上做你的修改,然后放心的commit跟push。
然后,如果此时服务器上出现代码冲突,不用担心。
repo sync 一次
代码会自动切回主线master分支,同步最新的代码。
不用担心你的修改已经消失了。
git checkout newbranch
切回你的分支,发现你的commit仍然存在。
最后,将master分支上的新内容rebase到newbranch上来。
git rebase masterbranch
ok了,省了很大力气吧。
如果本地commit之后,发现有问题需要舍弃本次提交的,可以通过reset方法舍弃当前commit
git reset --soft HEAD^
其中,常用的参数有如下几个选择
--soft 保留所有的更改内容,仅仅只删除commit提交的log
--hard 删除所有更改的内容,回到提交前的状态。
--mixed 这个是默认的修改方法,方式类同soft,,但是会生成上传报告。
至于HEAD^指的是当前栈顶的commit之后的一个commit,这条语句即表示返回前一条commit。
通过git format-patch 与 git apply工具的使用,可以将早期项目的修改提交制成.patch文件,在之后的代码merge时可以很方便的将其导入,减轻的任务的工作量。
以本人在S3_JB上提交的某commit为例。我需要将本次修改内容merge到分支 phone/racer-a_ics上。
首先在S3_JB的分支上找到本人的提交
me@me-Lenovo-Product:~/workspaces/S3_JB/frameworks/base$ git log --author="me"
<code>commit eada6f926e17c9719dff250d4dd0fd3d4d560986</code> Author: me <[email protected]> Date: Wed Sep 19 10:53:21 2012 +0800 [FIX]S3_JB代码merge [WHT]增加的呼叫限制部分framework层的支持,修正了紧急号码列表支持,修正了响铃动作,优化了指令流程,增加了调试用log Change-Id: Ibd168ae3cd1b56e29d4e3084de803694c631eb9d
根据这个commit我得到一个patch文件
me@me-Lenovo-Product:~/workspaces/S3_JB/frameworks/base$ git format-patch -1 eada6f926e17c9719dff250d4dd0fd3d4d560986
0001-FIX-S3_JB-merge.patch
将这个patch文件导入到新的分支当中
me@me-Lenovo-Product:~/workspaces/Racer_ICS/frameworks/base$git apply ~/0001-FIX-S3_JB-merge.patch --reject
会提示很多错误,不用担心,这些错误是因为有文件冲突导致的,这需要我们手动修改部分冲突文件。
me@me-Lenovo-Product:~/workspaces/Racer_ICS/frameworks/base$ git status
# Not currently on any branch.
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
#modified: services/java/com/android/server/TelephonyRegistry.java
#modified: telephony/java/android/telephony/PhoneNumberUtils.java
#modified: telephony/java/com/android/internal/telephony/Phone.java
#modified: telephony/java/com/android/internal/telephony/PhoneProxy.java
#modified: telephony/java/com/android/internal/telephony/RIL.java
#modified: telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
#modified: telephony/java/com/android/internal/telephony/gsm/CallFailCause.java
#modified: telephony/java/com/android/internal/telephony/gsm/GSMPhone.java
#modified: telephony/java/com/android/internal/telephony/gsm/GsmCallTracker.java
#modified: telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
#telephony/java/android/telephony/PhoneNumberUtils.java.rej
#telephony/java/com/android/internal/telephony/gsm/GsmCallTracker.java.rej
no changes added to commit (use "git add" and/or "git commit -a")
看到冲突的文件是最后的Untracked files,以rej文件结尾的文件。
将这几个文件手动merge到对应的文件上就可以了。比全部手动修改要省去很多功夫。
最后是git commit 与 git push 的工作,这里就不再赘述。