git的使用方法

Git菜鸟教程

推荐一个登陆git网站的好用的工具 Steam++

听这个名字就知道,之前一直用这个软件去登陆steam商店,偶然发现还能加速GitHub,免费且流畅

git init            #在当前目录初始化 Git 仓库
git log         #查看提交历史 --oneline(简洁显示)、-p(显示差异)
git status      #查看工作区状态(修改/未跟踪的文件)
git add <file>      #将文件添加到暂存区  git add .(添加所有文件)
git add -A    #提交所有已经修改的文件,包括删除新建文件
git add -u    #提交git上已跟踪的文件,不包括删除和新建的文件
git checkout -- <file>  # 撤销指定文件的修改
git reset  #回退git add 操作
git reset HEAD^ #撤销最近一次提交并保留修改
git push origin +HEAD~1:master #撤销已经推送到远程仓库的提交
git pull        #拉取远程仓库并合并到当前分支 git pull origin main
git fetch       #仅拉取远程仓库更新,不自动合并    git fetch --all
git reset       #回退提交   --soft(保留修改)、--hard(丢弃修改)
git diff        #查看工作区与暂存区的差异   git diff HEAD(比较最新提交)
git commit      #提交暂存区的修改   -m "message"(添加提交信息)
git revert <commit> #撤销指定提交(生成新提交)  git revert HEAD(撤销最新提交)
git rm <file>  删除本地和远程的文件
git rm --cached  <file> 删除远程的文件,保留本地
git remote -v    #查看git版本
git check <分支名>  #切换分支名
git branch  #查看当前分支
git init(如果要上传本地仓库)
# git clone https:...   或者克隆git上的代码
# git checkout -b new-feature  为了避免直接在 main 或 master 分支上进行开发,通常会创建一个新的分支
git status         #可以看工作区状态,看看有哪些文件有修改的
git add <file>         #添加到暂存区
git commit -m ""       #提交更改
#git pull origin master 每次git push之前可以拉取远端更新并且合并到本地,以避免冲突
#git fetch origin 也可以拉去最新的远端代码
#git reset origin/kylinos-next --hard 强制本地代码和远程保持一致
git push origin master #推送到远程仓库

以上都是git的最基础的用法,但是作为内核开发的我们,仅仅学会这些还远远不够,因为内核代码是有很多个版本迭代的,所以对代码的版本管理非常重要,现在需要更深入的了解git的用法:

分支管理是一个好东西,各个内核版本都可以延伸一个分支出来,分支更有利于团队协作,你修改分支代码并不会影响主线上的代码。

git branch          # 查看本地分支
git checkout <branch-name>  #切换分支
git branch <branch-name>        # 创建新分支
git branch -d <branch-name>     # 删除本地分支
git push origin --delete <branch-name>  # 删除远程分支
git branch -m <old-name> <new-name>  # 重命名本地分支
git merge <branch-name>  #合并分支到当前主分支,首先要执行git checkout切换到主分支
git log                 # 查看完整提交历史
git log -p <file>        # 查看某个文件的修改历史
git show <commit-id>    # 查看某次提交的详细信息
git log --grep="keyword"  # 根据提交信息搜索提交
git log -S "keyword"      # 根据代码内容搜索提交
git log --follow --diff-filter=R --name-status -1 -- d  # 查看d文件的最近一次重命名提交

tag顾名思义就是给东西贴上标签,有了标签我们就可以更好的检索信息了,方便你追溯某个版本的代码。

git tag v1.0.0           # 在本地仓库创建名为 v1.0.0 的轻量标签,标签指向当前所在的提交,标签信息存储在 .git/refs/tags/v1.0.0 文件中,标签不包含额外元数据。
git tag -a v1.0.0 -m "Release version 1.0.0"  # 在本地创建附注标签 v1.0.0,创建独立的标签对象(存储在 .git/objects)创建独立的标签对象(存储在 .git/objects)。

git push origin v1.0.0   # 推送指定标签
git push origin --tags   # 推送所有标签

git tag -d v1.0.0        # 删除本地标签
git push origin --delete v1.0.0  # 删除远程标签

在 Git 中,标签(tag)是针对整个提交(commit)的,而不是针对单个文件的。这意味着你不能直接给单个文件打标签。

这篇主要介绍git业务方面的常用的方法:

#拿smb2_parse_contexts这个函数举例子
cd  主线分支
git blame fs/smb/client/smb2pdu.c | grep smb2_parse_contexts  #会弹出commit-id 找到定义函数的commit-id
git show  <commit-id>                #查看这个commit是否是第一次提交
git log --oneline  <commit-id>       #如果不是第一次提交,查看这个commit-id的前一个提交
git checkout <commit-id>             #回退到之前版本
#然后再重复第二个步骤

这里重点讲一下git blame的用法:

git blame 是 Git 中用于查看文件每一行的修改历史记录的命令。它的作用是追踪文件中每一行的最后一次修改是谁做的,修改的时间是何时,修改的提交信息是什么。

#比如想查看某一个文件的改动记录,可以用
git blame <file> xxx.c   #会输出每一行代码的作者、提交哈希和提交时间,格式如下:
^1da177e4c3f4 (Linus Torvalds          2005-04-16 15:20:36 -0700     1) /*
#git blame 有一些常用的参数
-L <start>,<end> :仅查看文件的某个行范围。
    git blame -L 10,20 xxx.c #查看xxx.c文件的第 10 行到第 20 行的代码历史
-C:查找代码移动或复制的历史。此选项会查找哪些行可能是从其他地方复制或移动过来的
    git blame -C xxx.c
-f:在输出中包括文件路径,默认情况下,git blame 只会显示文件内容,不包含文件名
    git blame -f xxx.c
-s:只显示提交的哈希,不显示其他信息。
    git blame -s xxx.c #只会输出相关的哈希值。

cd kylinx-4.19 #进入4.19分支
git branch    #查看是否是 kylinos-next分支
git checkout kylinos-next  # 如果不在目标分支,切换到 kylinos-next
git fetch origin # 从远程拉取代码到本地
git reset origin/kylinos-next --hard # 强制本地代码和远程保持一致
git show  <commit-id>  #从工单信息获取需要修复的CVE列表 <commit-id> 是上游修复补丁
git show --stat <commit-id>    #可以查看某个文件修改的统计
git log  --grep="<修改信息>"  #查看是否补丁已经合入?

git remote -v  #如果需要合入补丁,就查看上游
git log --all --grep="CVE-XXXX-XXXXX" #根据CVE查看上游是否已经生成了补丁,是,则从上游或在openeular生成补丁
git format-patch -1 <commit-id>  #根据上游和openeular生成补丁

git log -1 <hash> --format="%P"  #查询父提交
git log --graph --oneline <commit-id>~5..<commit-id>   # 查看该 commit 是否依赖其他补丁
git am 001-xxx.patch --reject #合入补丁并且生成冲突文件.rej
git status -s #查看合入补丁的状态
git add -u   #合并已经解决的文件
vim <冲突文件.rej>  #打开冲突文件.rej
:vsp <冲突文件>      #vim两个窗口打开文件对比分析
#解决冲突后再次合并
git add <已解决的文件>
git am --continue  # 完成补丁应用

#合并完成后,编译测试
rm x86_64-build -rf && mkdir x86_64-build
cp arch/x86/configs/kylinos_generic_defconfig x86_64-build/.config
make O=x86_64-build menuconfig # 比如编译nfs模块,搜索 nfs_fs
time make O=x86_64-build bzImage -j`nproc`

#提交更改
git commit --amend  # 添加测试记录
git push origin cve-2024-xxxx-fix