应粉丝要求,总结一期github的使用教程。
以下所有概念做此假设: A在github仓库开源了一个项目,B使用A的项目
1. 基本概念
- github平台: 旨在依托平台托管项目
- Respository: 一个项目对应一个Respository(仓库)
- Star: 收藏
- fork : 从A的仓库拉取项目到B的仓库,会显示该项目来自A
- Pull Request: B的项目中对A的项目作了更改,想同步到A,向A请求
- Watch : 关注项目,项目有更新会提示你
- Issue: 发现代码bug提出问题的地方,你可以根据issue去改进自己的项目
2. 首次上传
2.1 考虑tag的情况
0为必做项,1-8为主要流程,其他为辅助功能。默认读者已经已经在网站里新建了一个空项目(仓库),很简单Create a new respository,要输入Respository(即仓库或项目名),Description(描述一下仓库), 可选Public和private(私有,指定人员能见,收费的), 初始化一个readme。
2.1.1.设置本地的用户名和邮箱
告诉远程,这个文件是谁提交的。
git config --global user.name "输入你的用户名"
git config --global user.email "输入你的邮箱"
例如
git config --global user.name "zhangsan"
git config --global user.email "zhangsn@123.com"
2.1.2.查看本地的用户名和邮箱
$ git config user.name
qinsot(本地用户名)
$ git config user.email
xxx@163.com(本地邮箱)
也可以如下代码全部查看
git config --list
2.1.3. 初始化空的仓库
在想上传的文件夹下打开终端,输入
git init
2.1.4.添加想要上传的文件
这里我选择全部文件,也可以提交单个
git add .
查看本地提交状态
git status
得到结果如下:
$ git status
位于分支 master
尚无提交
要提交的变更:
(使用 "git rm --cached <文件>..." 以取消暂存)
新文件: .catkin_workspace
新文件: .vscode/c_cpp_properties.json
新文件: .vscode/settings.json
新文件: build/.built_by
新文件: build/CATKIN_IGNORE
新文件: build/CMakeCache.txt
新文件: build/CMakeFiles/3.10.2/CMakeCCompiler.cmake
新文件: build/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake
......
2.1.5.提交文件
-m后边接任意字符,(建议添加,否则可能后续报错)
git commit -m "first commit"
至此,我们已经在本地完成了仓库的配置,下一步就是提交到远程。
2.1.6.添加origin
最后的网址就是自己clone的那个git网址。
git remote add origin https://github.comxxx.git
2.1.7.添加版本tag
为了便于后期的版本追溯,特地使用tag功能.本次版本设置为1.0
git tag -a 1.0 -m "1.0"
2.1.8.上传文件
master是分支名称,也可是main等,在tag标签的隔壁,可自定义
git push -u origin master 1.0
2.1.9.登陆github创建token
输入6的代码后,看到如下:
$ git push -u origin master
Username for 'https://github.com': Qin-sor
Password for 'https://Qin-sor@github.com':
这一步在8.13更新后,会出现错误,原因如下:
这里的用户名还是我们的username ,但是这里的密码在8月13的改动下,就成了我们需要自己生成的一个token.
登陆github官网操作如下:
1,打开设置
2,选择左侧开发者设置(developer settings)
3.点击左侧个人令牌(personal access tokens),再点击右侧新建令牌(generate new token)
4. 对令牌的设置,note标签,可用时间这里我选择30天,下方的几个可选项我选择(repo)可以通过命令行增加,(de可以通过命令行删除)。
5. 点击生产后,界面如下:复制我们绿色框里的token。
2.1.10. 上传文件后续
拿到token后,填入password一栏即可传输,效果如下:
$ git push -u origin master
Username for 'https://github.com': Qin-sor
Password for 'https://Qin-sor@github.com':
对象计数中: 547, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (492/492), 完成.
写入对象中: 100% (547/547), 712.56 KiB | 3.49 MiB/s, 完成.
Total 547 (delta 264), reused 0 (delta 0)
remote: Resolving deltas: 100% (264/264), done.
To https://github.com/Qin-sor/my_test.git
* [new branch] master -> master
分支 'master' 设置为跟踪来自 'origin' 的远程分支 'master'。
此时在我们的github中就有了我们的代码。
至此,仓库master/tag==1.0下,就有了我们的工程
2.2 不考虑tag,只维护一个工程,没有版本迭代
2.2.1 开始
开始操作同2.1.1–2.1.6,不赘述
2.2.2 上传
不加版本控制直接上传,如下代码:master是分支
git push origin master
结束
3. 非首次上传
3.1 更新到不同tag情况
3.1 提交至一个新tag下
- 假如文件作了更改,要提交到tag 2.0下,如下操作即可,
git add .
git commit -m "写什么都行,最好注释"
git tag -a 2.0 -m "2.0 version"
新建一个2.0的taggit push -u origin master 2.0
提交代码到master/2.0
3.2 更新存在的tag工程
方法一:容易上手
- 采用强制推送的方式,假如我的tag为2.0已经存在,master/2.0上提交新的代码覆盖/更新,如下操作:
git add .
git commit -m "写什么都行"
- 确保自己本地位于master分支下,用
git branch
,看到在master 路径下接着操作,如果不在就切换到master分支git checkout master
- 然后,
git tag -f 2.0
命令来更新2.0 tag。这个命令会将2.0 tag指向第二步的commit, - 最后,使用
git push --tags --force
命令来强制推送更新的tag到远程仓库
至此,github上的tag2.0项目已经更新,但是这个操作可能会影响其他人的代码,因此需要谨慎操作,最好提前通知其他人。
方法二:推荐,安全(NOT)
- 采用先远程删除一个tag(不影响其他tag),然后再操作,因为本来就是要被更新掉的嘛。
- 仍然假设我的tag为2.0已经存在,master/2.0上提交新的代码覆盖/更新,如下操作:
- 首先,切换到 tag 2.0 所在的 commit
git checkout 2.0
- 确保代码修改后执行
git add .
和git commit -m "更新代码到 tag 2.0"
- 删除远程仓库的 tag 2.0,
git push origin :refs/tags/2.0
- 重新打 tag 并推送到远程仓库
git tag -fa 2.0 -m "更新代码到 tag 2.0"
和git push origin 2.0 -f
- 注意,这里使用了 -f 参数,表示强制推送 tag。因为你要覆盖已有的 tag,所以必须使用强制推送。
- 如果其他人已经从远程仓库拉取了 tag 1.0,你修改后再强制推送,其他人拉取代码时可能会出现问题,因为他们的本地仓库中的 tag 1.0 已经与远程仓库的不一致。因此,如果涉及到团队协作,建议与团队成员协商好再进行操作。
3.2 更新到不需要tag(版本控制)的情况
-
首先,在本地仓库中使用git add命令将更改的文件添加到暂存区:
git add <file-name>
例如所有git add . -
然后,使用git commit命令将更改的文件提交到本地仓库:
git commit -m "commit message"
其中,commit message是你对此次更改的描述。 -
最后,使用git push命令将本地仓库中的更改推送到服务器上的仓库中:
git push
- 如果你之前使用过git push命令,并且已经将本地仓库和服务器上的仓库关联起来了,那么这个命令会自动将更改推送到服务器上的对应分支。
- 如果你没有关联过仓库,你需要使用以下命令将本地仓库和服务器上的仓库关联起来:
git remote add origin <server>
其中,server是服务器上的仓库地址。其实就是例2.1.6
可能出错情况:执行git push
报错如下:
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
- 这个错误提示说明你的本地 master 分支没有设置上游分支,也就是和远程仓库中的哪个分支进行追踪和同步。
- 解决这个问题,可以按照错误提示中的建议,使用
git push --set-upstream origin master
命令,将本地的 master 分支推送到远程仓库,并将其设置为上游分支,这样就可以直接使用 git push 命令提交本地修改到远程 master 分支了
问题2:报错如下:
error: RPC failed; HTTP 408 curl 22 The requested URL returned error: 408
fatal: the remote end hung up unexpectedly
可能是由于代理服务器不稳定,更多的原因是单个文件大于100M(github的要求),运行指令:
git config --global http.postBuffer 524288000
提升单个文件为500M。
最推荐的方式是站外缓存,最好还是LFS缓存的形式,如下:
git lfs install
安装完成后,你可以使用以下命令将这些大文件加入Git LFS追踪:
git lfs track "work/weights/*.pdparams"
此后,将这些文件提交到GitHub时,它们会被Git LFS处理。
请注意,上传到Git LFS的文件不计入GitHub的存储限制。单个文件大于50M就建议使用LFS了。