git 使用部分总结

常用技法:

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上

  1. Git rebase –onto B1~5 B1~4 B1~1 此命令首先会切换到最后的参数上,如果最后的参数不是一个branch而是某一个commit的时候,此时会处在no branch上,这个时候需要创建一个branch(B3),这个B3 branch上就有截取的C2,C3 ;

  2. git checkout B2;

  3. 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)。

注意:

  1. Git rebase –onto B1~5 B1~4 B1~1 完成的是将B1~4 B1~1间的片段,接到B1~5上,所以要想将要切割的片段比较“纯净”的放到当前分支上,要保证B1~5也是当前分支的某一个commit的祖先。

  2. 如果切割的是某一个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在远程服务器的位置

  1. 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文件中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值