开源计划——git的学习笔记(GitHub)

1. 参考资料 & 工具书

《熟悉 GitHub/Git(建设中) - OpenMMLab 贡献者成长体系教程》

2. Git工作流

开源计划——git的学习笔记(GitHub)_第1张图片
——Git工作流示意图来自《Git工作流和核心原理 | GitHub基本操作 | VS Code里使用Git和关联GitHub》
开源计划——git的学习笔记(GitHub)_第2张图片
——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命令

  1. git init:在当前目录中初始化一个新的 Git 仓库。
  2. git clone :克隆一个仓库到新的目录。

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

3.3 查看当前状态

查看本地工作空间的状态

git status

查看关联的远程仓库信息

git remote -v

文件状态示例

“sample.txt”未被索引:
开源计划——git的学习笔记(GitHub)_第3张图片

“lao.md”位于暂存区:
开源计划——git的学习笔记(GitHub)_第4张图片
这里使用git status可以看到lao.md文件的状态为“to be committed”,所以目前是位于暂存区

5. 常见命令说明

git branch -M main

将当前分支强制重命名为main,这里-M代表--move --force,表示如果main分支已经存在,则会覆盖掉原有的main分支(相当于删除了old-main分支)。

git commit -a:= add + commit

也就是git addgit 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的学习笔记(GitHub)_第5张图片
(图片引用自《git常用命令(二)查看历史记录 git log [–pretty=oneline] [ --oneline] / reflog》)
git log --pretty=oneline:每条日志只显示一行,
开源计划——git的学习笔记(GitHub)_第6张图片
(图片引用自《git常用命令(二)查看历史记录 git log [–pretty=oneline] [ --oneline] / reflog》)

6. 常用工具

6.1 查看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 "[email protected]" 

查看本地用户信息

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 applygit 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 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

开源计划——git的学习笔记(GitHub)_第7张图片
这是我们的repositories的界面,在这个界面中没有可以直接删除repo的选项,需要点击进入repo进行删除;
点击进入repo,然后点击Settings按钮,
开源计划——git的学习笔记(GitHub)_第8张图片

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>

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 终点 起点

6 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的安全策略导致的,按照信息提示操作即可,

  1. 将本地repo目录添加到信任列表:

    git config --global --add safe.directory D:/local/my_repo

  2. 启用 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文件夹》

7 常用浏览器插件

GitZip for github:下载特定文件夹

Note:
由于 Microsoft Edge 商店中的GitZip是2022年的1.0.1版本,测试了一下在新版的GitHub上无法使用,所以需要在Chrome应用商店中下载最新的版本。

8 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文件夹。

8 使用Sourcegraph在线浏览代码

Sourcegraph | 查询语句说明
Sourcegraph有三种搜索方式:literal (文本), regular expression, and structural.

6.1 代码搜索

基本查询的语句结构如图所示,
开源计划——git的学习笔记(GitHub)_第9张图片

指定代码语言:lang:python

关于可以选择的语言可以查看左侧工具栏 DYNAMIC FILTERS :
开源计划——git的学习笔记(GitHub)_第10张图片

4.2 使用 structural search 搜索函数调用

Sourcegraph提供了一个很棒的功能—— structural search,可以使用func(...)/obj.method(...)语句来匹配函数或方法的调用;

你可能感兴趣的:(开源计划,git,GitHub)