- 论坛徽章:
- 3
|
本帖最后由 compare2000 于 2014-07-30 16:59 编辑
常用Git,Repo命令
Repo
repo init -u ssh://android.huawei.com/platform/manifest.git -b hw/platform/jellybean/K3V200_D2_4.1.1_r1/U9701L --no-repo-verify --repo-branch=stable
repo forall -c "git xxxx" //对所有的git仓执行git命令
repo upload //提交commit
repo upload . //提交当前git仓的commit
repo --trace upload //提交并打印出过程
repo sync //同步代码,拉代码
repo sync "git仓名" //单同步某个git仓,或单拉某个仓
repo sync . //单同步当前的git仓
Git使用指南
Refer to How to version projects with Git
1.创建目录
$ git config --global user.name "Your Name Comes Here"
$ git config --global user.email you@yourdomain.example.com
$ git config --list 查看相关信息
$ git init
如果作为 Server 存在,那么可以忽略工作目录,以纯代码仓库形式存在。
$ git --bare init
可以在~/.gitconfig设置别名
[alias]
st = status
ci = commit -a
co = checkout
2.文件操作
$ git add .
$ git add file1 file2 file3
$ git add -u
$ git add -p // 为你做的每次修改,Git将为你展示变动的代码,并询问该变动是否应是下一次提交的一部分。回答“y”或者“n”。也有其他选项,比如延迟决定:键入“?”来学习更多。
$ git rm file1 file2 file3
$ git mv file1 file2
3.提交更改
$ git commit -a -m ' '
$ git commit --amend -a -m ' ' // 修改上一次的信息,不作为新的提交
$ git stash // 保存当前草稿,便于切换分支
$ git stash pop // 恢复草稿
$ git stash apply
$ git stash list
$ git stash apply stash@{1}
$ git stash clear
4.撤销更改
$ git reset HEAD file1 // 取消暂存区的文件快照(即恢复成最后一个提交版本),这不会影响工作目录的文件修改。
$ git reset --hard HEAD^ // 将整个项目回溯到以前的某个版本,可以使用 "git reset"。可以选择的参数包括默认的 "--mixed" 和 "--hard",前者不会取消工作目录的修改,而后者则放弃全部的修改。该操作会丢失其后的日志
$ git checkout -- file1 // 使用暂存区快照恢复工作目录文件,工作目录的文件修改被抛弃。
$ git checkout HEAD^ file1 // 直接 "签出" 代码仓库中的某个文件版本到工作目录,该操作同时会取消暂存区快照。
$ git checkout "@{10 minutes ago}" // 直接 "签出" 10分钟之前代码仓库中的某个文件版本到工作目录,该操作同时会取消暂存区快照。
$ git checkout "@{5}" // 直接 "签出" 倒数第五次保存的某个文件版本到工作目录,该操作同时会取消暂存区快照。
$ git revert SHA1_HASH // 还原特定哈希值对应的提交。该还原记录作为一个新的提交。
5.查看历史纪录或者当前状态
$ git log
$ git log -p
$ git log -U 显示commit的详细信息
$ git log --stat --summary
$ git log V3..V7 //显示V3之后直至V7的所有历史记录
$ git log V3.. //显示所有V3之后的历史记录。注意<since>..<until>中任何一个被省略都将被默认设置为HEAD。所以如果使用..<until>的话,git log在大部分情况下会输出空的。
$ git log –since=”2 weeks ago” //显示2周前到现在的所有历史记录。具体语法可查询git-ref-parse命令的帮助文件。
$ git log stable..experimental //将显示在experimental分支但不在stable分支的历史记录
$ git log experimental..stable //将显示在stable分支但不在experimental分支的历史记录
$ git log -S'你要找的内容',就可以从全部的历史纪录,瞬間找到你要找的东西
$ git blame FILE // 标注出一个指定的文件里每一行内容的最后修改者,和最后修改时间。
$ git diff // 这个命令只在git add之前使用有效。如果已经add了,那么此命令输出为空
$ git diff –cached // 这个命令在git add之后在git commit之前有效。
$ git diff "@{yesterday}" // 比较当前和昨天的内容
$ git status // 这个命令在git commit之前有效,表示都有哪些文件发生了改动
$ git show 5b888 // 使用git show再加上述的commit名称来显式更详细的commit信息
$ git show master // 显示分支信息
$ git show HEAD // 使用HEAD字段可以代表当前分支的头(也就是最近一次commit)
$ git show HEAD^ //查看HEAD的父母的信息, 可以使用^表示parent
$ git show HEAD^^ //查看HEAD的父母的父母的信息
$ git show HEAD~4 //查看HEAD上溯4代的信息
$ git tag V3 5b888 //以后可以用V3来代替复杂的名称(5b888…)
$ git show V3
$ git branch stable V3 //建立一个基于V3的分支
$ git grep “print” V3 //在V3中搜索所有的包含print的行
$ git grep “print” //在所有的历史记录中搜索包含print的行
6.协作操作
$ git clone git://server/path/to/files // Git deamon
$ git clone your.computer:/path/to/script or git clone ssh://car.colorado.edu/home/xxx ./xxxxx // SSH
// SSH
$ git pull
$ git push // 在将代码提交(push)到服务器之前,首先要确认相关更新已经合并(merge)到主分支(master)。还应该先从服务器刷新(pull)最新代码,以确保自己的提交不会和别人最新提交的代码冲突。
如果想在merge前先查看更改:
$ git fetch /home/bob/myrepo master:bobworks //此命令意思是提取出bob修改的代码内容,然后放到我(rocrocket)工作目录下的bobworks分支中。之所以要放到分支中,而不是master中,就是要我先仔仔细细看看bob的开发成果,如果我觉得满意,我再merge到master中,如果不满意,我完全可以直接git branch -D掉。
$ git whatchanged -p master..bobworks //用来查看bob都做了什么
$ git checkout master //切换到master分区
$ git pull . bobworks //如果我检查了bob的工作后很满意,就可以用pull来将bobworks分支合并到我的项目中了
7.分支管理
$ git branch: 查看当前分支
$ git checkout -b/branch experimental: 创建新分支
$ git checkout experimental: 切换到另一分支
$ git merge experimental:合并分支
$ git branch -d experimental:删除分支, 使用的是小写的-d,表示“在分支已经合并到主干后删除分支”。
$ git branch -D experimental:删除分支, 表示“不论如何都删除分支”,-D使用在“分支被证明失败”
8.补丁工作
git format-patch:当你想给一个开源项目(例如Rails)提交一段代码的时候,或者你想给小组成员展示一段你并不想提交的代码,那么你还是需要 patch的,Git的'format-patch'命令良好的支持了这个功能。
第一,利用branch命令 创建一个分支;
第二,修改你的代码;
第三,在该分支上提交你的修改;
第四,使用'git format-patch'命令来生成一个patch文件,例如:'git format-patch master --stdout > ~/Desktop/tmp.patch'就是将工作分支与master主干的不同,存放在'~/Desktop'文件夹下,生成一个叫做 tmp.patch的文件(另一种简单的版本是利用diff命令,例如'git diff ..master > ~/Desktop/tmp.patch'),这样就生成了patch文件。那么别人就可以使用'git apply'命令来应用patch,例如'git apply ~/Desktop/tmp.patch'就是将patch打在当前的工作分支上
9.仓库维护
$ git fsck: 不加–full参数的情况下,这个命令一般会以非常低廉的代价确保仓库在一个不错的健康状态之中。
$ git count-objects: 统计有多少松散的对象,没有 repack 的对象消耗了多少硬盘空间。
$ git gc: 在本地仓库进行 repack,并进行其他日常维护工作。
$ git filter-branch --tree-filter `rm top/secret/file` HEAD //在所有记录中永久删除某个文件
$ git rebase -i HEAD~10 // 后10个提交会出现在你喜爱的$EDITOR。通过删除行来移去提交。通过为行重新排序来为提交重新排序。用“edit”来替换“pick”来标志一个提交可修改。用“squash”来替换“pick”来将一个提交和前一个合并。
10.错误查询
刚刚发现程序里有一个功能出错了,即使你过去经常提交变更,Git还是可以精确的找出问题所在:
$ git bisect start
$ git bisect bad SHA1_OF_BAD_VERSION
$ git bisect good SHA1_OF_GOOD_VERSION
Git从历史记录中检出一个中间的状态,在这个状态上测试功能,如果还是错误的:
$ git bisect bad
如果可以工作了,则把"bad"替换成"good"。 Git会再次帮你找到一个以确定的好版本和坏版本之间的状态,经过一系列的迭代,这种二进制查询会帮你找到导致这个错误的那次提交。一旦完成了问题定位的调查,你可以返回到原始状态,键入:
$ git bisect reset
不需要手工测试每一次改动,执行如下命令可以自动的完成上面的搜索:
$ git bisect run COMMAND
Git使用指定命令(通常是一个一次性的脚本)的返回值来决定一次改动是否是正确的:命令退出时的代码0代表改动是正确的,125代表要跳过对这次改动的检查,1到127之间的其他数值代表改动是错误的。返回负数将会中断整个bisect的检查。
另外推荐git资料:http://gitbook.liuhui998.com/book.pdf
shell中可能经常能看到:>/dev/null 2>&1
分解这个组合:“>/dev/null 2>&1” 为五部分。
1:> 代表重定向到哪里,例如:echo "123" > /home/123.txt
2:/dev/null 代表空设备文件
3:2> 表示stderr标准错误
4:&1, shell 语法,无论文件描述符1在什么地方
5:1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于 "1>/dev/null"
因此,>/dev/null 2>&1也可以写成“1> /dev/null 2> &1”
那么本文标题的语句执行过程为:
1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 :接着,标准错误输出重定向 到 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
说清楚了吗,大家理解下吧!
顺便对比述说下这么用的好处!
最常用的方式有:
command > file 2>file 与command > file 2>&1
它们 有什么不同的地方吗?
首先command > file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command > file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道。
而command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。
从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会command > file 2>&1 这样的写法。
思考题:
$ cmd 2>&1 1>/dev/null
结果是怎么样?
---------------------------------
答案:后一种只输出了STDERR到STDOUT,STDOUT的被输入到了/dev/null,这样就只有STDERR显示出来了。
原因是shell处理重定向是从左到右,所以先处理2>&1,处理完了之后,再处理1>/dev/null
grep 查找特定文件的内容 grep -R --include="*.cpp" key dir
上述命令的含义:
在dir目录下递归查找所有.cpp文件中的关键字key
Git stash --- Git 暂存 Git stash应用场景:
在当前branch上开发到任意时刻,有一个突发的问题需要解决,但当前的开发还不能提交,这时,可以先用stash将当前的开发暂存起来,然后回到当前的HEAD,进行突发任务的开发,将当前突发任务开发提交之后,在将暂存的工作拿出来,接着开发。
步骤:
1,$git stash//暂存当前开发,这时候,查看文件状态,是干净的
2,开发
3,提交开发
4,取出暂存
$git stash pop
//可能会有conflict,需要resolve
如何识别linux 版本号 动态方式:
#include <linux/utsname.h>
utsname();
静态方式:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,12)
#include <linux/of_gpio.h>
#endif
通过sysrq查看进程和内核运行状态 技巧和方法名称 通过sysrq查看进程和内核运行状态
适用问题的范围 适用于冻屏,内核死锁等问题的定位,解决过的问题:
等级 高级
内容描述
如果系统出现挂起情况或者在诊断一些和内核相关,比较怪异,需要现场定位问题的时候,使用sysrq键是一个比较好的方式。
1. 如何打开和关闭SysRq组合键?
打开这个功能,运行:
adb shell
# echo 1 >> /proc/sys/kernel/sysrq
关闭这个功能:
# echo 0 >> /proc/sys/kernel/sysrq
2. 如何触发一个sysrq事件?
首先手机需要有root权限:
# echo 'w' >> /proc/sysrq-trigger
当我触发一个sysrq事件的时候,结果保存在什么地方?
通过adb shell cat /proc/kmsg > kmsg.txt
在Log中查找关键字sysrq可以看到相关内核信息:
sysrq功能被打开后,有几种sysrq事件可以被触发。不同的内核版本可能会有些不同。但有一些是共用的:
* m - 导出关于内存分配的信息
* w - 导出阻塞线程状态信息(可以定位一些内核驱动或线程死锁等问题)
* p - 到处当前CPU寄存器信息和标志位的信息
* c - 故意让系统崩溃(在使用netdump或者diskdump的时候有用)
* s - 立即同步所有挂载的文件系统
* u - 立即重新挂载所有的文件系统为只读
* b - 立即重新启动系统
* o - 立即关机(如果机器配置并支持此项功能)
详细请参看:
sysrq.txt文件,可以在工程搜索这个文件获取。
扩展及其注意事项
echo 'w' >> /proc/sysrq-trigger 输出结果
<6>[1217, sh] [ 152.193682] SysRq : Show Blocked State
<6>[1217, sh] [ 152.197344] task PC stack pid father
<6>[1217, sh] [ 152.203509] kworker/u:0 D c0778648 6400 5 2 0x00000000
<4>[1217, sh] [ 152.210804] [<c0778648>] (__schedule+0x514/0x5f from [<c003be94>] (rr_read+0xa8/0x12
<4>[1217, sh] [ 152.219838] [<c003be94>] (rr_read+0xa8/0x12 from [<c003ca28>] (do_read_data+0x18/0xb54)
<4>[1217, sh] [ 152.228963] [<c003ca28>] (do_read_data+0x18/0xb54) from [<c0091b5c>] (process_one_work+0x27c/0x484)
<4>[1217, sh] [ 152.238913] [<c0091b5c>] (process_one_work+0x27c/0x484) from [<c0091f74>] (worker_thread+0x210/0x3b0)
<4>[1217, sh] [ 152.249076] [<c0091f74>] (worker_thread+0x210/0x3b0) from [<c0095e10>] (kthread+0x80/0x8c)
<4>[1217, sh] [ 152.258293] [<c0095e10>] (kthread+0x80/0x8c) from [<c000f028>] (kernel_thread_exit+0x0/0x
<6>[1217, sh] [ 152.267572] kworker/u:1 D c0778648 5320 45 2 0x00000000
<4>[1217, sh] [ 152.274866] [<c0778648>] (__schedule+0x514/0x5f from [<c003be94>] (rr_read+0xa8/0x12
<4>[1217, sh] [ 152.283900] [<c003be94>] (rr_read+0xa8/0x12 from [<c003ca28>] (do_read_data+0x18/0xb54)
<4>[1217, sh] [ 152.292995] [<c003ca28>] (do_read_data+0x18/0xb54) from [<c0091b5c>] (process_one_work+0x27c/0x484)
<4>[1217, sh] [ 152.302975] [<c0091b5c>] (process_one_work+0x27c/0x484) from [<c0091f74>] (worker_thread+0x210/0x3b0)
<4>[1217, sh] [ 152.313139] [<c0091f74>] (worker_thread+0x210/0x3b0) from [<c0095e10>] (kthread+0x80/0x8c)
<4>[1217, sh] [ 152.322356] [<c0095e10>] (kthread+0x80/0x8c) from [<c000f028>] (kernel_thread_exit+0x0/0x
<6>[1217, sh] [ 152.331664] SurfaceFlinger D c0778648 5712 538 1 0x00000000
<4>[1217, sh] [ 152.338928] [<c0778648>] (__schedule+0x514/0x5f from [<c07765fc>] (schedule_timeout+0x28/0x344)
<4>[1217, sh] [ 152.348725] [<c07765fc>] (schedule_timeout+0x28/0x344) from [<c0778d24>] (wait_for_common+0xf0/0x16
<4>[1217, sh] [ 152.358889] [<c0778d24>] (wait_for_common+0xf0/0x168) from [<c02ea7a8>] (mipi_dsi_cmd_dma_tx+0x22c/0x2ac)
<4>[1217, sh] [ 152.369388] [<c02ea7a8>] (mipi_dsi_cmd_dma_tx+0x22c/0x2ac) from [<c02ea910>] (mipi_dsi_cmds_tx+0xe8/0x188)
<4>[1217, sh] [ 152.379978] [<c02ea910>] (mipi_dsi_cmds_tx+0xe8/0x188) from [<c02eba38>] (mipi_lcd_register_write+0xec/0x174)
<4>[1217, sh] [ 152.390843] [<c02eba38>] (mipi_lcd_register_write+0xec/0x174) from [<c02ebaf8>] (process_mipi_table+0x38/0x7c)
<4>[1217, sh] [ 152.401770] [<c02ebaf8>] (process_mipi_table+0x38/0x7c) from [<c02ed9ac>] (mipi_hx8369a_lcd_on+0xa0/0xec)
<4>[1217, sh] [ 152.412269] [<c02ed9ac>] (mipi_hx8369a_lcd_on+0xa0/0xec) from [<c02eca54>] (panel_next_on+0x3c/0x48)
<4>[1217, sh] [ 152.422340] [<c02eca54>] (panel_next_on+0x3c/0x48) from [<c02e8bf4>] (mipi_dsi_on+0x660/0x800)
<4>[1217, sh] [ 152.431893] [<c02e8bf4>] (mipi_dsi_on+0x660/0x800) from [<c02eca54>] (panel_next_on+0x3c/0x48)
<4>[1217, sh] [ 152.441446] [<c02eca54>] (panel_next_on+0x3c/0x48) from [<c02cd0cc>] (mdp_on+0x118/0x164)
<4>[1217, sh] [ 152.450541] [<c02cd0cc>] (mdp_on+0x118/0x164) from [<c02c71e4>] (msm_fb_blank_sub+0x74/0xd8)
<4>[1217, sh] [ 152.459911] [<c02c71e4>] (msm_fb_blank_sub+0x74/0xd8) from [<c02c7cf8>] (msm_fb_open+0xb8/0xfc)
<4>[1217, sh] [ 152.469555] [<c02c7cf8>] (msm_fb_open+0xb8/0xfc) from [<c02c1550>] (fb_open+0xa8/0xe8)
<4>[1217, sh] [ 152.478406] [<c02c1550>] (fb_open+0xa8/0xe8) from [<c012ce94>] (chrdev_open+0x10c/0x134)
<4>[1217, sh] [ 152.487440] [<c012ce94>] (chrdev_open+0x10c/0x134) from [<c0127ab8>] (__dentry_open.isra.12+0x190/0x29c)
<4>[1217, sh] [ 152.497848] [<c0127ab8>] (__dentry_open.isra.12+0x190/0x29c) from [<c013599c>] (do_last.isra.29+0x690/0x6c0)
<4>[1217, sh] [ 152.508621] [<c013599c>] (do_last.isra.29+0x690/0x6c0) from [<c0135b94>] (path_openat+0xb8/0x35c)
<4>[1217, sh] [ 152.518419] [<c0135b94>] (path_openat+0xb8/0x35c) from [<c0135f18>] (do_filp_open+0x2c/0x78)
<4>[1217, sh] [ 152.527819] [<c0135f18>] (do_filp_open+0x2c/0x78) from [<c01287dc>] (do_sys_open+0xd8/0x170)
<4>[1217, sh] [ 152.537189] [<c01287dc>] (do_sys_open+0xd8/0x170) from [<c000dec0>] (ret_fast_syscall+0x0/0x30)
echo 'm' >> /proc/sysrq-trigger 输出结果
<6>[1443, sh] [ 34.173752] SysRq : Show Memory
<4>[1443, sh] [ 34.176804] Mem-info:
<4>[1443, sh] [ 34.180039] Normal per-cpu:
<4>[1443, sh] [ 34.183763] CPU 0: hi: 186, btch: 31 usd: 74
<4>[1443, sh] [ 34.189500] HighMem per-cpu:
<4>[1443, sh] [ 34.193316] CPU 0: hi: 42, btch: 7 usd: 35
<4>[1443, sh] [ 34.199053] active_anon:30965 inactive_anon:58 isolated_anon:0
<4>[1443, sh] [ 34.199053] active_file:2311 inactive_file:39075 isolated_file:0
<4>[1443, sh] [ 34.199053] unevictable:0 dirty:9 writeback:0 unstable:0
<4>[1443, sh] [ 34.199053] free:108103 slab_reclaimable:1861 slab_unreclaimable:2643
<4>[1443, sh] [ 34.199053] mapped:19383 shmem:67 pagetables:1890 bounce:0
<4>[1443, sh] [ 34.233175] Normal free:432136kB min:3364kB low:4204kB high:5044kB active_anon:97972kB inactive_anon:192kB active_file:6416kB inactive_file:59080kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:708932kB mlocked:0kB dirty:36kB writeback:0kB mapped:43264kB shmem:192kB slab_reclaimable:7444kB slab_unreclaimable:10572kB kernel_stack:5064kB pagetables:7560kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no
<4>[1443, sh] [ 34.273676] lowmem_reserve[]: 0 1013 1013
<4>[1443, sh] [ 34.278650] HighMem free:276kB min:128kB low:280kB high:432kB active_anon:25888kB inactive_anon:40kB active_file:2828kB inactive_file:97220kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:129740kB mlocked:0kB dirty:0kB writeback:0kB mapped:34268kB shmem:76kB slab_reclaimable:0kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no
<4>[1443, sh] [ 34.317350] lowmem_reserve[]: 0 0 0
<4>[1443, sh] [ 34.321776] Normal: 6*4kB 10*8kB 3*16kB 2*32kB 3*64kB 1*128kB 0*256kB 3*512kB 2*1024kB 1*2048kB 104*4096kB = 432152kB
<4>[1443, sh] [ 34.333312] HighMem: 5*4kB 0*8kB 0*16kB 0*32kB 0*64kB 0*128kB 1*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 276kB
<4>[1443, sh] [ 34.344422] 41449 total pagecache pages
<4>[1443, sh] [ 34.349214] 0 pages in swap cache
<4>[1443, sh] [ 34.353456] Swap cache stats: add 0, delete 0, find 0/0
<4>[1443, sh] [ 34.359621] Free swap = 0kB
<4>[1443, sh] [ 34.363436] Total swap = 0kB
<4>[1443, sh] [ 34.383946] 232448 pages of RAM
<4>[1443, sh] [ 34.386998] 129615 free pages
<4>[1443, sh] [ 34.390904] 12655 reserved pages
<4>[1443, sh] [ 34.395086] 3020 slab pages
<4>[1443, sh] [ 34.398809] 195010 pages shared
<4>[1443, sh] [ 34.402899] 0 pages swap cached
|
|