常用技法:
1. git blame
显示文件修改相关信息,包括commit-id, author, message,date.
eg: git blame -L 166,+10 ,查看文件的166行开始的后10行相关信息。
2. Git log –pretty=oneline
一行行显示该git库的所有提交
Git log --pretty=format:""
按照某一种格式显示,有如下供选择的格式:
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期%cr 提交日期,按多久以前的方式显示
%s 提交说明
3. 在本地的某一个branch上的提交需要提交到服务器上某一个分支(本地没有这个分支):
(1) git branch -a
显示出所有的profect (在gerrit上的project的list/branchs)
(2) git fetchaosp(远程服务器名)
将远程服务器(aosp都是远程服务器名字,在.repo/manifest.xml中有)获取最新版本到本地,不会自动merge。(远程服务器上也许有多个branch,该操作将所有的branch获取到了本地)
(3) git checkout remotes/aosp/dev/xxx/edu/4.4.4(git branch -a看到的,该操作是切换到获取到本地的远程服务器中某一个branch)
注:此时不要用成git checkout -b,git checkout -b remotes/aosp/dev/xxx/edu/4.4.4表示在本地创建一个叫“remotes/aosp/dev/xxx/edu/4.4.4”的分支,并不是将远程分支拉到本地。
(4) 提交
git push aosp HEAD:refs/for/dev/xxx/edu/4.4.4
4. 建立的不同branch上都有修改,切换branch时候,如何保证各自的修改在各自的branch上:
1). 使用git stash保存当前的工作现场,那么就可以切换到其他分支进行工作,或者在当前分支上完成其他紧急的工作,比如修订一个bug测试提交。(执行git stash后(不管是当前分支,还是其他分支),工作区是纯净的,commit的内容跟git stash前的内容无关,且git stash后各分支的commit log也在各自的分支上;在同一分支上git stash,会在有不同修改内容的工作区上工作,互不影响)
2). 可以在各自的分支上执行git stash来保存各自的工作现场,stash队列中就有了多个工作现场,
git stash list查看stash队列(该队列是全局的,不论在哪一个branch上,都可以list和pop/apply)。
3). 如果在一个分支上想要恢复某一个工作现场怎么办:先用git stash list查看stash队列。确定要恢复哪个工作现场到当前分支。然后用git stash pop stash@{num}。num就是你要恢复的工作现场的编号。
4). 如果想要清空stash队列则使用git stash clear。
5). 同时注意使用git stash pop命令是恢复stash队列中的stash@{0}即最上层的那个工作现场。而且使用pop命令恢复的工作现场,其对应的stash在队列中删除。使用git stash apply stash@{num}方法除了不在stash队列删除外其他和git stash pop 完全一样。
5. 去掉提交中的无用空格
1).git diff //检查是否有空格,若没有空格,直接后add & commit & push操作;若有空格,执行步驟2:
2).git diff > ~/temp //将之前的修改暂存到~目录下文件名为1的临时文件中;
3). git reset --hard //将当前project code reset到修改之前的状态;
4). git apply --whitespace=fix ~/temp //将暂存的修改恢复,之后再git diff检查是否有空格,如此反复直到没有空格为止(一般情況下只需一次,即可去除全部空格);再进行后续的add & commit & push操作(生成patch工作)
6. 撤回
Git reset –soft HEAD(~n)退回到stage
Git reset –mixed(cached)从stage退回到本地
Git reset –mixed HEAD(~n) 从代码库退回到本地
Git reset –hard HEAD(~n) 代码库,stage,本地都撤销
7.git tag
git tag V1.0 ae468d8kt //为某次提交创建标签
git tag V1.0 //在当前分支最后一次提交创建标签
git checkout V1.0 //检出标签与检出分支一样操作,但检出标签后用git branch查看本地分支会发现你现在不再任何分支上,git checkout commit_id,此时都会不在任何一个分支上
solution:
这时你不应该修改,而应该立即基于此标签创建一个分支
git checkout -b new_branch_name
8. git merge
git merge branch_name将branch_name合并到当前branch : 在当前分支上用一个空的提交同时指向当前分支和branch_name分支上的提交
merge在本地的两份code:
codeA/kernel codeB/kernel进行merge:
Cd进codeA/kernel,pwd获得该project的path,到codeB/kernel中执行:
git checkout -b newbranch
Git remote add-fcaf2 codeA-kernel-path
Git branch -a (可以查看newbranch)
Git merge newbranch
对于本地的两份code,写脚本就可以去操作每一个project,完成整份code的本地merge。
9.将某一个branch上的commit片段移到另一个branch上
Eg:
B1 :
C1->C2->C3->C4->C5 <- - B1
B2:
C11->C12->C13->C14->C15 <– B2
将B1 branch的C3,C2移到B2 branch上
Git rebase –onto B1~5 B1~4 B1~1 此命令首先会切换到最后的参数上,如果最后的参数不是一个branch而是某一个commit的时候,此时会处在no branch上,这个时候需要创建一个branch(B3),这个B3 branch上就有截取的C2,C3 ;
git checkout B2;
Git merge B3就可以将C2,C3片段添加到B3的最近commit上(merge的时候找到B3和B2的共同祖先,之后在当前branch上将B3的不同的commit添加在后边;如果是git rebase –onto B3,B2, 结果是C2, C3会取代掉B2的上和B1上的C2,C3具有共同祖先之后的commit)。
注意:
Git rebase –onto B1~5 B1~4 B1~1 完成的是将B1~4 B1~1间的片段,接到B1~5上,所以要想将要切割的片段比较“纯净”的放到当前分支上,要保证B1~5也是当前分支的某一个commit的祖先。
如果切割的是某一个branch的最近一个commit到中间某一个commit,切割命令必须是这样Git rebase –onto B1~5 B1~4B1~0,而不是Git rebase –onto B1~5 B1~4B1,否则完成的是在本branch上切割,放到本branch上了。
10.添加project到远程服务器
新建目录,执行如下命令:
(1)git init创建git仓库;
(2)添加要添加的实际内容,git add ./来添加git库中;
(3)Git commit 提交;
(4)Git remote add aosp ssh://remote-ip/platform/vendor/qcom/proprietary 添加到远端,与远端project.git关联;
(5) git push aosp HEAD:branch-name 向远端project.git中添加新的branch branch-name。
其他:
1.git remote -v 显示本地project在远程服务器的位置
- git update-index –assume-unchanged file 将某一个file取消git跟踪(git –help)
git update-index –no-assume-unchanged file将某一个file重新添加进git跟踪
3.git format-patch -k xxx.patch,完整保留commit所有信息,包括commit message
git am -k xxx.pztch,完整应用该patch,–reject会将可以打上的都打上,有冲突的会记录在对应的.rej文件中