关于GIT的常用TIPS

git

Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。

管理leos的版本控制系统同android一样,都是git。

git的说明文档很充分,这里不一一列出。只介绍几种经常用到的管理工具及命令。

git clone,git pull 与 git push

git clone 方法用于将服务器上分支克隆至本地。

git push 方法与 git pull 方法 用于将本地的代码修改上传至服务器,或将服务器代码下载至本地。

git log

git log 是查看分支修改记录的办法。

常用的附加参数包括 

git log -p 查看修改的具体内容

git log --author =" your name" 查看某人的修改内容

git log commit 查看某条修改记录

git status 与 git diff

git status与git diff方法常用来比较代码的异同。

一般的背景是,如果对代码做了修改,用git status可以看到git树的修改情况,比如哪些文件已经修改了,哪些文件没有找到修改源等。

用git diff的方法可以比较两条不同的commit或者是两个不同的branch的异同,也可以生成patch文件。

git merge 与 git rebase

这两个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了,省了很大力气吧。

git reset

如果本地commit之后,发现有问题需要舍弃本次提交的,可以通过reset方法舍弃当前commit

git reset --soft HEAD^

其中,常用的参数有如下几个选择

--soft 保留所有的更改内容,仅仅只删除commit提交的log

--hard 删除所有更改的内容,回到提交前的状态。

--mixed 这个是默认的修改方法,方式类同soft,,但是会生成上传报告。

至于HEAD^指的是当前栈顶的commit之后的一个commit,这条语句即表示返回前一条commit。

git format-patch 与 git apply

通过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 的工作,这里就不再赘述。

你可能感兴趣的:(关于GIT的常用TIPS)