访问博客查看 本文 最新内容,排版更美观ヾ(•ω•`)o 如有错误欢迎指出~
Git 系列学习笔记:
接上文,本文介绍了 Git 基于 GitHub 的使用,以及合作开发的注意事项。文章的最后还留下了一些待填的坑...
本文大部分内容参考了 RCY 同学的教程,部分参考了 廖雪峰教程-Git,菜鸟教程-Git,以及 Git 官网文档 Git-Documentation。
GitHub 合作开发
以下内容也适用于不同的服务器平台,如 Gitee、GitLab 等。
新建远程仓库
从 GitHub 上创建一个空仓库后,通常有三个选择:
-
直接克隆到本地,会生成一个仓库文件夹,里面只有一个
.git
文件夹。可以在仓库文件夹中创作。 - 在本地新建一个同名文件夹,再创建本地仓库,添加远程仓库,推送并绑定上游分支。
- 对本地已有的一个仓库(确保同名),添加远程仓库,推送并绑定上游分支。
对于第一种方法,只需要 git clone
命令即可,对于第二种方法,GitHub 提供了一系列指引命令:
$ echo "# test" >> README.md
$ git init
$ git add README.md
$ git commit -m "first commit"
$ git branch -M main # 重命名本地主分支,避免冲突,新版本特性
$ git remote add origin https://github.com/hewei2001/test.git
$ git push -u origin main # 推送并绑定上游分支
对于第三种情况,只需完成后面三步即可。
.gitignore
在通过 GitHub 新建仓库时,我们会发现有个 Add .gitignore
按钮,这有什么用呢?实际上我们知道,维护真正项目时可能有一次修改会涉及到多个文件,这个时候一般大家会倾向于使用 git add .
的简单操作。
但是,并非所有文件都应该被放入 Git 仓库中,如:
- IDE / 编辑器 的配置文件(如 .vscode、.idea 等);
- 数据库文件;
- 带有敏感信息的文件。
这和便利的命令形成了矛盾,为此出现了特殊文件 .gitignore
,它可以决定哪些的文件不需要添加到版本管理中。一个样例如下:
# Python3 的缓存文件(预编译模块)
__pycache__
# Vscode 的配置文件
.vscode
# Pycharm 等Jet的配置文件
.idea
.gitignore
是以行为单位,一行写一个规则,决定什么不被添加,书写规则也很简单:
- 若规则不包含
/
,会对.gitignore
同路径下的文件和文件夹进行屏蔽; - 若规则以
/
结束,则只匹配在该文件夹路径下的内容; - 若规则以
/
开始,则会从项目根目录开始匹配; -
!
开头的模式标识否定,该文件将会再次被包含,通常用于在屏蔽的文件中添加特例; - 支持
* ? []
在内的通配符。 - 不能识别中文,因为默认编码是 GBK。
创建一个 .gitignore
文件最便捷的方法是,在创建仓库时勾选 GitHub 自动创建,并在选项中选择合适的 .gitignore
文件模板,再克隆到本地。当然,也可以选择手动创建,再到网上搜索配置模板。
在实际工程中,用 GitHub 创建仓库还可以便捷地添加合适的 LICENSE 文件。
远程服务器拒绝
如果你是在一个大合作团队中工作,很可能是 main 被锁定了(只有 Collaborators 有权限推送),其他人需要 Pull Request 流程来合并修改。
如果你直接提交到本地 main,然后试图推送修改,你将会收到这样类似的信息:
! [远程服务器拒绝] main -> main (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)
这里推荐一个做法:Fork 最新的仓库,此时你将拥有这个远程仓库的从分支——你的用户名就是从分支名。再将你的修改提交到这条分支,最后通过 GitHub 网站来提交一个 PR,请求主分支拉取并合并你的从分支。
当然,如果只是几个人的小开发团队,还是建议在仓库的
Settings
界面找到Collaborators
,直接添加队友来得方便。
高端的 Git
高端的操作往往意味着危险的操作,以下将介绍前文未提及的一些操作,同时也挖下一些坑以后来填。
版本回退 (Reset)
有时候你可能希望放弃 Git 仓库中的一部分提交,退到其他某处,这种情况下可以:
$ git reset <Commit ID or Branch> # 让 Git 仓库回退到某个记录或分支位置
$ git reset <Commit Id or Branch> --hard # 让所有区回退到某个记录或分支位置(将丢失你工作区和暂存区的数据)
这种情况下可以带着分支一起回退,然后重新 commit,走一条完全不同的道路,而放弃了部分数据。
但是,如果你 reset 完后又后悔了,该怎么办?没关系,只要你没玩 gc 这样的危险指令,那么你 Git 仓库中的数据总有机会找回来。
$ git reflog # 查看最近一些变动快照的操作与版本号
在看到后面的快照的版本号后,则可以 reset 回去。
Cherry-Pick
一个相对高端的分支管理命令,将一些提交复制到当前所在的位置(HEAD)下面,这些提交可以来自其他分支,但不一定是顺序的!
$ git cherry-pick <Commit ID>
Stash
用于将目前暂存区的东西移入一片额外空间,从而清空暂存区。
获取帮助
无论是本博客,还是网上的文档,甚至官方的教程,都未必能把每个指令的每个参数、用法提到,因此 Git 自带的帮助文档就很重要:
$ git add --help
$ git help add
# 以上两个指令的效果等价,都会