git命令&patch命令
查看修改或提交的状态
git status <-uno> ./
可以加 -uno 参数 不显示未跟踪的文件
git branch -a./
查看本地和远程所有分支
diff & patch
git diff ./a.txt > hh.patch
检查a文件的版本区别并输出到patch
diff ~/a/b c/d.txt > hh.patch
检查~a/b目录下的所有修改和d.txt的diff并输出到hh.patch
-u 以合并的方式显示文件内容的不同,显示有差异行的前后几行(上下文),默认是前后各3行,这样patch中带有更多的信息
-p 显示代码所在的c函数的信息
-r 递归地对比一个目录和它的所有子目录(即整个目录树).
-N 如果某个文件缺少了, 就当作是空文件来对比. 如果不使用本选项, 当diff发现旧代码或者新代码缺少文件时, 只简单的提示缺少文件. 如果使用本选项, 会将新添加的文件全新打印出来作为新增的部分.
如果有新添加的文件夹,diff只能检测文件夹,但不会显示文件的改动,可以通过git add添加到缓存区后,再git diff --cached > name.patch,之后如果不想要add 还可以使用git reset HEAD清除。
git diff dev
比较dev分支与当前分支的区别
cat diag.patch 查看patch文件
patch -p1 -R < diag.patch 还原到打这个补丁前
patch -p1 < diag.patch 补补丁
我的源码路径是1/2/3/4.c,现在在1/下生成patch,生成的补丁中, 包含了路径信息:
--- a/2/3/4.c
+++ b/2/3/4.c
其中a代表旧文件,b代表新文件,可以发现,如果我回到1/下patch,路径是不对的,因为1/目录下没有a/2/3/4.c这个路径,所以我用 -p1跳过一个/,即变成当前目录下寻找2/3/4.c。同理可以-p0、-p9。
--binray
当文件和patch分别为win和unix环境时,可以在vim 中 :set fileformat=unix/dos修改文件格式,或者shell中dos2unix/unxi2dos转换文件格式,然后再patch;或者在patch的时候加上--binary参数。
(因为Unix系统里,每行结尾只有"<换行>",即"\n";Windows系统里面,每行结尾是"<回车><换行>",即"\r\n";Mac系统里,每行结尾是"<回车>"。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。)
下载分支
git fetch origin yd_high_main_dev:yd_high_main_dev 从云端下载分支
git status 查看环境状态
git branch -v 查看本地和远程的分支
git fetch origin yd_high_main_dev:yd_dev 从云端下载分支yd_high_main_dev到本地的yd_dev(常用clone和pull)
git checkout yd_high_main_dev 指向本地分支
git pull 从云端同步分支
git branch --set-upstream-to=origin/xxx_high_main_dev xxx_high_main_devgit 链接到云端分支(可选)
git log 查看云端的提交 -n,显示最近n条提交;--author=='name',筛选作者
git add kernel/msm-3.18/drivers/char/xx/xx.c 添加 提交之前可以多次add
git add <-u> kernel/
//只add kernel目录下跟踪的文件
git add :^\*.sh ./
//add 当前目录下的所有跟踪或未跟踪文件,但是递归的排除所有.sh后缀文件,因为\是从shell展开,所以会递归查找*.sh,如果是git add :^*.sh ./
,那只会在当前目录下寻找.sh文件并排除
git checkout 还原的是已跟踪的工作区文件
git reset HEAD 还原的是已跟踪的暂存区文件,同时将已commit的回退到当前版本,加多个^选择回退版本
git rm --cached file 删除的是已或未跟踪的暂存区文件,不加--cached同时删除工作区
git clean -df 递归删除未跟踪的工作区文件
git commit (--amend)提交到本地,(叠加提交)
git cherry-pick [commit id] porting 代码
git rebase <基节点> <待变节点> 变基,可以将待变的分支剪切到主分支
git pull --rebase 在自己本地commit完想push时发现别人先合并了,又不想push上去再merge产生一条无用的合并记录,则rebase换最新的父节点
git status 查看add的代码
在.gitignore 中加入忽略的路径,不过只能忽略未加入track的文件,已经加入版本管理的:
git update-index --assume-unchanged /path/to/file
缺点就是每个新的仓库都必须手动设置一次。幸运的是,这样的设置每个仓库只要进行一次就够了
git push origin HEAD:refs/for/
git format-patch -1 把最近的commit打成补丁
git am ../0001-CR-T171023.patch
git push origin HEAD:refs/for/yd_high_main_dev
git stash:(进阶)
(1)git stash save "save message" : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
(2)git stash list :查看stash了哪些存储
(3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
(4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
(5)git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
(6)git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储
(8)git stash clear :删除所有缓存的stash
(9)git stash --keep-index :只会备份那些没有被add的文件
note:新增的文件,直接执行stash是不会被存储的,需要add之后。