先上一个鄙人画的美人~
1 git 基础操作流程
git init :创建工作目录,对工作目录进行修改
git add ./ :进入暂存区,创建一个就进入一次暂存区(index)
即:
git hash-object -w 文件名(修改了多少个工作目录中的文件,此命令就要被执行多少次)
git update-index ...
git commit -m "注释内容"
即:
git write tree
git commit-tree
工作目录中状态: 未跟踪、已跟踪;
已跟踪包含三种状态:已暂存(绿色)、已修改(红色)、已提交(正常)
git ls-files -s 查看暂存区
2 git高层命令 CRUD
get init 初始化仓库
git status 查看文件状态
git diff 查看哪些更新还未暂存
git diff --staged 查看哪些更新还未修改
git log --oneline 查看提交的历史记录
git add ./ 将修改添加到暂存区,跟踪到一个新文件
git rm 文件名 删除工作目录中的文件,再将修改添加到暂存区
git mv 原文件名 新文件名 重命名,再将修改添加到暂存区,再将修改添加到暂存区
git commit
git commit -a
git commit -m "注释内容" 将暂存区提交到版本库
git commit -a -m "注释内容" 跳过暂存区提交到版本库
3 git 分支操作(killer skill)
git分支本质是一个提交对象,分支会被HEAD使用(HEAD一个时刻只会指向一个分支)。它指向最新操作的指针。
git branch 分支名创建分支
git branch 分支名 commitHash 版本传送(时光机)
git checkout 分支名切换分支
git checkout -b 分支名 创建并切换分支,
git branch -d 分支名(要先切会主分支)普通删除分支
git branch -D 分支名(要先切会主分支)强制删除分支
合并分支
git mergin 分支名
-
快速合并(不会产生冲突)
-
典型合并(有机会产生冲突)
-
解决冲突:打开冲突文件 > 进行修改 > add > commit
git branch 查看分支
git branch --merged查看合并到当前分支的分支列表
(一旦出现在这个列表中就应该删除)
git branch --no-merged查看没有合并到当前分支的分支列表
(一旦出现在这个列表中就应该观察一下是否需要合并)
切换分支的注意点
最佳实践:每次切换分支前,git status ,一定要干干净净的。
坑:每次切换分支前,有(初始化的)未暂存的修改 or 有(初始化的)未提交的暂存,分支可以切换,但可能会污染其他分支。
切换分支要动三个地方: HEAD, 暂存区, 工作目录
分支模式
git分支本质是 指向提交对象的可变指针(head)
主分支不要动
长期分支(develop),特性分支(topic) 写完一个功能,合并一个
4 git 存储
git stash 工作还未完成,保存到栈顶(后进先出)
git stash list 查看储存
git stash apply 应用栈顶
git stash drop 删除栈顶
git stash pop 应用并删除栈顶
5 git 后悔药
- 工作区
撤回工作目录中的修改
git checkout --文件名 - 暂存区
撤回自己的暂存
git reset HEAD 文件名 - 版本库
撤回自己的提交,改注释
git commit --amend
6 reset 三部曲(撤回的原理)
-
git reset --soft commitHash
用commitHash重置HEAD,但文件内容不变(带着分支一起动)
撤销上一次 git commit 命令,类似与git commit --amend
-
git reset [--mixed] commitHash用commitHash重置HEAD,和暂存区
-
git - commitHash
用commitHash重置HEAD,暂存区,和工作目录
类似git checkout,
路径reset
git reset [--mixed] commitHash filename
reset 将跳过第一步,用commitHash中filename的内容 重置 暂存区
-
第一步是重置HEAD内容,HEAD的本质是指向一个分支,分支的本质是一个提交对象
-
提交对象是指向一个树对象,树对象又可能指向多个git对象;一个git对象代表一个文件
-
HEAD可以代表一系列文件的状态!!!
checkout 深入了解
git checkout 分支名与 git reset --hard commithash
-
共同点
都需要重置: HEAD 、暂存区 、工作目录
-
区别 -1 checkout只动HEAD ,reset --hard动HEAD并且带着分支一起走
-2 checkout 对工作目录是安全的,reset --hard是强制覆盖工作目录
checkout + 路径
git checkout commitHash 文件名 重置暂存区和工作目录
git checkout -- 文件名 重置工作目录
6 git配别名- 快捷命令
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git config --global alias.st status
git config --global alias.cm "commit -m"
git config --global alias.cma "commit -a -m"
git config --global alias.ad "add ./"
git config --global alias.dfs "diff --staged"
git config --global alias.ch "checkout"
git config --global alias.cb "checkout -b"
git config --global alias.b branch
7 Eslint + git + hushy
- 新建文件夹Eslintdemo
npm init -y初始化npm i eslint -Dornpm i eslist --save -dev安装Eslint- 使用ESlint:生成配置文件
npx eslist --init; 检查js文件npx eslint 目录名 - 更改package.json,加eslint规则
{
"name": "Eslintdemo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1",
"lint": "eslint ./src",//加eslint规则
"lint:create": "eslint --init"//加eslint规则
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"eslint": "^7.32.0",
"eslint-config-standard": "^16.0.3",
"eslint-plugin-import": "^2.24.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.1.0"
}
}
- 新建src文件,加index.js index.js >>
console.log('a')
git init初始化gitnpm i husky --save-dev加husky,husky为esllint设置钩子程序,- 修改package.json
{
"name": "Eslintdemo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1",
"lint": "eslint ./src",
"lint:create": "eslint --init"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"eslint": "^7.32.0",
"eslint-config-standard": "^16.0.3",
"eslint-plugin-import": "^2.24.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.1.0",
"husky": "^7.0.1"
},
"hushy": {
"hooks": {
"pre-commit": "npm run lint"
//在git commit 之前一定要通过npm run lint检查一下
//只有npm run lint 不报错时,commit才能运行,本质是钩子函数
}
}
}
git status查看git状态git ./add添加- 新建文件 .gitignore,让eslint检查时忽略node_modules里的文件
/node_modules
git commit -m '1 commit'提交git status
8 远程仓库repository|
远程跟踪分支
远程分支
团队协作(基本操作)
- 1 项目经理初始化远程仓库 一定要初始化一个空的仓库,在github上操作
- 2 项目经理创建本地仓库
- git remote 别名 仓库地址(https)
- git init
- 将源码复制进来
- 修改用户名,邮箱
- git add
- git commit
- 3 项目经理推送本地仓库到远程仓库
- 清理window凭据(mac木有??)
- git push 别名 分支 (输入用户名 和 token,推完会附带生成远程跟踪分支)
- 4 项目邀请成员 & 成员接受邀请
- 在github 上操作
- 5 成员克隆远程仓库
- git clone 仓库地址(在本地生成。git文件, 默认为远程仓库配了别名 orgin)
- 6 成员做出贡献
- 修改源码文件
- git add
- git commit
- git push 分支 (输入用户名 和 token,推完会附带生成远程跟踪分支)
- 7 项目经理更新修改(可以直接用
git pull)- git fench 别名 (修改同步到远程跟踪分支上)
- git merge 远程跟踪分支