1. 参考资料 & 工具书
《熟悉 GitHub/Git(建设中) - OpenMMLab 贡献者成长体系教程》
2. Git工作流
——Git工作流示意图来自《Git工作流和核心原理 | GitHub基本操作 | VS Code里使用Git和关联GitHub》
——Git命令数据流详细示意图
3. Ubuntu更新git
可以参考博文《Ubuntu下git版本升级》by -CapricornusW;
更新git的bash命令
sudo apt update # 更新源
sudo apt install software-properties-common # 安装 PPA 需要的依赖
sudo add-apt-repository ppa:git-core/ppa # 向 PPA 中添加 git 的软件源
sudo apt-get update
sudo apt-get install git
4. 南溪常用的git命令
4.1 10个常用的git命令
git init
:在当前目录中初始化一个新的 Git 仓库。git clone <repo>
:克隆一个仓库到新的目录。
4.2 基本工作流
4.2.1 以本地代码建立仓库
(1)以当前文件夹建立本地repo
git init
(2)添加所有文件到暂存区
git add .
(3)进行首次提交
git commit -m "Initial commit"
查看当前所在分支:
git branch --show-current
从远程仓库中同步代码
git pull
查看当前所在分支:
git branch --show-current
提交当前repo目前下的所有文件和文件夹(不包括空文件夹)
git add .
提交指定文件
git add <file1> <file2> ... # 使用空格分隔多个文件。
Commit暂存区中的修改并添加注释
git commit -m "message_for_new_commit"
"message"
:注释使用"
双引号包括,(用单引号容易出错)
Note
使用git commit -m
的优点是,不用进入editor(默认是vim)输入信息,会方便一些。
列出存储库中的所有文件,包括仅暂存但尚未提交的文件
git ls-files
将工作区文件提交到远程主分支(main分支)
git push origin main
从远程仓库中获取更新
git fetch
比较本地版本库与远程仓库的区别
git diff origin/main
4.2.2 拉取远程仓库更新
(1)拉取远程仓库的最新更改
git fetch origin
(2)查看当前所在分支
git branch --show-current
4.3 查看当前状态
查看本地工作空间的状态
git status
查看关联的远程仓库信息
git remote -v
文件状态示例
“sample.txt”未被索引:
“lao.md”位于暂存区:
这里使用git status
可以看到lao.md
文件的状态为“to be committed”,所以目前是位于暂存区;
5. 常见命令说明
git branch -M main
将当前分支强制重命名为main,这里-M
代表--move --force
,表示如果main分支已经存在,则会覆盖掉原有的main分支(相当于删除了old-main分支)。
git add -u
将已跟踪文件的更新添加到暂存区,这包括已修改和已删除的文件,但不包括新文件(未被跟踪的文件)。
git commit -a
:= add + commit
也就是git add
与git commit
的组合。
git commit -am "comments_for_new_version"
-a
和-m
可以合在一起写。
git push -u origin main
:这里,“push -u”的意思是将本地分支合并到远程源origin-main分支,并将其记录为push远程分支的默认值;下次推送时命令可以简写成git push
。
git log
:用于显示日志中commits的历史信息。
git log --oneline
:这个命令会简化log的输出,仅仅输出commit hash 前7个字符串和commit message,
(图片引用自《git常用命令(二)查看历史记录 git log [–pretty=oneline] [ --oneline] / reflog》)
git log --pretty=oneline
:每条日志只显示一行,
(图片引用自《git常用命令(二)查看历史记录 git log [–pretty=oneline] [ --oneline] / reflog》)
6. 常用工具
6.1 GitHub CLI
GitHub CLI 相对于git命令的优点:
- GitHub CLI 提供了更便捷和高级的功能,可以简化一些在 Git 中较为复杂的操作
- GitHub CLI 集成了许多 GitHub 特有的操作,使得一些复杂操作变得简单。例如,创建拉取请求、管理 issues、查看仓库详情等操作,使用 GitHub CLI 可以在命令行中轻松完成,而不需要打开浏览器。
6.2 查看repo工程大小
如何在GitHub上下载单个文件代码,请使用浏览器插件 GitZip for github;
6.2 控制台v加速
打开v软件并连接,在托盘菜单中右键选中控制台代理;
7. Clone仓库:git clone
下载前查看clone项目repo的大小
可以安装Github-Repo-Size插件来进行查看;
下载仓库并重命名项目
git clone https_git new_folder_name
从指定分支clone代码
git clone -b branch-name https://github.com/repo.git
8. 账户设置
用户名称和邮箱
设置本地仓库用户名称
git config --global user.name "user_eric"
设置联系邮箱
git config --global user.email "user_eric@email.com"
查看本地用户信息
git config --global --list
终端认证:GitHub CLI
9. 设置远程仓库
添加远程仓库
git remote add origin https_github_com_remote_repo_git
例如:git remote add origin https://github.com/songyuc/mmdetv2-comments.git
删除远程仓库链接
git remote remove upstream_name
10. .gitignore
:指定不需要提交的文件
终端创建.gitignore
文件
touch .gitignore
关于.gitignore
的具体写作方法,请参考博文《为什么往 github 上上传文件缺失?》
11. 储藏当前修改:stash
stash
是Git中用来临时存储未完成工作的功能。git stash save
命令会将当前的工作现场(未提交的更改)保存到一个新的stash中,以便之后可以通过git stash apply
或git stash pop
来恢复这些未提交的更改。
储藏目前修改
git stash save
恢复工作现场
git stash pop
12. Git Submodule:Git子模块
Git子模块用来管理作为多个项目依赖的代码库;
添加子模块
git submodule add https://github.com/songyuc/simcv.git tools/simcv
4.8 多分支管理
显示所有分支
git branch
创建并切换新分支
git switch -c new_branch
在切换分支时使用新命令git switch
,替代git checkout。
创建新分支
git branch branch_name
切换到已有的分支
git switch existed_branch
拉取远程分支合并到本地分支
git pull origin branch_dev:local_dev
删除分支
git branch -d branch_name
Note
如果位于当前分支,删除自身分支失败,可以切换到其它分支后再进行删除。
5.9 删除repo
这是我们的repositories的界面,在这个界面中没有可以直接删除repo的选项,需要点击进入repo进行删除;
点击进入repo,然后点击Settings按钮,
5.10 Git add 提交更改
仅提交已经之前已被追踪文件(即 tracked file)的修改
git add -u
-u
指令不会处理未跟踪文件(untracked file)的修改。
5.11 设置GitHub访问密钥
在终端连接Github需要使用 access token 作为密钥,我们需要到Github官网[Github | Personal access tokens]上申请密钥;
5.12 GitHub编辑器
引用大段文字:<blockquote>
<blockquote>
第一行文字;
第二行文字;
...
多行文字。
</blockquote>
5.13 查询开源项目release版本号
根据 GitHub REST API 文档,最新版本Release的URL格式为:
/repos/{owner}/{repo}/releases/latest
JSON信息说明:
"tag_name"
:Release的版本信息。
使用python连接 Github API
这里我们需要使用PyGithub
库,关于PyGithub
的说明文档请参考[Introduction — PyGithub documentation];
使用PyGithub
连接Github需要使用 access token 作为密钥,我们需要到Github官网[Github | Personal access tokens]上申请密钥;
Note
Access token 也可以作为使用命令行连接GitHub的账户密钥。
对于获得公开仓库的内容,在申请时选择public_repo就可以获得足够权限;
获得release版本号
下面以获得YOLOv5项目为例,查询最新release的版本号:
from github import Github
# using an access token
g = Github("access_token")
repo = g.get_repo("ultralytics/yolov5")
repo.name
>>>'yolov5'
release = repo.get_latest_release()
release.title
>>>'v6.1 - TensorRT, TensorFlow Edge TPU and OpenVINO Export and Inference'
获得 release assets
GitReleaseAsset: PyGithub
中asset对象 。
release = repo.get_latest_release()
release.title
>>>'v6.1 - TensorRT, TensorFlow Edge TPU and OpenVINO Export and Inference'
# 遍历release的asset数组
for asset in release.get_assets():
print(asset.name)
5.14 检查哪一次代码提交引入了错误:git bisect
关于使用git bisect
定位出现错误的代码提交,请参考博文《git bisect 命令教程》
使用git bisect start
命令启动查错,其格式如下:
git bisect start 终点 起点
13. Git-Troubleshooting
(1)Git-pull失败:“From https://github.com/user/remote_repo; ! [rejected] remote_branch -> local_branch (non-fast-forward)”
出现这个问题的原因是本地分支和远程分支的代码出现了冲突不一致;
(2)Git-commit失败:“x 个文件已提交,n 个文件提交失败: Try commit detected dubious ownership in repository at ‘D:/local/my_repo’ To add an exception for this directory, …”
具体的报错信息如下:
0 个文件已提交,2 个文件提交失败: Try commit detected dubious ownership in repository at ‘D:/local/my_repo’ To add an exception for this directory, call: git config --global --add safe.directory D:/local/my_repo Set the environment variable GIT_TEST_DEBUG_UNSAFE_DIRECTORIES=true and run again for more information.
这可能是由于Windows的安全策略导致的,按照信息提示操作即可,
- 将本地repo目录添加到信任列表:
git config --global --add safe.directory D:/local/my_repo
- 启用 git_test_debug 模式:
set GIT_TEST_DEBUG_UNSAFE_DIRECTORIES=true
两个设置都是必需进行设置的。
(3)向GitHub上共享项目后有文件夹没有上传
今天在上传 Cuda_notes(检测GPU参数信息的项目)时,遇到的这个问题,在这个项目中,我们引用了 cuda-samples 的代码,然后我想通过GitHub把 Cuda_notes 移植到Win11系统上测试,在上传到GitHub时出现了这个问题:
在使用PyCharm的在 GitHub 上共享项目后,进入repo页面发现 cuda-samples 文件夹没有上传;
推测可能是由于 cuda-samples 之前是一个Git项目,于是标记为了git根目录,需要在IDE中去掉相关的标记信息;
相关的操作请参考博文《用ide去掉git信息 - git 无法add文件夹》
14. 常用浏览器插件
GitZip for github:下载特定文件夹
Note:
由于 Microsoft Edge 商店中的GitZip是2022年的1.0.1版本,测试了一下在新版的GitHub上无法使用,所以需要在Chrome应用商店中下载最新的版本。
15. PR
请参考博文《【GitHub】PR的学习笔记》
16. GitHub Support on PyCharm
GitHub账号验证:gh
GitHub-Troubleshooting
在GitHub上已经删除repo,不过重新创建repo时提示“Repository with selected name already exists”
出现这个问题的原因是,准备设置的远程仓库昵称new_name与已关联远程仓库的昵称重名,于是提示“already exists”;
解决方法可以参考博文《fatal: remote origin already exists. (远程来源已经存在 解决办法)》;
首先确认目前存在的仓库昵称,
git remote -v
看看目前已经使用的昵称有哪些;
一个可行的方法是:删除本地项目中的.git
文件夹。
17. 使用python自动化进行git操作
17.1 下载submodule代码
repo.submodule_update(init=True)
等价于操作:
git submodule init
git submodule update
18. 使用Sourcegraph在线浏览代码
Sourcegraph | 查询语句说明
Sourcegraph有三种搜索方式:literal (文本), regular expression, and structural.
6.1 代码搜索
基本查询的语句结构如图所示,
指定代码语言:lang:python
关于可以选择的语言可以查看左侧工具栏 DYNAMIC FILTERS :
4.2 使用 structural search 搜索函数调用
Sourcegraph提供了一个很棒的功能—— structural search,可以使用func(...)
/obj.method(...)
语句来匹配函数或方法的调用;