目录
注意:文中类似< n >这种符号,使用命令时忽略<>
1 git diff
查找待提交代码被修改了哪里
$ git diff #查找所有待提交文件的修改处
$ git diff <文件路径>/<文件名> #查找具体<文件名>文件被修改了哪里
$ git diff --stat #查看文件被修改的行数,如下
$ git diff --numstat #查看文件被修改的行数,只显示行数
di.di@ubuntu:~/source_code/bsp/kernel/kernel4.14$ git diff --stat
arch/arm64/boot/dts/sprd/ums9620-mach.dtsi | 3 ++-
drivers/thermal/power_allocator.c | 21 +++++++++++++++++++--
drivers/thermal/thermal_sysfs.c | 2 ++
include/linux/thermal.h | 1 +
4 files changed, 24 insertions(+), 3 deletions(-)
2 修改commit的编辑器为vim的方法
方法一
在 ~/.gitconfig中修改如下:添加下面两行
$[core]
$ editor = vim
方法二
用如下命令:
$ git config editor vim
3 git reflog
查看所有分支最近n次操作记录
$ git reflog -<n>
$ git reflog #可以查看所有分支的所有操作记录
4 git log
查看最近几次commit的第一行
$ git log -6 --pretty=oneline #查看最近6次提交的第一行
$ git log --auther=didi #查看作者为didi的所有提交
$ git log -p -<n> #查看最近n次提交以及提交的与原版本的不同之处,相当于git log -1和git diff的结合
5 git reset
reset到某一笔提交,两种方法:
一、hard
$ git reset --hard <commitID> #reset到指定提交,此时待提交会被彻底清除,恢复到commitID那笔提交的状态
$ git reset --hard HEAD~<n> #reset到前n次提交
$ hit reset --hard^ #reset到上一次提交
二、soft
$ git reset --soft HEAD^ #reset到上一次提交
$ git reset --soft <commitID> #reset到指定提交,此时待提交仍然保留,如果还要提交,直接commit即可
6 git checkout – <文件名>
就是让这个文件回到最近一次git commit或git add时的状态
$ git checkout -- <filename>
详细请参考下面两个链接:
《Git 基础再学习之:git checkout – file》这篇文章给出了三种使用情景。
廖雪峰老师的git教程中,对git chekout – 做了详细介绍。
7 git blame
追踪提交记录:查找某个文件的某行代码是谁提交的
下面查找文件test.c的第671行是谁提交的
$ git blame -L 671 drivers/msic/test/test.c
查看某个文件是谁提交的
$ git blame drivers/msic/test/test.c
8 git branch
$ git branch #查看当前代码分支
$ git branch -a #查看所有分支
9 git format-patch
在我们git push代码到主线分支后,想要保存这一笔提交(包括修改的内容、修改的位置、commit message等信息),就可以用git format-patch命令生成patch文件。之后,在代码移植时可以直接打上该patch,也可以提供他人参考使用,这样效率会比较高,避免手动修改带来的错误。
下面是git format-patch的简单用法:
git format-patch 将commit ID对应的提交打包(包含这个commit ID的所有关联提交),比如:
di.di@ubuntu:~/source_code/r_trunk/bsp/kernel/kernel4.14$ git format-patch e5fxxxxxxxxxxxxxxxxxxxxxxxxx353
0001-Bug-1234567-arm64-dts-add-integrals_clear-property.patch
0002-Bug-1234567-thermal-add-a-new-variable-clear_integra.patch
我们看到生成了两笔patch。
<patch编号>-Bug-<bug号>-<commit message关键信息>.patch
生成的patch类型的文件最好用vim打开,可以看到修改的内容、修改的位置、commit message等信息,其实显示的信息就是git diff显示的内容+commit message。
如果只想要只打包commit id对应的最近1笔提交,加-1。n笔就是-n。比如:
di.di@ubuntu:~/source_code/r_trunk/bsp/kernel/kernel4.14$ git format-patch -1 e5fxxxxxxxxxxxxxxxxxxxxxxxxx353
0001-Bug-1234567-arm64-dts-add-integrals_clear-property.patch
di.di@ubuntu:~/source_code/sprdroidr_trunk_u01/bsp/kernel/kernel4.14$ ls
0001-Bug-1234567-thermal-add-a-new-variable-clear_integra.patch build.config.goldfish.arm kunitconfig
COPYING build.config.goldfish.arm64 lib
CREDITS build.config.goldfish.mips mm
如果想要删除patch,rm 0001-Bug-1618112-arm64-dts-add-integrals_clear-property.patch即可。
注意!!在生成patch之间最好用git log确认commit ID是你想要的那一个
更多git format-patch的用法请参考:参考链接
10 git diff进阶
用git diff生成patch
di.di@ubuntu:~/source_code/android/bsp/kernel/kernel5.4$ git diff > 文件名.patch
di.di@ubuntu:~/source_code/android/bsp/kernel/kernel5.4$ git diff > 文件名.diff
关于git format-patch和git diff的使用建议:
推荐使用git format-patch,因为它可以保存更多信息,更包括commit message和owner信息,git diff在代码未commit的情况下用来简单地保存修改还是很方便的。
git format-patch和git diff的区别请参考:参考链接1 参考链接2
11 git checkout
假如最近一次提交commit ID aaaaaaa(已经push过的)。当更新了本地代码后,查看git log就会发现最近的一笔提交记录commit ID已经不是aaaaaaa,而是ccccccc,这也就意味着分支已经被切换。此时想在aaaaaaa的基础上继续提交,用git checkout就可以轻松解决。
di.di@ubuntu:~/source_code/android/bsp/kernel/kernel5.4$ git checkout <想要切换到的commit ID>
随后再有提交就可以 --amend 继续提交了。
12 git pull
git clone到本地的代码,可以通过git pull直接将代码更新到最新,前提是需要reset到origin分支
13 git am冲突解决
git am <commit id>
因为有冲突提交失败了应该怎么办?步骤如下:(跟cherry-pick时解冲突的思路一致)
(1)git am <commit id>
提示提交失败
(2)git am --abort
(3)git am --reject <commit id>
(4)在patch相关文件的路径下,与该文件紧挨着会生成一个.rej文件。比如修改的文件是test.c,那么生成的reject文件是test.c.rej
(5)解冲突。打开test.c.rej文件,根据文件中指示,在test.c中修改冲突的地方,保存
(6)删除test.c.rej
(7)git diff
检查下冲突的地方是否保存成功,没成功重新解冲突;保存成功继续往下
(8)git add test.c
(9)git am --continue
(10)git commit --amend
,sign off把自己加上,表明不管作者是谁这笔patch是你打的
(11)git push https://android.googlesource.com/kernel/common HEAD:refs/for/android13-5.15