【学习笔记】git usage
之前没有使用过 github 的 repo,跟着 AI 做总是自闭,最近成功实现了一些功能,大概思考了一下其中的梗概一二,随手记录一下
【网络连接】
服务器上 ping github.com
正常运行了,不代表 git push 时进行网络连接能成功。
如果 git push 时网络连接失败,可以检查自己的 repo url 是 http 格式还是 ssh 格式,如果是 http 格式,那么可以尝试改成 ssh 格式,并按照下述操作通过 ssh 工具进行 git push:
想使用 ssh ,得先把本地的 id_rsa.pub 中的公钥放到 github 网站上。(存在一些手段使用命令行实现这件事情,但是我觉得用网页端也很简单。)
可以通过 ssh -T git@github.com
来进行检查。如果成功,那么会输出类似 Hi <username>....
的回复,是一个很好的检查方法。如果失败,可以看一下 .ssh 文件下的 config 中 github.com 这一个 Host 对应的一些信息,例如 post 是不是 22(AI 会告诉你可能可以改成 443,我的理解是哪个不行换另一个),
实现 ssh 连接后,需要把 remote repo 的 url 改成 ssh 格式的,ssh 格式的地址可以在网页端找到,使用 git remote set-url origin <address>
来改(这里有一个 origin 意义不明。一种可能的理解是,origin 可以理解成 <remote repo name>
变量,如果一个local directory 对应多个 remote repo,需要 push 到不同的地方,可以通过 git remote add <name> <URL>
来搞)
这样就把 remote repo address 改成了 ssh 格式的,为后面使用 ssh 工具进行文件传输奠定了基础。
【submodule 黑洞】
在 AI 的带领下,我在 project 的两个子目录里面执行了 git init
命令,给这两个文件夹包装成了 submodule。如果我们把这这两个子文件夹作为 root dir,也分别创建独立的 github repo sub1 sub2,那么在网页端当前 repo 的 sub1 sub2 会连接到对应的 github repo;可想而知,如果submodule 没有显式的 repo,那么你这俩 submodule 成了黑洞。
不想受 submodule 影响的最简单解决方案就是把 .git 文件删了。同时在 project 的根目录通过 git rm --cached eagle -f
删掉过去对 eagle 的理解,让它洗心革面,重新当 directory。
【.gitignore】
可以在当前 project 根目录下添加 .gitignore 文件。这个文件里面每一行可以输入一个 path,表示这个地址的文件不需要跟踪它的修改,在对全文件夹进行的git add .
时也会忽略它们(vscode 的文件追踪器也就不再追踪它的变化了)。支持使用 # 进行注释。
举一个例子,我进行了大量模型训练,在当前目录下保留了大量 checkpoint,这东西肯定没必要上传到 repo,于是 ignore 掉 checkpoint 文件夹即可。内容量庞大的语料库也类似
【branch switching】
配置好网络连接、登陆信息后,使用 git fetch
获得 remote repo 的最新结构情况。再用 git checkout <new branch name>
换就行了。
建议:养成好习惯,如果基于别人的 repo 做增量开发,先 fork,再建立一个新 branch,clone 下来新 branch 做迭代。可以减少命令行操作失误的损失。比如 git clone 下来是 main branch,想上传到 new_branch 这个分支上。如果你在 main branch 上已经改了一堆了,慌慌张张把 new_branch 上的东西 pull 下来,就全白瞎了。
【git push 时遇到 remote repo version far ahead】
在 push 时,原 repo 应当刮目相看了。命令行的建议时先 pull 再 push。pull 时有若干选项,第一个是 --rebase,也就是用 remote repo 把 local 替换掉;第二个是 --no-rebase,也就是忽略云端变化;另有一个是 --merge(重名文件的 merge 情况我不清楚)。
另有一个 --allow-unrelated-histories
的选项,在把一个full local directory push 到一个 empty remote repo 时是很有用的
【Unknown?】
-
master branch 是啥?
-
怎么 merge?比如原有 main branch code,现新开发 version 2.0,希望 main branch 变成 2.0 的 backup。