git神秘又熟悉,每次提起都说不会,那么要在什么时候才能拍着胸脯说我会呢?我想就是今天吧!
干瘪瘪得去学效果肯定是不好的,套进具体的开发场景,强制自己用它来管理熟能生巧
【特别好的Ref】初步上手 建立概念体系⭐️ B站 - Git工作流和核心原理 | GitHub基本操作 | VS Code里使用Git和关联GitHub
Reference: ①MIT缺失的一课 - Git - 本身有讲座做讲解,逻辑上自底向上,更合适初步接触;其余介绍都是自顶向下 - 出自接触则记不住,其中资源衍生也非常多,妙极了!妙在既可以整体看一遍就完事,也可以深入看; ②B站-清华自动化协会分享Git - 关于手搓网站的系列培训,1h,整体过一遍 ③Git Pro 深入学习,起到字典的作用;④游戏 - 练习Git相关知识的小网站可视化展示git的过程。
- workspace/unstage工作区,当前存放项目代码的地方
- Index/Stage暂存区,用于临时存放改动,保存即将提交的文件列表信息。
- Repository仓库区,存放数据的位置,这里面有你提交到所有版本的数据。
- 其中HEAD指向最新放入仓库的版本
- Remote远程仓库,托管代码的远程服务器
- Git安装配置 - 查看配置信息
git config --list - Git的逻辑:提交是不可改变的。实际上不存在覆盖,只有新建版本 - 树形管理;
- 但并不是错误不能修改 ,而是修改实际上成了全新的提交
- 所以他是一款版本控制系统
发现这里记笔记的思路有错误,不应该做成百科全书,要快查的话网上有资源
git命令都对应着对提交树的操作,例如增加对象,增加或删除引用- s所以进行一切操作的逻辑和底层思想:思考这个操作对(树形的)数据结构会产生什么影响
| 指令 | 功能 |
|---|---|
git status |
查看仓库状态 |
git log |
git commit后查看历史提交记录$^1$ |
git diff (--cached) |
比较1-工作区与2-暂存区,(暂存区与上一次的commit),还可以比较两个分支差异 |
| 指令 | 功能 |
|---|---|
git init |
初始化仓库(把这个文件夹变成可以git操作的东西 |
git add <filename> |
把文件从1-工作区添加到2-暂存区 |
git rm ( --cached) <filename> |
把文件从1/2删除,(只从暂存区删除) |
git commit -m <message> |
提交信息到3-仓库(备注) |
对于git的版本控制来说,仓库里的才是正式的东西
git commit了以后 ,才产生了新的版本git branch更多只是在工作区自行做了不同位置的修改而已
- 备注不知道版本号:git log就知道
- 版本号一长串实际上是个哈希值,只需要给出前7位就可以
| 指令 | 功能 |
|---|---|
git reset HEAD^ |
回退到上一个版本,(^表示相对引用,~也是) |
git reset --mixed <version> |
回退,修改内容进工作区 |
git reset --soft <version> |
回退,修改内容进暂存区 |
git reset --hard <version> |
彻底回退,修改内容清除 |
- 注意相对引用 前面的名字必须是 HEAD或者
实现版本控制的关键
创建分支实际上是对现有分支的一个拷贝
| 指令 | 功能 |
|---|---|
git branch <branchname> |
创建分支 |
git branch -v |
查看所有分支(更改版本) |
git branch -d <branchname> |
删除分支 ;如果非常得确定要删除 就是git branch -D |
git branch -m <old-name> <new-name> |
分支改名 |
git checkout <branchname> |
切换分支 |
git checkout -b <branchname> |
(从当前分支)创建新分支并切换过去 |
git merge <branchname> |
分支合并---这个分支是别的分支名,合并到当前分支 --- 合并以后产生了一个新的版本;如果产生 分支冲突(两个分支对同一内容做了修改) |
Git 2.23以后 可以使用
git switch代替git checkout
还有一种合并分支的方法:git rebase ,使 得到更线性的提交记录;注意这里的branch是将要rebase到的那个分支名
更直白的说:和github的联动;gitee一般不做考虑
-
绑定远程仓库
git remote add/rm/-v -
拉取 远程仓库 git clone / fetch / pull(fetch + merge) --- 是与远程仓库通信的方式
- clone:在别人的基础上开始干(带有.git文件);自己有仓库就不要clone
- fetch:拉取但不(和本地的)合并,自己merge就可以合并
- 因为网上的代码可能有问题,所以不着急合并
- 从远程仓库下载本地仓库中缺失的提交记录,但不改本地的文件
-
推送 到远程仓库
git push origin <远程的branch>注: 2023.01以后不能再简单使用账号密码push,而是应该用tokens
- 从本地的仓库推送到远端的仓库
- remote绑定后,本地和远端github互认 则可以推上去自己的;别人的不能随便推上去
- 推到别人的 PR:
pull request向别人申请拉取自己的代码
-
对远程的操作中
git clone / git fetch /git pull出现一些如下的 fatalLibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443 Failure when receiving data from the peer一般都是代理造成的;禁用可以解决问题
git config --global --unset http.proxy git config --global --unset https.proxy
- Github 上的issue 一般作为一个评论区,也有很多时候是blog等,BBS?
- 设置文件的忽略规则,减少提交不必要的文件 ---这部分文件就不提交
- 创建文件 .gitignore 并写入
- 文件名 - 重名文件就直接指明目录
- 支持正则化表达:...通配符- 反向操作
touch .gitignore
# 里面输入不需要提交的 文件名
# 通过 vim .gitignore 来写,其中的文件 git status就看不见了